从文件中提取所需的单词,然后删除所有其他单词

问题描述

在这代码中,我正在从文件提取特定的单词,但是编码不仅在获取所需的单词,而且还包含其他单词,

类似

'bilal khan' found
'9087' found
'sssss' found
'ixing' found

当我只想从9087文件提取第二个单词时。

该怎么做?

我的代码

while (fgets(string,70 - 52,fr))
{
    word = strtok(string,",");

    int diff;
    while (word != NULL)
    {
        diff = strcmp(string,word);
        if (diff == 0)
        {
            printf("'%s' found\n",word);
        }
        word = strtok(NULL,");
    }
}

解决方法

您要比较的是wordstring指向的标记化字符串的结果。

strtok在标记时string进行修改时,在第一个strtok之后,您无法确定是否将其与string进行比较来找到所需的标记,因此应该使用word指针并将其与您要查找的单词进行比较。

作为strtok的参数传递的字符串会发生什么:

请注意,此字符串已通过分解为较小的字符串(令牌)进行了修改。 或者,可以指定一个空指针,在这种情况下,该函数将继续扫描,直到对该函数的先前成功调用结束。

这基本上意味着string将仅包含第一个令牌,并且每个strtok周期的第一个fgets在您的代码中将始终为true,而所有其他周期将始终为true否,除非第一个令牌在string中的某个点重复。

Example of a corrected implementation

char string[50];
FILE *fr = fopen("test.txt","r");
char *word;
char *word_to_find = "9087"; //the word to find

while (fgets(string,sizeof(string),fr)) //second parameter needs to be the same size as the buffer
{
    word = strtok(string,",");

    int diff;
    while (word != NULL)
    {
        diff = strcmp(word_to_find,word); //compare with a determined string
        if (diff == 0)
        {
            printf("'%s' found\n",word);
        }
        word = strtok(NULL,");
    }
}

对于具有以下内容的文件:

my,word,is,9087,

不是最后一个逗号,这是使strtok再次循环,如果不存在,则检测到文件末尾并且未评估最后一个标记,您可以将其删除,但是需要添加额外的控制以确保实际上对最后一个令牌进行了评估。

输出将是:

'9087' found
'9087' found

请注意,正如我说的,string将被修改,如果要避免这种情况,则应对其进行复制并标记化。