在 C 中使用 strtok 比较单词

标签 c arrays pointers strtok c-strings

我开始学习c了。目前,我正在尝试从两个字符数组中获取单词,以便我可以使用名为 compare 的辅助方法来比较它们。但是,我的 strtok() 给了我奇怪的输出。 这是我的代码:

char *headerPointer=headers;
    char *linePointer=firstline;
    printf("Header-%s\n",headers);
    printf("Line-%s\n",firstline);
    headerPointer=strtok(headerPointer,",");
    linePointer=strtok(linePointer,",");
    while ((headerPointer!=NULL&&linePointer!=NULL)) {
            printf("\nPrinting words from headers\n");
            printf("%s",headerPointer);
            headerPointer=strtok(NULL,",");
            printf("\nPrinting words from line\n");
            printf("%s",linePointer);
            linePointer=strtok(NULL, ",");

        }

以上代码产生的输出:

Header-Hello,My,name,is,Ram.
Line-I,own,20,thousand,bucks.

Printing words from headers-
Hello.
Printing words from line-
I.
Printing words from headers-
own.
Printing words from line-
20.
Printing words from headers-
thousand.
Printing words from line-
bucks.

我不明白为什么 header 从 line 打印内容,my,name,is,ram 去哪儿了?

我尝试使用以下代码编写它们,并且同样的代码产生了所需的输出。 不同的代码风格:

char *headerPointer=headers;
    char *linePointer=firstline;
    printf("Header%s\n",headers);
    printf("Line%s\n",firstline);
    headerPointer=strtok(headerPointer,",");

        while(headerPointer!=NULL)
    {
        printf("\nPrinting words from headers\n");
        printf("%s",headerPointer);
        headerPointer=strtok(NULL,",");

    }
    linePointer=strtok(linePointer,",");

    while(linePointer!=NULL){
        printf("\nPrinting words from line\n");
        printf("%s",linePointer);
        linePointer=strtok(NULL, ",");
    }

输出:

Header-Hello,My,name,is,Ram.
Line-I,own,20,thousand,bucks.

Printing words from headers-
Hello.
Printing words from headers-
My.
Printing words from headers-
name.
Printing words from headers-
is.
Printing words from headers-
Ram.
Printing words from line-
I.
Printing words from line-
own.
Printing words from line-
20.
Printing words from line-
thousand.
Printing words from line-
bucks.

请解释为什么基于相同想法的两个代码会产生不同的结果?我们可以修改第一个代码来给出第二个结果吗?我尝试搜索并遵循已经可用的解决方案,但没能走多远。

最佳答案

strtok 是有状态且不可重入的;它一次只能标记一个字符串。在您的原始代码中,您试图同时对两个输入进行标记化,但它不能这样做;它只是根据提供的最后一个非 NULL 字符串参数进行标记化,即 linePointer

要完成这项工作,您需要使用 strtok_r这使您可以保存每个字符串的进度,而不会覆盖另一个字符串的进度。

关于在 C 中使用 strtok 比较单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32836994/

相关文章:

c - 访问 libgit2 中的 git_odb_writepack 字段会出现错误 "dereferencing pointer to incomplete type"

c - UNIX 上 C 语言的 makefile

java - 从数组列表访问数组

Array 方法中的 Javascript 循环

c++ - 使用带有 COM 接口(interface)的 STL 智能指针

c - 如何知道字符串指针在重新分配后是否真的变小了?

c - gcc 未定义对 dbus_* 的引用

java - 可变大小数组的构造函数

c - 不工作/使用自己的 Strncpy 函数

c - 指针赋值警告