C 编程/stdio.h/getchar
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
所产生的字符。
在 int
和 char
大小相同的系统上,即使上一节中的“良好”示例也会受到 EOF 和某个字符值无法区分的影响。处理这种情况的正确方法是在 getchar
返回 EOF 后检查 feof 和 ferror。如果 feof
指示尚未到达文件结束,并且 ferror
指示没有发生错误,则可以假设 getchar
返回的 EOF 表示实际字符。这些额外的检查很少进行,因为大多数程序员假设他们的代码永远不需要在这些“大 char
”系统上运行。
- ↑ http://www.phim.unibe.ch/comp_doc/c_manual/C/FUNCTIONS/getchar.html
- ↑ http://c-faq.com/stdio/getcharc.html
- Cplusplus.com 上的 getchar,于 2006 年 2 月访问