c中的数组和字符串

时间:2015-08-07 19:19:34

标签: c arrays pointers

我希望通过" "分解字符串序列并将其粘贴到数组中。这是我的代码,但不起作用:

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"等等。任何帮助将不胜感激,我已经搜索了答案并阅读了教程,但仍然无法得出正确的答案。任何帮助将不胜感激。谢谢!

1 个答案:

答案 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;
}

Demo.

如果您确定不会对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;
}