C语言使用scanf连续输入时字符类型输入被跳过问题
问题根本原因
问题出在输入缓冲区残留的换行符被%c格式符直接读取:
- 执行
scanf("%d", &age)、scanf("%lf", &gpa)时,%d、%lf这类数值格式符默认会跳过输入开头的空白字符,但只会读取对应的数值内容,用户输入完成后按下回车产生的\n会残留在输入缓冲区中 %c格式符的规则和数值格式符不同:它不会跳过任何前置的空白字符,会直接读取缓冲区里第一个字符,也就是上一步残留的\n,所以不会等待用户输入新的内容,直接完成了赋值,看起来就像输入被跳过了。
解决方案
有两种常用的修复方式:
方案1(最推荐):在%c前加空格
修改读取字母等级的scanf语句,在%c前加一个空格:
// char printf("Enter your letter grade: "); scanf(" %c", &grade);
这个空格会指示scanf自动跳过所有前置的空白字符(包括换行、空格、制表符),直到读取到第一个非空白字符,就能正常捕获用户输入的字母等级,兼容性最强。
方案2:手动清空缓冲区残留的换行
在读取grade前调用getchar()吃掉残留的换行符:
// char printf("Enter your letter grade: "); getchar(); // 读取并丢弃缓冲区残留的换行符 scanf("%c", &grade);
这个方法适合确认缓冲区仅残留单个换行符的场景,如果存在多个多余空白字符,可以循环调用getchar()直到读取到换行符为止。
修改后运行程序就可以正常接收三次输入了。
内容的提问来源于stack exchange,提问作者Lucky。
相关产品推荐
相关产品推荐

