C语言中第二个scanf()函数无法接收输入的原因及解决方法
问题产生原因
使用scanf("%c", &变量)读取单个字符时,%c格式符不会自动跳过输入缓冲区中的空白字符(包括换行符\n、空格、制表符等)。
当你在第一个输入提示下输入小写字母后按下回车键,输入的字母会被第一个scanf读入变量u,但按下回车产生的换行符\n会残留在标准输入缓冲区中。执行到第二个scanf("%c", &v)时,函数会直接读取缓冲区里残留的这个换行符赋值给v,不会等待用户输入新的内容,因此表现为第二个输入步骤被直接跳过。
修复方法
有两种常用的可靠修复方案:
- 方案1:在第二个
scanf的%c前加一个空格,修改为scanf(" %c", &v);
格式串开头的空格会告知scanf跳过读取前所有的空白字符,直到遇到第一个非空白字符才开始正式读入,这种写法可以自动处理缓冲区残留的任意数量空白字符,是最简便稳妥的方案。 - 方案2:在两个
scanf调用之间手动消耗掉缓冲区残留的换行符,插入一行getchar();即可读走第一个输入后留下的回车。注意该方法仅能处理残留单个换行的场景,如果第一个输入后存在多个多余空白字符会出现读取异常。
额外优化建议:原代码中通过u-32、v+32计算大小写转换的写法兼容性较差,并非所有字符编码环境下大小写字母的ASCII差值都是32,可以引入<ctype.h>头文件,使用标准库提供的toupper()、tolower()函数完成大小写转换,鲁棒性更强。
修复后参考代码
#include<stdio.h> #include<ctype.h> int main() { char u, v; printf("Enter lowercase character :"); scanf("%c",&u); printf("Uppercase is : %c\n", toupper(u)); printf("Enter uppercase character :"); scanf(" %c",&v); printf("Lowercase is : %c\n", tolower(v)); return 0; }
内容的提问来源于stack exchange,提问作者Rifat Al Emam Shoron
相关产品推荐
相关产品推荐

