分解字符串并将其存储在数组中

我想分解一个句子并将每个字符串存储在一个数组中。 这是我的代码:

#include  #include  int main(void) { int i = 0; char* strArray[40]; char* writablestring= "The C Programming Language"; char *token = strtok(writablestring, " "); while(token != NULL) { strcpy(strArray[i], token); printf("[%s]\n", token); token = strtok(NULL, " "); i++; } return 0; } 

它一直给我分段错误,我无法弄明白。 我相信当我将令牌复制到我的arrays时,它有一些事情要做。

这是因为writablestring根本不可写。 尝试写入字符串文字是未定义的行为, strtok写入它 (这是正确的, strtok修改其参数)。

要使其工作,请尝试:

 char writablestring[] = "The C Programming Language"; 

还有一个C FAQ 。

另一个问题是你没有为你的字符指针数组分配内存(所以那些指针指向什么都没有)。

 char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */ 

也许试试这个?

 /* Careful, strdup is nonstandard. */ strArray[i] = strdup(token); /* Or this. */ strArray[i] = malloc(strlen(token) + 1); strcpy(strArray[i], token); 

看看文档中的示例 :

 char * strtok ( char * str, const char * delimiters ); 

…哪里…

str – 要截断的C字符串。 修改此字符串的内容并将其分解为更小的字符串(标记)。 或者,可以指定空指针,在这种情况下,该函数继续扫描先前成功调用该函数的位置。

分隔符 – 包含分隔符的C字符串。 这些可能因呼叫而异。

返回值 – 指向在字符串中找到的最后一个标记的指针。 如果没有要检索的标记,则返回空指针。

你需要第一个字符串给我可修改,你需要为输出分配内存,例如

 int main(void) { int i = 0; const int numOfStrings = 128; char* strArray[numOfStrings]; char writablestring[]= "The C Programming Language"; char *token = strtok(writablestring, " "); for( int j = 0; j < numOfStrings; j++ ) { strArray[j] = new char[40]; } while(token != NULL) { strcpy(strArray[i], token); printf("[%s]\n", token); token = strtok(NULL, " "); i++; } return 0; }