搜索在非文件终止的文件中以NULL结尾的字符串

我正在编写一个程序打开两个文件进行读取:第一个文件包含20个名称,我存储在Names[0] = John\0forms的数组中。 第二个文件是一个大文本文件,其中包含20个名称中每个名称的许多出现。

我需要我的程序扫描第二个文件的完整性,每次找到其中一个名称,变量Count递增,等完成程序,文本中出现的所有名称的总数存储在Count

这是我的循环,它搜索并计算出现的名称数量:

 char LineOfText[85]; char *TempName; while(fgets(LineOfText, sizeof(LineOfText), fpn)){ for(a = 0; a<NumOfNames; a++){ TempName = strstr(LineOfText, Names[a]); if(TempName != NULL){ Count++; } } } 

无论我做什么,这个循环都不能像我期望的那样工作,但我发现了什么是错的(我想!)。 我的问题是数组中的每个名称都以NULL结尾,但是当文本文件中出现名称时,它不会以NULL结尾,除非它作为一行的最后一个单词出现。 因此,此while循环仅计算任何名称出现在行尾的次数,而不是文本文件中任何位置的任何名称的出现次数。 如何调整此循环以解决此问题?

提前感谢您的任何建议。

这里的问题可能是你使用fgets ,它不会从它读取的行修剪换行符。

如果要通过读取带有fgets行来创建names数组,则所有名称都将以换行符终止。 使用fgets读取的文件中的行也将以换行符终止,因此名称仅在行的末尾匹配。

由于显而易见的原因, strstr不会比较终止模式字符串的NUL字节。 如果是这样,它只会匹配后缀字符串,这将使它成为一个非常不同的function。

此外,每行只能找到每个名称最多一个实例。 如果您认为名称可能在同一行中出现多次,则应替换:

  TempName = strstr(LineOfText, Names[a]); if(TempName != NULL){ Count++; } 

有类似的东西:

  for (TempName = LineOfText; (TempName = strstr(TempName, Names[a]); ++Count, ++TempName) { } 

作为参考,这里是来自C标准的fgets的定义(强调添加):

fgets函数最多只读取一个小于n指定的字符数,该值由stream指向的stream指向s指向的数组。 在换行符( 保留 )或文件结束后不会读取其他字符。 在读入数组的最后一个字符后立即写入空字符。

这与gets不同,它不保留换行符。

我认为名称数组的NULL终止不是问题( 参见strstr函数引用 )。 strstr函数不会比较终结符。 您确实可能在每一行都缺少其他名称。 请参阅下面的调整,了解如何计算每行上的多个名称的示例。

 char LineOfText[85]; char *TempName; while(fgets(LineOfText, sizeof(LineOfText), fpn)){ for(a = 0; a