【问题标题】:Compare words using strtok in C在 C 中使用 strtok 比较单词
【发布时间】:2015-09-29 06:20:52
【问题描述】:

我已经开始学习 c。目前,我正在尝试从两个 char 数组中提取单词,以便可以使用名为 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 打印行中的内容以及 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.

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

【问题讨论】:

  • 我在 C 中使用 XCODE 编译了这段代码
  • strtok 一次只能处理一行。要同时解析多行,请使用strtok_rstrsep
  • 请仔细阅读strtok手册。 strtok 一次只能操作一个字符串。因此,为什么您的第一个版本不起作用,而您的第二个版本起作用。如果你想交错解析不同的字符串,请使用strtok_r

标签: c arrays pointers strtok c-strings


【解决方案1】:

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

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

【讨论】:

  • 可以方便地说strtok_r 不是标准的一部分,而是POSIX 扩展。
  • True(我链接的手册页确实列出了功能测试要求,总结为“它无处不在,除了 Windows”)。如果您使用的是 Windows,则使用 strtok_s,这在概念上非常相似。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多