跳转至内容

C 编程/stdio.h/getchar

来自 Wikibooks,开放世界中的开放书籍

getchar 是 C 编程语言中一个函数,它从标准输入流 stdin 读取单个字符,无论该字符是什么,并将它返回给程序。它在 ANSI-C 中指定,是 C 中最基本的输入函数。它包含在 stdio.h 头文件中。

getchar 函数原型如下[1]

int getchar(void);

示例用法

[编辑 | 编辑源代码]

以下程序使用 getchar 将字符读取到数组中,并在找到文件结束符后使用 putchar 函数打印出来。

 #include <stdio.h>

 int main(void)
 {
   char str[1000];
   int ch, n = 0;

   while ((ch = getchar()) != EOF && n < 1000) {
      str[n] = ch;
      ++n;
   }
   
   for (int i = 0; i < n; ++i)
      putchar(str[i]);
   
   putchar('\n'); /* trailing '\n' needed in Standard C */

   return 0;
 }

程序将读取长度的最大值指定为 1000 个字符。它将在读取 1000 个字符或读取文件结束指示符后停止读取,以先发生者为准。

常见错误

[编辑 | 编辑源代码]

使用 getchar 时一个常见的错误是在将其与 EOF 进行比较之前将其结果赋值给 char 类型的变量。[2]

以下示例展示了此错误

   char c;
   while ((c = getchar()) != EOF) { /* Bad! */
      putchar(c);
   }

考虑一个 char 为 8 位宽,表示 256 个不同值的系统。getchar 可以返回这 256 个可能的字符中的任何一个,也可以返回 EOF 来指示文件结束,总共有 257 个不同的可能返回值。

getchar 的结果赋值给 char 时,char 只能表示 256 个不同的值,因此必然会丢失一些信息 - 当将 257 个项目打包到 256 个槽中时,必然会发生冲突。EOF 值在转换为 char 时,将与具有相同数值的 256 个字符中的一个无法区分。如果该字符在文件中找到,则上述示例会将其误认为是文件结束指示符。

如果 char 类型是无符号的,则会发生相反的效果。因为 EOF 是负数,所以它永远不可能等于任何无符号 char,因此上述示例不会在文件结束时终止。它将永远循环,重复打印将 EOF 转换为 char 所产生的字符。

intchar 大小相同的系统上,即使上一节中的“良好”示例也会受到 EOF 和某个字符值无法区分的影响。处理这种情况的正确方法是在 getchar 返回 EOF 后检查 feof 和 ferror。如果 feof 指示尚未到达文件结束,并且 ferror 指示没有发生错误,则可以假设 getchar 返回的 EOF 表示实际字符。这些额外的检查很少进行,因为大多数程序员假设他们的代码永远不需要在这些“大 char”系统上运行。


参考文献

[编辑 | 编辑源代码]
  1. http://www.phim.unibe.ch/comp_doc/c_manual/C/FUNCTIONS/getchar.html
  2. http://c-faq.com/stdio/getcharc.html
华夏公益教科书