getchar() 是 C 标准库 <stdio.h> 中的一个非常重要的函数,用于从标准输入流(通常是键盘)读取一个字符。

函数原型
int getchar(void);
关键点:
-
返回类型是
int,而不是char:这是一个非常重要的细节。getchar()返回的不仅仅是字符本身,它返回的是一个整型值。- 如果成功读取,它会返回读取到的字符的 ASCII 码值(可以安全地赋给一个
char类型变量)。 - 如果到达文件末尾(End-of-File,EOF),或者发生读取错误,它会返回一个特殊值
EOF。EOF通常被定义为-1,使用int类型可以确保EOF这个值能够被正确返回,而不会与一个合法的字符值混淆。
- 如果成功读取,它会返回读取到的字符的 ASCII 码值(可以安全地赋给一个
-
参数是
void:表示该函数不接受任何参数。
工作原理
getchar() 的工作流程如下:

- 程序调用
getchar()。 getchar()会等待用户从键盘输入一个字符并按下 Enter 键。- 用户输入的字符会被放入一个名为输入缓冲区 的区域。
getchar()从缓冲区中取出第一个字符,并将其返回。- 注意:按下 Enter 键产生的换行符
\n也会被留在缓冲区中,等待下一次getchar()读取。
一个简单的例子
这个例子从键盘读取一个字符,然后将其打印出来。
#include <stdio.h>
int main() {
int c; // 必须使用 int 类型来接收 getchar() 的返回值
printf("请输入一个字符,然后按回车键: ");
// 调用 getchar() 读取一个字符
c = getchar();
// 将读取到的字符打印到标准输出(屏幕)
printf("你输入的字符是: ");
putchar(c); // putchar() 是输出一个字符的函数
printf("\n");
return 0;
}
如何编译和运行:
- 将代码保存为
getchar_example.c。 - 编译:
gcc getchar_example.c -o getchar_example - 运行:
./getchar_example - 程序会提示你输入,你输入一个字符(
A)并按回车,程序就会输出你输入的字符。
经典用法:读取一行输入
getchar() 最常见的用法是配合 while 循环来读取用户输入的一整行,直到遇到换行符 \n 或者文件结束符 EOF。
示例:回显用户输入的所有字符,直到遇到换行符。

#include <stdio.h>
int main() {
int c;
printf("请输入一行文本,按回车结束:\n");
// 循环读取字符,直到遇到换行符 '\n'
while ((c = getchar()) != '\n') {
putchar(c); // 将读取到的字符原样打印出来
}
printf("\n程序结束,\n");
return 0;
}
代码解释:
while ((c = getchar()) != '\n')这是一个非常经典的 C 语言写法。c = getchar():先调用getchar()读取一个字符,并将其赋值给变量c。c = getchar() != '\n':整个表达式的值是赋值后c的值。- 循环会一直持续,只要
getchar()读取到的字符不是换行符\n。
- 当用户按下回车键时,
\n被读入,条件c != '\n'为假,循环结束。
处理文件结束符
在 Linux 和 macOS 终端中,你可以通过按下 Ctrl+D 来发送 EOF 信号,在 Windows 命令提示符中,则是 Ctrl+Z 然后回车。
示例:读取输入直到遇到 EOF。
#include <stdio.h>
int main() {
int c;
printf("请输入一些文本,按下 Ctrl+D (Linux/macOS) 或 Ctrl+Z (Windows) 结束输入:\n");
// 循环读取字符,直到遇到文件结束符 EOF
while ((c = getchar()) != EOF) {
putchar(c);
}
printf("\n检测到 EOF,程序结束,\n");
return 0;
}
代码解释:
while ((c = getchar()) != EOF):这个循环会一直读取并打印字符,直到getchar()返回EOF。- 这是一个非常强大的模式,因为它可以处理来自任何输入源的数据,无论是键盘、文件还是其他管道,而不仅仅是键盘输入。
重要注意事项
a. 缓冲区问题
getchar() 从缓冲区读取数据,如果你在调用 getchar() 之前使用了 scanf() 或其他类似的函数,可能会在缓冲区中留下不需要的字符(\n),这会影响后续的 getchar() 调用。
问题示例:
#include <stdio.h>
int main() {
int age;
char name_initial;
printf("请输入你的年龄: ");
scanf("%d", &age); // 用户输入 "25" 并回车
printf("请输入你的姓名首字母: ");
name_initial = getchar(); // 问题在这里!getchar() 直接读取了回车符 '\n'
printf("年龄: %d\n", age);
printf("姓名首字母: %c\n", name_initial); // 输出的是一个换行符,而不是你期望的字母
return 0;
}
如何解决?
在 scanf() 之后,你可以清空输入缓冲区,一个简单的方法是循环读取并丢弃字符,直到遇到换行符。
// 在上面的代码中,scanf 之后加上这个循环 while (getchar() != '\n'); // 读取并丢弃所有字符,直到遇到换行符
b. getchar() 的性能
getchar() 是一个函数调用,每次调用都有一定的开销,在需要高性能读取大量字符的场景(编写一个简单的文本编辑器或解析器时),频繁调用 getchar() 可能会成为性能瓶颈,这时,可以考虑使用更底层的、非标准的函数,如 getche()(立即回显)或 getch()(不回显),但这会降低代码的可移植性。
| 特性 | 描述 |
|---|---|
| 头文件 | #include <stdio.h> |
| 原型 | int getchar(void); |
| 功能 | 从标准输入(键盘)读取一个字符。 |
| 返回值 | 成功时返回字符的 ASCII 码(int 类型),失败或到达文件末尾时返回 EOF(通常是 -1)。 |
| 缓冲区 | 读取的是输入缓冲区中的字符,通常需要按下回车键才会将输入送入缓冲区。 |
| 常见用途 | 读取单个字符。 配合 while 循环读取一行或直到 EOF。 |
| 注意事项 | 必须用 int 类型变量接收返回值。注意与 scanf() 等函数混用时可能产生的缓冲区问题。 |
getchar() 是 C 语言中进行字符级输入的基础,掌握它的用法对于编写交互式程序和进行底层输入处理至关重要。
