两个相似的循环 - 一个完美,另一个不起作用

时间:2015-05-05 17:57:32

标签: c

以下功能是我程序的一部分。此函数的目的是扫描大文本文件并计算从另一个文件读取的名称的出现次数(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);

我不明白为什么循环中的这种轻微变化会导致它无法正常工作。

1 个答案:

答案 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'