getchar 是 C 语言标准库 stdio.h 里面的输入函数,核心作用是从标准输入也就是键盘读取一个字符,函数没有参数,返回值类型是 int,这个设计很多初学者容易忽略,它不是 char 类型,返回的是字符对应的 ASCII 码值,如果读取失败或者到达文件末尾会返回 EOF,也就是宏定义的 - 1,getchar 默认是行缓冲模式,必须等到用户按下回车之后,输入缓冲区里面的字符才会被逐个取出,这也是很多新手踩坑的重点,使用 getchar 之前必须引入头文件 stdio.h,它经常用来读取回车残留字符,配合 scanf 清理缓冲区,也可以单独实现单字符交互,比如菜单选择 按键判断,它和 getch getche 有本质区别,getchar 属于标准 C 函数,跨平台可以编译,getch 是非标准函数,只在旧版 conio.h 里面存在。
基础函数原型
int getchar (void)
函数说明
括号里面 void 代表不需要传入任何参数
返回值 int,保存读取到字符的 ASCII 编码
读到文件末尾或者出错 返回 EOF
工作原理说明
键盘输入的数据不会立刻交给程序,会先存进输入缓冲区,用户敲完字符按下回车,回车本身也就是换行符 \n 也会一起留在缓冲区,之后每调用一次 getchar,就从缓冲区取出第一个字符,缓冲区如果还有剩余字符,下一次调用 getchar 直接读取缓存内容,不会等待键盘再次输入,这个行缓冲机制就是 getchar 最核心的底层逻辑。
基础代码示例
include
int main ()
{
int c;
c = getchar ();
printf ("% c\n", c);
return 0;
}
运行逻辑
程序启动之后等待键盘输入,输入 a 回车,getchar 读取字符 a,打印 a,缓冲区还剩下换行符 \n 没有读取。
常见应用场景
| 应用场景 | 用途说明 |
|---|---|
| 读取单个按键 | 菜单程序接收用户选择的单字符 |
| 清理缓冲区残留 | scanf 读取数值之后,用 getchar 吃掉遗留的换行符 |
| 循环读取字符 | 循环调用 getchar,直到读到 EOF 或者指定结束字符 |
| 暂停程序 | 末尾 getchar 等待用户按键,防止控制台窗口直接关闭 |
关键易错点清单
第一 返回值一定要定义成 int 类型,不要定义成 char 类型,如果用 char 存储 EOF,EOF 是 - 1,char 有可能是无符号类型,会导致判断失效,循环终止条件出错。
第二 回车换行符会被 getchar 正常读取,很多人以为 getchar 只会读取可打印字符,空格 回车 制表符全部都属于合法字符,一样可以被读取。
第三 getchar 是阻塞函数,没有输入的时候程序停在这里等待,不会继续向下执行代码。
第四 不要混淆 getchar 和 getch,getch 不需要回车立刻读取按键,没有回显,不属于标准 C 库,Windows 专用。
循环读取字符写法
include
int main ()
{
int c;
while ( (c = getchar ()) != EOF )
{
putchar (c);
}
return 0;
}
这个写法是经典教材范例,持续读取输入,把读到的字符原样输出,Windows 控制台结束输入按 Ctrl+Z,Linux 系统按 Ctrl+D 触发 EOF。
搭配 scanf 清除缓冲区示例
include
int main ()
{
int num;
char ch;
scanf ("% d", &num);
getchar ();
ch = getchar ();
printf ("% d % c", num, ch);
return 0;
}
这里第一个 getchar 专门吃掉 scanf 留下的换行,避免后面读取字符的时候直接拿到换行符。
【常见问题】
问题 1 getchar 为什么返回值要用 int 而不是 char
回答 1 getchar 返回值是 int,因为 getchar 需要返回 EOF 也就是 - 1,如果使用 char 类型存储 getchar 返回值,无符号 char 无法正确识别 - 1,会造成循环判断错误,所以写 getchar 代码优先用 int 接收返回值。
问题 2 getchar 会读取回车换行符吗
回答 2 getchar 可以读取回车换行符,换行符属于缓冲区里的普通字符,调用 getchar 的时候会把 \n 读出来,这也是 scanf 之后经常需要调用 getchar 清理残留换行的原因。
问题 3 getchar 和 getch 有什么区别
回答 3 getchar 是标准 C 库函数,存在行缓冲,必须按回车才返回,跨平台兼容,getch 属于非标准函数,不需要回车,按键立刻响应,没有回显,一般只在 Windows 旧编译器使用。
问题 4 getchar 读取结束标志 EOF 是什么
回答 1 EOF 是 stdio.h 里面预定义宏,数值是 - 1,getchar 读到文件末尾或者输入终止信号的时候返回 EOF,写循环读取 getchar 的时候,就是靠判断是否等于 EOF 来停止循环。
【免责申明】
本文 getchar 用法基于标准 C 语言规范编写,不同编译器对扩展行为支持存在差异,代码示例仅用于学习演示,正式项目开发请结合编译环境测试,不构成工程开发规范认证。


