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

时间:2011-11-08 19:43:07

标签: c cstring strtok

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

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

它一直给我分段错误,我无法弄清楚。我相信当我将令牌复制到我的阵列时,它可以做些什么。

2 个答案:

答案 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)

查看the example in the docs

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