【问题标题】:reuse of strtok is giving nullstrtok 的重用给出了 null
【发布时间】:2014-05-23 10:01:34
【问题描述】:

示例代码:

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

int main()
{
    char str[1024];
    char *buff, *temp, *result = NULL;
    char tok[] = " ";
    printf("enter string:\n");
    gets(str);

    buff = str;

    result = strtok(buff, tok);

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

    printf("\n");

    char tok1[] = " ";
    temp = str;
    result = strtok(temp, tok1);

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

上面的代码给出以下输出:

enter string:
Hello   how  are you
Hello
how
are
you
        
Hello

但是,我希望输出是:

enter string:
Hello   how  are you
Hello
how
are
you

Hello
how
are
you  

为什么 strtok 在打印第一个单词(即“hello”)后返回 NULL? 我正在使用另一个变量并对其进行初始化,并且还使用了另一个令牌变量。如何获得期望结果?

【问题讨论】:

    标签: c strtok


    【解决方案1】:

    strtok() 修改输入字符串。所以在第一轮标记化后原始字符串str已经被修改(因为temp指向str)。

    因此,在将字符串传递给strtok() 之前 复制一份。

    其他改进:

    1) 不要使用已弃用的gets()。请改用fgets() 以避免潜在的缓冲区溢出。
    2) 使用strtok_r(),因为它是重入者。

    【讨论】:

    • 但我没有在 strtok 中使用 str .. 我使用了 buff。
    • @user3065636: buff 是一个char *,这意味着它的值只是一个指向str 开头的指针(str 中第一个字符的内存地址)。所以buff 只是指向str,这就是strtok 在这里改变的地方
    • @user3065636 正如 Elias 所说,它只是指向str。将其声明为tempchar temp[1024]; 并在阅读str 后执行strcpy(temp, str);,您会看到不同。
    • 是的。 strtok_r() 不是 ISO 的一部分,而是 POSIX 标准的一部分。
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多