这是fgetc的有效用法吗?

时间:2015-11-16 14:41:40

标签: c loops while-loop nested-loops fgetc

我的输入流来自一个文本文件,其中包含由\ n字符分隔的单词列表。 函数stringcompare是一个函数,它将比较两个字符串的等价性,不区分大小写。

我有两个字符串数组,字[50]和字典[50]。 word是一个由用户提供的字符串。 基本上我想要做的是将word []和文本文件中的每个单词作为stringcompare函数的参数传递。

我已编译并运行此代码,但这是错误的。非常错误。我究竟做错了什么?我甚至可以像这样使用fgetc()吗?在内循环完成后,dict []甚至会成为一个字符串数组吗?

        char c, r;
        while((c = fgetc(in)) != EOF){ 
            while((r = fgetc(in)) != '\n'){
                dict[n] = r;
                n++;

            }
            dict[n+1] = '\0'; //is this necessary?
            stringcompare(word, dict);
        }

1 个答案:

答案 0 :(得分:3)

这是错的。

  • fgetc()的返回值应存储到int,而不是char,尤其是当它与EOF进行比较时。
  • 您可能忘记初始化n
  • 您将错过每行的第一个字符,该字符存储在c
  • 使用dict[n] = '\0';代替dict[n+1] = '\0';,因为n已在循环中递增。

可能的解决方法:

int c, r;
while((c = fgetc(in)) != EOF){ 
    ungetc(c, in); // push the read character back to the stream for reading by fgetc later
    n = 0;
    // add check for EOF and buffer overrun for safety
    while((r = fgetc(in)) != '\n' && r != EOF && n + 1 < sizeof(dict) / sizeof(dict[0])){
        dict[n] = r;
        n++;

    }
    dict[n] = '\0'; //this is necessary
    stringcompare(word, dict);
}