我有一个字符串:
char string = " dog beans 1234 cat rice 0123 bird peanut 7777"
我想把它分成不同的变量,如:
char animals[1000], food[1000], numbers[1000];
到目前为止我做了什么:
int i;
while (string != NULL) {
for (i = 0, i < 1000, i++) {
strcpy(animals[i], strtok(string, " ");
strcpy(food[i], strtok(string, " ");
strcpy(numbers[i], strtok(string, " ");
}
}
第一个循环工作正常,但第二个循环引发了分段错误。
答案 0 :(得分:2)
首先,您将animals
,food
和numbers
视为字符串数组,但您将它们声明为字符数组。您需要将它们声明为char
数组的数组或char
指针的数组,在这种情况下,您需要使用malloc
分配字符串。
char animals[100][20];
char food[100][20];
char numbers[100][20];
其次,当您使用相同的非null初始参数调用strtok
时,您将获得相同的值。您需要在初始调用后的所有调用中传递NULL
:
strcpy(animals[i], strtok(string, " "));
strcpy(food[i], strtok(NULL, " "));
strcpy(numbers[i], strtok(NULL, " "));
答案 1 :(得分:0)
首先,当您阅读最多1000个动物名称时,您需要1000
animal[99]
元素(假设单个动物名称的最大长度为99)而不是&#34;一个动物名称大小为1000的所有&#34;。
其次,您的strtok
将始终从初始字符串开始,始终产生相同的值dog
。仅对第一次通话使用string
,对所有其他通话使用NULL
。
进一步注意,strtok
如果无法提取另一个令牌,则会返回NULL
;这也可能发生在循环中,例如,strcpy(food[i], strtok(...))
可能会崩溃。因此,我建议在进一步使用之前检查strtok
的返回值:
char animals[1000][99];
char food[1000][99];
char numbers[1000][99];
int i=0;
char *token = strtok(string, " ");
while (i < 1000 && token)
strcpy (animals[i], token);
token = strtok(NULL, " ");
if (!token)
break;
strcpy (food[i], token);
token = strtok(NULL, " ");
if (!token)
break;
strcpy (numbers[i], token);
token = strtok(NULL, " ");
i++;
}