c 语言当中用户输入一个字符,核心就是读取单个字符,常用两种写法,第一种是用 getchar 函数直接读取,第二种是用 scanf 搭配格式符 % c 读取,两种方式都可以拿到用户在键盘敲入的那一个字符,拿到之后还可以继续做判断,比如判断是不是数字是不是字母是不是符号,这个是 c 语言基础输入最基础的操作,很多初学者容易踩坑,就是回车换行符会被当成下一次输入的字符,导致后续读取异常,所以写代码的时候一定要理解输入缓冲区的原理,键盘输入不是直接送到程序内部,是先存进缓冲区,程序再从缓冲区取出数据,用户按下回车之后缓冲区才会提交,回车本身也是一个换行字符,会留在缓冲区里面,如果连续多次读取单个字符,这个换行符就会被下一次 getchar 或者 scanf % c 读到,造成不符合预期的结果。写代码的时候第一步先引入头文件,getchar 需要 stdio.h,scanf 同样依赖 stdio.h,第二步编写主函数 main,第三步定义字符变量,一般定义成 char 类型,第四步调用输入函数读取用户输入一个字符,第五步把读取到的字符输出,或者增加分支判断做业务处理,第六步编译运行测试,输入单个字符观察输出结果,确认缓冲区残留问题是否存在,最后根据需求选择合适的方案,简单单次读取直接用 getchar,如果后面还要继续读取其他类型数据,优先考虑 scanf % c 并且处理缓冲区残留。
一 两种核心实现方式
方式一 getchar 读取用户输入一个字符
getchar 是 c 语言标准库函数,功能就是从标准输入缓冲区读取一个字符,返回值是 int 类型,这里要重点注意,虽然是字符,返回值设计成 int,是为了能够识别 EOF 文件结束标记,代码基础写法
include
int main()
{
char ch;
ch = getchar();
printf("你输入的字符是 %c\n", ch);
return 0;
}
特点 调用一次就只读取一个字符,不需要格式控制符,写法简单,适合单纯读取单个字符场景
方式二 scanf % c 读取用户输入一个字符
scanf 函数使用 % c 格式符,专门用来读取单个字符,代码基础写法
include
int main()
{
char ch;
scanf("%c", &ch);
printf("你输入的字符是 %c\n", ch);
return 0;
}
特点 可以和其他输入格式混写,比如后面继续读取整数浮点数,适合混合输入的程序,但是 % c 不会自动跳过空格回车,这点和 % d % f 不一样
二 缓冲区踩坑重点说明
用户输入一个字符之后按下回车,缓冲区里面会有两个内容,第一个是用户敲的字符,第二个是回车对应的换行符 \n,如果程序马上第二次读取字符,就会直接读到这个换行符,不会等待用户再次输入。解决办法有三种
第一种 读取之后再加一次 getchar 吃掉换行符
第二种 在 scanf 格式符 % c 前面加空格,写成 scanf ("% c",&ch),这个空格的作用就是跳过前面所有空白字符,包含空格回车制表符
第三种 使用 fflush (stdin) 清空输入缓冲区,这个写法要注意,部分编译器支持,标准 c 语言里面 fflush 作用对象是输出流,跨平台移植的时候不推荐依赖这个写法
三 扩展 判断输入字符类型示例
读取用户输入一个字符之后,经常需要分类判断,可以用 ctype.h 里面的库函数
isalpha 判断是不是英文字母
isdigit 判断是不是数字字符
isalnum 判断是不是字母或者数字
ispunct 判断是不是标点符号
示例逻辑 读取字符之后调用函数,输出对应的分类结果
四 getchar 和 scanf % c 对比表
| 对比项目 | getchar | scanf %c |
|---|---|---|
| 语法复杂度 | 简单,无格式符 | 需要写格式控制符 |
| 返回类型 | int | 通过指针参数带回值 |
| 适用场景 | 单独读取单字符 | 混合多种类型输入 |
| 空白字符处理 | 不跳过,原样读取 | 默认不跳过,前面加空格可跳过 |
| 识别 EOF | 原生支持 | 需要额外判断 |
【常见问题】
问题 1 c 语言读取用户输入一个字符为什么会自动读到回车?
回答 1 因为输入缓冲区机制,用户输入一个字符之后按回车,回车产生的换行符留在缓冲区,下一次读取用户输入一个字符的时候,程序直接取出这个换行符,没有等待新的键盘输入,属于 c 语言输入缓冲区正常现象,可以用空格修饰 % c 或者额外 getchar 清理。
问题 2 c 语言读取用户输入一个字符,getchar 返回值为什么不直接定义成 char?
回答 2 getchar 读取用户输入一个字符的时候,返回值设计为 int,是为了可以返回 EOF 这个特殊标记,EOF 是负数,如果用 char 类型存储,部分编译器下会和正常字符混淆,无法准确识别文件结束,所以规范写法接收 getchar 读取用户输入一个字符要用 int 变量接收。
问题 3 c 语言用 scanf 读取用户输入一个字符,输入多个字符会怎么样?
回答 3 scanf 读取用户输入一个字符的时候,只会取出缓冲区第一个字符,剩下的字符仍然保留在输入缓冲区,不会自动丢弃,后续的输入操作会继续读取这些残留字符,所以输入多个字符并不会报错,但是会造成后续输入错乱。
【免责申明】
本内容关于 c 语言用户输入一个字符的代码讲解仅用于编程学习参考,不同编译器操作系统对输入缓冲区处理存在差异,fflush (stdin) 相关写法不具备跨平台标准兼容性,正式项目开发请严格遵循 ANSI C 标准规范,因照搬示例代码产生编译异常或者逻辑错误,使用者自行承担相关责任。


