【问题标题】:Is this a valid use of fgetc?这是对 fgetc 的有效使用吗?
【发布时间】:2015-11-16 14:41:39
【问题描述】:

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

我有两个字符串数组,word[50] 和 dict[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);
        }

【问题讨论】:

  • fgetc 返回一个int,你的c 是一个char。所以不是,它是无效的。要从流中读取行,我建议您使用fgets

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


【解决方案1】:

这是错误的。

  • 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);
}

【讨论】:

  • 我认为如果第一个字符是换行符,它也可以永远循环。
  • 你能解释一下为什么fgetc()的返回值应该存储在int中吗?
  • 因为fgetc() 返回int 值,而EOF 不适合char
  • 详细信息:如果char 已签名且EOF == -1,则EOF 的值确实 适合char。问题是fgetc() 返回的值在unsigned charEOF 范围内。这通常是 257 个不同的值,它们不能清楚地存储在 char 中,因此 EOFchar 之一失去了区别,因此需要 int。另外,正如您所说,EOF 可能不在char 的范围内。
猜你喜欢
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
相关资源
最近更新 更多