1

我需要比较两个文本文件中的字符串。在使用(对于任一文件)分隔字符串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;                    
}

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

4

3 回答 3

3

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

于 2012-08-10T15:33:38.323 回答
2

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

我可能只是使用:

char buffera[5000];
char bufferb[5000];

fscanf(fp, "%4999s", buffera);
// ...
fscanf(fp, "%4999s", bufferb);
于 2012-08-10T15:35:35.563 回答
0

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

于 2017-05-19T21:54:09.267 回答