2011-11-08 66 views
7

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

#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; 
} 

它不断给我分割错误,我不知道它。我相信当我将令牌复制到我的数组时,它有事情要做。

回答

12

这是因为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); 
+0

Yeap,这个伎俩!谢谢! –

+0

+1:你打败了我 –

1

看一看the example in the 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; 
} 
相关问题