C语言getchar函数详解:“字符猎手”

一句话理解 getchar

「getchar 就像一位耐心的‘字符捕手’,从输入流中逐个‘捕捉’字符,直到遇见结束信号(EOF)!」


函数原型

#include 
int getchar(void);  // 无参数,返回读取的字符或EOF

入口参数

参数

类型

比喻解释

void

无需参数,专注捕捉字符!

返回参数

返回值

含义

int

成功捕捉的字符(ASCII码,如'A'→65)

EOF

输入结束或错误(如按下Ctrl+D/Z)


核心功能图解

输入流:H e l l o   
调用 getchar() → 依次返回 'H', 'e', 'l', 'l', 'o', '\n', 等待下一次输入...

代码实例:字符捕手实战

场景1:密码掩码输入(显示*代替字符)

#include 

int main() {
    char password[20];
    int c;
    int i = 0;

    printf("请输入密码(最多19字符,按回车结束):");
    while ((c = getchar()) != '\n' && c != EOF && i < 19) {
        password[i++] = c;  // 存储字符
        putchar('*');       // 显示掩码
    }
    password[i] = '\0';     // 字符串结尾

    printf("\n你输入的密码是:%s\n", password);
    return 0;
}

运行效果

请输入密码(最多19字符,按回车结束):*****
你输入的密码是:hello

场景2:统计输入字符数(含换行符)

#include 

int main() {
    int count = 0;
    printf("输入任意文本(按Ctrl+D/Z结束):\n");

    while (getchar() != EOF) {
        count++;
    }

    printf("总字符数:%d\n", count);
    return 0;
}

输入测试

Hello
World
^D  
总字符数:11(H e l l o \n W o r l d \n)

场景3:简单文本过滤器(删除空格)

#include 

int main() {
    int c;
    printf("输入文本(将删除所有空格):\n");
    while ((c = getchar()) != EOF) {
        if (c != ' ') {
            putchar(c);  // 非空格字符直接输出
        }
    }
    return 0;
}

输入:C Pro gramming is fun!
输出:CProgrammingisfun!


技术细节剖析

1. 为什么用 int 接收返回值?

  • 兼容 EOF:EOF 是一个特殊值(通常是-1),而 char 类型可能是无符号的(范围0~255),无法表示-1。
  • 安全检测:用 int 可以明确区分正常字符和错误/结束信号。

2. 输入缓冲区的秘密

  • 行缓冲模式:用户输入的字符会先存入缓冲区,按回车后 getchar 才逐个读取。
  • 残留字符处理:若输入超过程序预期,需手动清空缓冲区。
// 清空缓冲区剩余字符 
while (getchar() != '\n');

常见错误与修复

1. 缓冲区溢出

char buf[5];
int i = 0;
// 危险!可能写入越界
while ((buf[i++] = getchar()) != '\n');  

修复

while (i < 4 && (buf[i] = getchar()) != '\n' && buf[i] != EOF) {
    i++;
}
buf[i] = '\0';  // 确保终止符

2. 忽略 EOF 检测

char c;
while ((c = getchar()) != '\n') {  //  若用户输入EOF会死循环
    // ...
}

修复

int c;
while ((c = getchar()) != '\n' && c != EOF) {
    // ...
}

高级技巧:实现 Ctrl+C 优雅退出

#include 
#include 

volatile sig_atomic_t stop = 0;
void handle_signal(int sig) {
    stop = 1;  // 捕获Ctrl+C信号
}

int main() {
    signal(SIGINT, handle_signal);  // 注册信号处理函数
    printf("输入字符(按Ctrl+C退出):\n");
    
    int c;
    while (!stop && (c = getchar()) != EOF) {
        putchar(c);
    }
    
    printf("\n程序已安全退出!\n");
    return 0;
}

总结表格

特性

说明

核心功能

逐个字符读取输入流

适用场景

字符级处理、输入控制、过滤器

性能

高频调用时效率较低

安全准则

必须用 int 接收返回值


总结

  • 像捕手一样精准:getchar 是C语言中最基础的字符输入工具,适合精细控制输入流程。
  • 关键特性
    1 无参数设计 → 专注读取下一个字符
    2 返回值包含状态 → 明确区分字符和结束信号
    3 与 putchar 黄金组合 → 实现简单输入输出逻辑
  • 使用口诀
    「用int接、查EOF、清缓冲、防溢出」
原文链接:,转发请注明来源!