getchar() 是 C 语言标准库中的一个函数,它的作用是从标准输入流(通常是键盘)中读取一个字符。

详细解释
它是什么?
getchar() 是一个函数,它的全称是 "get character"(获取字符),它定义在头文件 <stdio.h> 中,所以你在使用它之前,必须在代码开头包含这个头文件:
#include <stdio.h>
它做什么?
当你调用 getchar() 函数时,程序会暂停执行,等待用户从键盘输入。
- 用户输入一个字符:比如用户按下键盘上的 'A' 键,然后按下回车键。
getchar()读取字符:getchar()会读取输入缓冲区中的第一个字符,在上面的例子中,它读取的是 'A'。- 返回字符的 ASCII 码:
getchar()函数会返回这个字符的 ASCII 码值。'A' 的 ASCII 码是 65。getchar()的返回值是整数65。 - 等待回车的原因:当你在键盘上输入时,字符并不会立即被程序读取,而是先存入一个叫做“输入缓冲区”或“标准输入流”的地方,你按下回车键,操作系统才会认为这一行输入结束了,并将缓冲区的内容交给程序处理。
它的返回值是什么?
getchar() 的返回值类型是 int(整数),而不是 char,这一点非常重要,原因如下:
- 成功时:返回读取到的字符对应的 ASCII 码值(一个 0 到 127 之间的整数)。
- 失败或结束时:如果输入流(比如键盘输入)结束(在 Windows/Linux 中,你可以按下
Ctrl+Z或Ctrl+D来表示文件结束),或者发生读取错误,getchar()会返回一个特殊值EOF(End Of File,文件结束符)。
EOF 通常是一个在 <stdio.h> 中定义的宏,其值一般为 -1,因为有效的 ASCII 码都是非负数,所以用 -1 来表示“没有可读的字符”或“出错”是非常巧妙的。

一个简单的例子
这个例子会从键盘读取字符,直到遇到 EOF 为止。
#include <stdio.h>
int main() {
int c; // 必须是 int 类型,而不是 char,为了能存储 EOF
printf("请输入一些字符,然后按 Ctrl+D (Linux/macOS) 或 Ctrl+Z (Windows) 结束:\n");
// 循环读取字符,直到 getchar() 返回 EOF
while ((c = getchar()) != EOF) {
// 将读取到的字符原样打印到屏幕上
putchar(c); // putchar() 是输出一个字符的函数
}
printf("\n输入结束,\n");
return 0;
}
代码解释:
int c;:我们声明一个整型变量c来存储getchar()的返回值。绝对不能用char c;,因为char可能无法容纳EOF(通常是 -1)这个值。while ((c = getchar()) != EOF):这是一个非常经典的 C 语言写法。c = getchar():调用getchar()读取一个字符,并将其返回值赋给变量c。c = getchar()这个表达式的值,就是被赋给c的那个值。!= EOF:然后将这个表达式的值与EOF比较,如果不相等(即成功读取到字符),则循环继续。
putchar(c);:调用putchar()函数,将变量c中存储的字符(实际上是它的 ASCII 码)输出到屏幕上。
常见问题与注意事项
问题1:getchar() 会读取空格和换行符吗?
会的! getchar() 非常“笨”,它会把输入缓冲区中所有的字符都当作普通字符来读取,包括:

- 可见字符:
a,B,1, 等。 - 不可见字符:空格 (
`),**制表符** (\t),**回车/换行符** (\n`) 等。
看这个例子:
#include <stdio.h>
int main() {
char c1, c2;
printf("请输入两个字符,a b:\n");
c1 = getchar(); // 读取 'a'
c2 = getchar(); // 读取 ' ' (空格)
printf("c1 是: %c\n", c1); // 输出 a
printf("c2 是: %c\n", c2); // 输出 (一个空格)
return 0;
}
如果你输入 a b 然后回车,c1 得到的是 'a',而 c2 得到的是空格,而不是你期望的 'b'。
问题2:如何跳过空白字符(如空格、换行符)?
如果你想读取有意义的字符,并想忽略掉中间的空白字符,可以在 getchar() 循环内部加一个判断。
#include <stdio.h>
int main() {
int c;
printf("请输入一些字符,可以包含空格和换行,最后用 Ctrl+D 结束:\n");
while ((c = getchar()) != EOF) {
// 如果读取到的字符不是空白字符(空格、换行、制表符)
if (c != ' ' && c != '\n' && c != '\t') {
putchar(c); // 就打印它
}
}
return 0;
}
问题3:getchar() 和 scanf("%c", ...) 有什么区别?
它们非常相似,都会读取任何字符,包括空格和换行,但 getchar() 更简单、更纯粹,就是专门为从输入流中读取单个字符而设计的,而 scanf 是一个功能强大的格式化输入函数,scanf("%c", &c) 只是它的一个特例。
| 特性 | 描述 |
|---|---|
| 函数名 | getchar() |
| 头文件 | <stdio.h> |
| 功能 | 从标准输入(通常是键盘)读取单个字符。 |
| 返回值类型 | int |
| 成功时返回 | 读取到字符的 ASCII 码值(整数)。 |
| 失败/结束时返回 | EOF(通常是 -1)。 |
| 是否读取空白符 | 是,会读取空格、换行符 \n 等所有字符。 |
| 典型用途 | 逐个字符地处理输入,例如读取一行文本、实现简单的解析器等。 |
getchar() 的核心特点:读取一个字符,返回其 ASCII 码,并且会把空格、换行都当作普通字符处理,掌握了这三点,你就能很好地理解和使用它了。
