一句话理解 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、清缓冲、防溢出」