我希望通过" "
分解字符串序列并将其粘贴到数组中。这是我的代码,但不起作用:
int main(void) {
char s[] = "this is a string";
char* x = NULL;
unsigned int i = 0;
for (char *p = strtok(s," "); p != NULL; p = strtok(NULL, " ")) {
x[i] = *p;
puts(x[i]);
i++;
}
return 0;
}
它给出了以下错误:错误:
数组初始化程序必须是初始化列表
我对如何在C中完成此操作感到茫然。所以我想x[0] = "this"
,
x[1] = "is"
等等。任何帮助将不胜感激,我已经搜索了答案并阅读了教程,但仍然无法得出正确的答案。任何帮助将不胜感激。谢谢!
答案 0 :(得分:6)
您的代码存在两个问题:
realloc
动态分配,或者预先分配足够的空间,并使用其中的一部分,则无法在C中实现这一点。strtok
的结果以供将来使用。通常,这不安全,因为标记指向原始字符串。将每个令牌复制到单独的空间会更安全。以下是使用预先分配的100个令牌空间看代码的方式:
int main(void) {
char s[] = "this is a string";
char* x[100];
unsigned int i = 0;
for (char *p = strtok(s," "); i != 100 && p != NULL; p = strtok(NULL, " ")) {
x[i] = malloc(strlen(p)+1);
strcpy(x[i], p);
puts(x[i]);
i++;
}
// Now you need to free the strings
for (unsigned int j = 0 ; j != i ; j++) {
free(x[j]);
}
return 0;
}
如果您确定不会对s
进行任何修改,您也可以直接存储令牌:
int main(void) {
char s[] = "this is a string";
char* x[100];
unsigned int i = 0;
for (char *p = strtok(s," "); i != 100 && p != NULL; p = strtok(NULL, " ")) {
x[i] = p;
puts(x[i]);
i++;
}
return 0;
}