gpt4 book ai didi

c - 在非 NULL 终止的文件中搜索以 NULL 终止的字符串

转载 作者:行者123 更新时间:2023-11-30 15:20:22 24 4
gpt4 key购买 nike

我正在编写一个程序,打开两个文件进行读取:第一个文件包含 20 个名称,我将它们存储在 Names[0] = John\0 形式的数组中。第二个文件是一个大型文本文件,其中包含 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 字节。如果这样做,它只会匹配后缀字符串,这将使其成为一个非常不同的函数。

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

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

类似:

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

作为引用,以下是 C 标准中 fgets 的定义(添加了重点):

The fgets function reads at most one less than the number of characters specified by n from the stream pointed to by stream into the array pointed to by s. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array.

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

关于c - 在非 NULL 终止的文件中搜索以 NULL 终止的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30054679/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com