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=
(空行,因为 2 读到的是 '\n')

清空行尾剩余字符技巧

若只想读取第一个可见字符并丢弃行尾,可用小循环“刷掉”剩余字符:

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 导致字符被“吞掉”。
posted @ 2025-11-24 17:35  像风一样的博主  阅读(37)  评论(0)    收藏  举报