以下功能是我程序的一部分。此函数的目的是扫描大文本文件并计算从另一个文件读取的名称的出现次数(NameAppearences
)。从第二个文件读取的名称存储在全局声明为char **Names
的数组中。当计算Names[0]
的出现次数时,以下版本的函数按预期工作:
void SearchForNames()
{
char LineOfText[85];
char *TempName;
char word[15];
while(fgets(LineOfText, sizeof(LineOfText), fpn))
{
strncpy(word, Names[0], strlen(Names[0]) - 1);
TempName = strstr(LineOfText, word);
if(TempName != NULL)
{
NameAppearances++;
}
}
printf("%d", NameAppearances);
}
但是,如果我更改此while
循环以包含嵌套for
循环,以便计算所有名称(Names[0]
到Names[NumOfNames]
的出现次数,它为NameAppearances
打印值0:
while(fgets(LineOfText, sizeof(LineOfText), fpn))
{
for(x=0; x<NumOfNames; x++)
{
strncpy(word, Names[x], strlen(Names[x]) - 1);
TempName = strstr(LineOfText, word);
if(TempName != NULL)
{
NameAppearances++;
}
}
}
printf("%d", NameAppearances);
我不明白为什么循环中的这种轻微变化会导致它无法正常工作。
答案 0 :(得分:1)
JSON.stringify
是未定义的行为。
strncpy(word, Names[0], strlen(Names[0]) - 1); TempName = strstr(LineOfText, word);
没有空字符终止,但在word
中用作字符串。
[编辑]
以下字符串操作不好。它会为strstr()
留下word
的副本,但缺少Names[0]
除外。
'\0'
而是防止缓冲区溢出使用
strncpy(word, Names[0], strlen(Names[0]) - 1); // bad code
[编辑2]
根据您的其他帖子,确保您的姓名列表已移除word[0] = 0;
strncat(word, Names[0], sizeof word - 1);
。
'\n'