如何使用strtok在空格处解析字符串?

时间:2013-10-08 04:42:07

标签: c string

我正在尝试使用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;
}

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

4 个答案:

答案 0 :(得分:4)

请务必先咨询man页。

strtok(3)说:

  

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

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

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

  •   

答案 1 :(得分:3)

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

这样更好:

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

答案 2 :(得分:3)

strtok将修改作为第一个参数传递的字符串,因此您无法传递字符串文字,请像这样更改main

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

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

答案 3 :(得分: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.