在C不同的变量中拆分字符串

时间:2017-02-18 23:00:03

标签: c strtok strcpy

我有一个字符串:

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, " ");
    }
}

第一个循环工作正常,但第二个循环引发了分段错误。

2 个答案:

答案 0 :(得分:2)

首先,您将animalsfoodnumbers视为字符串数组,但您将它们声明为字符数组。您需要将它们声明为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++;
}