【问题标题】:Comparing two strings using strtok()使用 strtok() 比较两个字符串
【发布时间】:2012-08-07 22:37:26
【问题描述】:

我需要比较两个文本文件中的字符串。在使用strtok()(对于任一文件)分隔字符串时,我在使用strtok() 引用两个文件中的句子时遇到问题,因为它们正在发生冲突。

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

int main()
{
    FILE *fp,*fp1,*fp2;
    fp=fopen("inp1.txt","r");
    fp1=fopen("inp2t.txt","r");

    int f;
    char *a,*b,*chk;
    char buffer[500],buf[5000];

    while(fgets(buf,5000,fp1));
    {
        chk= (char *)strtok (buf," ");

        while(chk!=NULL)
        {
            rewind(fp);
            f=0;

            while(fgets(buffer,500,fp))
            {
                a= (char *) strtok(buffer,"\t");
                b= (char *) strtok(NULL,"\n");

                if(stricmp(a,chk)==0)
                {
                    printf("%s",b);
                    printf(" ");
                    f=1;
                }
            }

            if(f==0)
            {
                printf("%s",chk);
                printf(" ");
            }

            chk= (char *) strtok(NULL," ");                
        }
    }
    fclose(fp);
    fclose(fp1);

    getch();
    return 0;                    
}

如何修复此代码,以便能够从两个输入文件中提取令牌?

【问题讨论】:

  • 欢迎使用 C。基本上,您需要一个不同的 strtok 函数,例如 strtok_s,它支持重新输入。

标签: c string file strtok


【解决方案1】:

strtok 有一个内部状态,可以记住最后一个位置。 strtok_r() 是 strtok() 的可重入版本。检查它是否在您的平台上可用并使用它。

【讨论】:

    【解决方案2】:

    strtok 使用一个指向正在解析的字符串的静态指针,因此在任何给定时间只能对其进行一次调用。

    我可能只是使用:

    char buffera[5000];
    char bufferb[5000];
    
    fscanf(fp, "%4999s", buffera);
    // ...
    fscanf(fp, "%4999s", bufferb);
    

    【讨论】:

      【解决方案3】:

      strtok() 使用全局内部值,它们会发生冲突。使用 strtok_s() 来防止这种情况,因为该函数需要一个引用变量,该变量将使两个实例保持分离。

      【讨论】:

      • 据我所知,strtok_s 不是标准库的一部分。你会想要在 GNU 上使用strtok_r。在我看来,找到另一种方式可能比完全strtok* 更好。
      • @netcoder: strtok_s 是 ISO/IEC 9899:2011 (C11) 标准的一部分
      • @user411313:啊,我明白了。不过 GCC 4.7 似乎仍然不支持它。
      • @netcoder 在包含string.h 之前,您必须将__STDC_LIB_EXT1__ 定义为1。如果未定义,或定义为 0,则这些函数不可用。
      • @DanielFischer:刚刚检查了 GCC 4.7.1 和 GLIBC 2.16(两者都是最新的),在库中的任何地方仍然没有声明 strtok_s 函数,或者关于此事的变更日志.
      猜你喜欢
      • 2013-11-15
      • 1970-01-01
      • 2020-09-05
      • 2017-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多