8

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

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

它不断给我分段错误,我无法弄清楚。我相信当我将令牌复制到我的数组时它有事情要做。

4

2 回答 2

13

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

要使其工作,请尝试:

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

还有一个C 常见问题解答

另一个问题是您没有为字符指针数组分配内存(因此这些指针指向任何内容)。

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);
于 2011-11-08T19:44:07.883 回答
1

查看文档中的示例

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

...在哪里...

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

delimiters - 包含分隔符的 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;
}
于 2011-11-08T19:54:11.590 回答