getchar在c语言中怎么用(通俗易懂,带实例)
getchar 是 C 语言标准库 提供的“单字符输入”函数,原型:
int getchar(void);
它从标准输入流(通常是键盘)读取下一个字符,并把该字符以 unsigned char 形式提升为 int 后返回;如果读到文件结束符(EOF,Linux 下 Ctrl+D,Windows 下 Ctrl+Z)则返回常量 EOF(一般为 -1)。
为什么返回 int 而不是 char
char 类型取值范围通常 0~255 或 -128~127,无法区分“有效字符”与“EOF”。返回 int 后,可用负值表示 EOF,避免信息丢失。因此,务必用 int 变量接收:
int ch; /* 正确 */ char c; /* 可能误判 EOF */
基本用法:读取并回显
#include <stdio.h> int main(void) { int ch; printf("请输入字符,Ctrl+D 结束:\n"); while ((ch = getchar()) != EOF) /* 读到 EOF 停止 */ putchar(ch); /* 立即回显 */ return 0; }
运行示例:
输入:abc<Enter><Ctrl+D>
输出:abc<换行>
缓冲区陷阱:getchar 会“吃”回车
标准输入处于“行缓冲”模式,只有当用户按下 Enter 后,内核才把一整行送入用户空间。此时 getchar 依次读取行内每个字符,包括 '\n'。初学者常忘记处理回车,导致“少读一次”。
int ch; printf("请连续输入两个字符:"); ch = getchar(); /* 读第一个 */ printf("1=%c\n", ch); ch = getchar(); /* 读 '\n' */ printf("2=%c\n", ch);
输入 a<Enter>,输出:
1=a(空行,因为 2 读到的是 '\n')
2=
清空行尾剩余字符技巧
若只想读取第一个可见字符并丢弃行尾,可用小循环“刷掉”剩余字符:
int ch, first; printf("请输入一行:"); first = getchar(); /* 取首字符 */ while ((ch = getchar()) != '\n' && ch != EOF); /* 丢弃剩余 */ printf("首字符是 %c\n", first)
与 scanf 混用时注意“换行符残留”
scanf("%d",&n) 读完数字后不会消费 '\n',后续首个 getchar 会读到该换行符。
解决方案:在 scanf 后加 getchar(); 把 '\n' 取走。
#include <stdio.h> void wait_any_key(void) { printf("按 Enter 继续...\n"); while (getchar() != '\n') /* 读到换行才结束 */ ; } int main(void) { puts("处理中..."); wait_any_key(); puts("结束"); return 0; }
统计字符、单词、行数
仿写 UNIX wc 的迷你版:
1 #include <stdio.h> 2 #include <ctype.h> 3 int main(void) 4 { 5 int ch, chars = 0, words = 0, lines = 0, inword = 0; 6 while ((ch = getchar()) != EOF) { 7 ++chars; 8 if (ch == '\n') ++lines; 9 if (!isspace(ch) && !inword) { ++words; inword = 1; } 10 if (isspace(ch)) inword = 0; 11 } 12 printf("%d %d %d\n", chars, words, lines); 13 return 0; 14 }
输入:abc def<Enter>ghi<Enter><Ctrl+D>
输出:12 3 2
getchar 的返回值检查范式
严谨代码应把赋值与比较写在同一表达式内,既简洁又可避免误用未初始化变量:
int ch; while ((ch = getchar()) != EOF) { /* 标准范式 */ /* 处理 ch */ }
常见错误汇总
- 用 char 接收导致 EOF 误判。
- 忘记处理换行符,逻辑少读。
- 在循环体内部再次调用 getchar 导致字符被“吞掉”。

浙公网安备 33010602011771号