[英]Combining Strings into a List in C
以下是我的以下问题的代码。 我正在尝试使用逗号分隔的一串名字和姓氏字符串,并将它们转换为全名列表。 例如,如果firstnames = "John,Jane"
和lastnames = "Smith,Doe"
,则输出应为["John Smith", "Jane Doe"]
。
我相信我的问题出现在我使用strtok
因为first_names[i] = name
给了我一个错误。 任何有关这方面的帮助将非常感谢!
char **combine_names(char *firstnames, char *lastnames) {
char first_names[50][50];
char last_names[50][50];
int i = 0;
char *name = strtok(firstnames, ",");
while (name != NULL) {
first_names[i] = name;
i++;
name = strtok(NULL, ",");
}
i = 0;
name = strtok(lastnames, ",");
while (name != NULL) {
last_names[i] = name;
i++;
name = strtok(NULL, ",");
}
char **names;
names = malloc(strlen(first_names) * sizeof(char*));
for (int i = 0; i < strlen(first_names); i++) {
names[i] = malloc(51 * sizeof(char));
}
int i = 0;
int j = 0;
int k = 0;
while (first_names[i] != '\0') {
while (first_names[i][j] != '\0') {
names[i][j] = first_names[i][j];
j++;
}
names[i][j] = ' ';
j++;
while (second_names[i][k] != '\0') {
names[i][j] = second_names[i][k];
j++;
k++;
}
names[i][j] = '\0';
i++;
}
names[i] = '\0';
return names;
}
以下行导致第一个参数出现不兼容的指针错误。 这是为什么?
names = malloc(strlen(first_names) * sizeof(char*));
使用strtok()
确实会带来一些问题,但主要问题是你使用无效的表达式malloc(strlen(first_names) * sizeof(char*));
分配names
malloc(strlen(first_names) * sizeof(char*));
。 first_names
不是C字符串, strlen(first_names)
不计算first_names
数组中的条目数。
这是一种更简单,更安全的方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **combine_names(const char *firstnames, const char *lastnames) {
int n = 0;
char **names = malloc(sizeof(*names) * (n + 1));
char *p;
if (names == NULL) {
perror("cannot allocate memory\n");
}
while (*firstnames && *lastnames) {
int len1 = strcspn(firstnames, ",");
int len2 = strcspn(lastnames, ",");
int size = len1 + 1 + len2 + 1;
p = malloc(size);
if (p == NULL) {
perror("cannot allocate memory\n");
}
snprintf(p, size, "%.*s%s%.*s",
len1, firstnames,
len1 && len2 ? " " : "",
len2, lastnames);
names = realloc(names, sizeof(*names) * (n + 2));
if (names == NULL) {
perror("cannot allocate memory\n");
}
names[n++] = p;
firstnames += len1 + (firstnames[len1] == ',');
lastnames += len2 + (lastnames[len2] == ',');
}
names[n] = NULL;
return names;
}
请记住, first_names
是一个双字符数组。 这意味着first_names[i]
实际上是一个字符串或一个字符数组。 您不能直接分配给字符数组,而是必须逐个字符地写入数组。 最简单的方法是使用字符串复制或strcpy(first_names[i], name)
,但strcpy不能防止缓冲区溢出。 一种方法是使用strncpy
,只是要小心,因为当源字符串超过目标字符串的大小时,这不能保证字符串以空值终止。 要解决此问题,请使用
strncpy(first_names[i], name, 50);
first_names[i][49] = '\0';
考虑到strncpy
的缺点,最好使用类似于@chqrlie的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.