今日总结 – 基础知识 | 每日一面(77)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:这样的代码有什么问题?char c; while((c = getchar()) != EOF)

小林:第一, 保存 getchar 的返回值的变量必须是 int 型。getchar() 可能返回任何字符值, 包括 EOF。如果把 getchar 的返回值截为 char 型, 则正常的字符可能会被错误的解释为 EOF, 或者 EOF 可能会被修改 (尤其是 char 型为无符号的时候), 从而永不出现。

读者:我有个读取直到 EOF 的简单程序, 但是我如何才能在键盘上输入

那个 “EOF” 呢?

小林:其实, 你的C程序看到的 EOF 的值和你用键盘发出的文件结束按键组合之间没有任何直接联系。根据你的操作系统, 你可能使用不同的按键组合来表示文件结束, 通常是 Control-D 或 Control-Z。

读者:为什么这些代码 while(!feof(infp)) { fgets(buf, MAXLINE,

infp); fputs(buf, outfp); } 把最后一行复制了两遍?

小林:在 C 语言中, 只有输入例程试图读并失败以后才能得到文件结束符。换言之,C 的 I/O 和 Pascal 的不一样。通常你只需要检查输入例程的返回值, 例如, fgets()在遇到文件结束符的时候返回 NULL。实际上, 在任何情况下, 都完全没有必要使用 feof()

有时候,正是那些意想不到之人,成就了无人能成之事。

正文完