如何在C中使用strtok()拆分字符串?

时间:2014-01-28 20:02:28

标签: c string split strtok

我正在尝试用strtok分割字符串,但我无法打印字符串的第二部分。

 int main (void) {
     char str[128];
     char *ptr;

     strcpy (str, "123456 789asdf");
     strtok (str, " ", &ptr);

     printf ("'%s'  '%s'\n", str, ptr);
     return 0;
 }

结果是这样的:

'123456' '12jfs90123#4'

3 个答案:

答案 0 :(得分:1)

在我看来,你已经误解了strtok的工作方式。

第二个参数应该指向一个分隔符字符串。 "当前" string是返回值。在第一次调用时,您传递要拆分的字符串。在后续调用中,为第一个参数传递NULL。

strtok还会修改传递给它的字符串,因此您必须将字符串文字作为第一个参数传递。

工作代码通常至少看起来像这样:

char input[] = "123456 789asdf";

char *substring = strtok(input, " ");

do { 
    printf("%s\n", substring);
} while (strtok(NULL, " "));

但是,如果您知道自己只会寻找两个论点,那么scanf可能更容易使用:

char s1[256], s2[256];

sscanf(str, "%255s %255s", s1, s2);

答案 1 :(得分:1)

strtok()与您使用它的方式略有不同:

char str[] = "123456 789asdf";

char* token = strtok (str, " ");
char* token2 = strtok (NULL, " ");
printf ("'%s'  '%s'\n", token, token2);

输出所需的:'123456' '789asdf'

答案 2 :(得分:1)

你需要继续调用strtok,直到它返回NULL,因为strtok会返回每个函数调用时分割得到的一个标记。 这是工作代码:

int main (void) {
    char str[128];
    char *ptr;

    strcpy (str, "123456 789asdf");
    ptr = strtok (str, " ");

    while(ptr != NULL)
    {
        printf ("'%s'\n", ptr);
        ptr = strtok(NULL, " ");
    }

    return 0;
 }