我想分解一个句子并将每个字符串存储在一个数组中。这是我的代码:
#include <stdio.h>
#include <string.h>
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;
}
它一直给我分段错误,我无法弄清楚。我相信当我将令牌复制到我的阵列时,它可以做些什么。
答案 0 :(得分:13)
这是因为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);
答案 1 :(得分:1)
char * strtok ( char * str, const char * delimiters );
... WHERE ...
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;
}