问题描述
我想分解一个句子并将每个字符串存储在数组中.这是我的代码:
#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; }
它不断给我分段错误,我无法弄清楚.我相信当我将令牌复制到我的数组时,它有事.
推荐答案
这是因为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);
其他推荐答案
请看一下 docs :
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; }