使用If语句的简易C程序在VS Code中运行中断问题排查
问题分析与解决方案
嘿,我来帮你排查这个问题!你遇到的情况是输入缓冲区残留的换行符干扰了第二个scanf的执行,这是C语言初学者很容易踩的坑,别担心,咱们一步步搞清楚:
问题根源
当你在第一个输入后按下回车键时,键盘输入的其实是两个内容:你输入的字符(比如y)加上一个换行符\n。第一个scanf("%c", &math)只读取了那个字符,而换行符会留在输入缓冲区里。
等到第二个scanf("%c", &sci)执行时,它会直接读取缓冲区里剩下的换行符,根本不会等待你输入新的内容——这就是为什么程序看起来“停止运行”在第二个输入步骤,其实它已经读完了那个换行符,直接进入后续的判断逻辑了。
修复方案
最简单的解决办法是在第二个scanf的格式字符串前加一个空格,空格会告诉scanf自动跳过所有空白字符(包括换行、空格、制表符),直到遇到第一个非空白字符:
#include <stdio.h> int main(){ char math, sci; printf("Have you passed Mathematics test (y/n)\n"); scanf("%c", &math); printf("Have you passed Science test (y/n)\n"); // 这里加了一个空格,跳过缓冲区的空白字符 scanf(" %c", &sci); if ((math == 'y') && (sci == 'y')) { printf("You get a gift of worth Rs. 45."); } else if ((math == 'n') && (sci == 'y')) { printf("You get a gift of worth Rs. 15."); } else if ((math == 'y') && (sci == 'n')) { printf("You get a gift of worth Rs. 15."); } else if ((math == 'n') && (sci == 'n')) { printf("You don't get any gift."); } return 0; }
你也可以在第一个scanf之后用getchar()来吃掉那个换行符,比如:
scanf("%c", &math); getchar(); // 读取并丢弃换行符
不过加空格的方式更简洁,也能处理用户可能输入的多余空格情况。
小提醒
以后用scanf读取单个字符的时候,一定要注意输入缓冲区里的空白字符,尤其是前面有过输入操作的情况。如果是读取字符串或者数字,scanf默认会跳过空白字符,就不会有这个问题,但单个字符的读取要特别留意哦!
内容的提问来源于stack exchange,提问作者Sif Zia
相关产品推荐
相关产品推荐

