4

我正在尝试使用strtok()来解析由空格分隔的字符串。据我所知,我正在正确使用它,但它不会在 ideone.com 上运行。下面的代码有什么问题吗?我只是得到Runtime error time: 0 memory: 2288 signal:11

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

static void test(char *command)
{
    char* output = strtok(command, " ");
    printf("%s\n", output);
}

int main(void) {

    test("set_rate 200");

    return 0;
}

如果您想尝试一下,请访问 ideone.com。

4

4 回答 4

4

始终man先查阅页面。

strtok(3)说:

使用这些功能时要小心。如果您确实使用它们,请注意:

  • 这些函数修改它们的第一个参数。

  • 这些函数不能用于常量字符串。

于 2013-10-08T04:48:54.453 回答
3

strtok修改字符串时,它要求字符串不在只读内存中。因此,当您将字符串文字传递给测试函数时,它会崩溃。

这个更好:

char s[] = "set_rate 200";
test(s);
于 2013-10-08T04:45:44.480 回答
3

strtok将修改作为第一个参数传递的字符串,因此您不能传递字符串文字,更改main如下:

int main(void) {  
    char str[] = "set_rate 200";
    test(str);
    return 0;
}

str这是一个char数组,但不是字符串文字。

于 2013-10-08T04:45:57.720 回答
2

当您传递存储在只读内存中的硬编码字符串时。

strtok()不适用于作为只读内存的字符串。

您需要使用字符串变量而不是字符串文字。

您可以先将字符串存储在某个变量中,然后将其传递给函数。

char[]="set_rate 200";
test(str);

参见示例:

 char *str = malloc(20);
    char *tok = NULL;
    int len = 0;

    strcpy(str, "This is a string");
    len = strlen(str);

    printf("string before strtok(): %s\n", str);
    tok = strtok(str, " ");
    while (tok) {
        printf("Token: %s\n", tok);
        tok = strtok(NULL, " ");
    }

编辑

来自@Yu Hao 评论我正在添加这个

char *str = "set_rate 200"; 
test(str); // This won't work. here str is pointer to the string literal. 
于 2013-10-08T04:51:36.490 回答