问题描述
在这段代码中,我正在从文件中提取特定的单词,但是编码不仅在获取所需的单词,而且还包含其他单词,
类似的:
'bilal khan' found
'9087' found
'sssss' found
'ixing' found
该怎么做?
我的代码
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,");
}
}
解决方法
您要比较的是word
和string
指向的标记化字符串的结果。
当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
将被修改,如果要避免这种情况,则应对其进行复制并标记化。