C语言成绩统计程序中switch默认分支意外执行的原因咨询
问题原因分析
Windows下Ctrl+Z的EOF触发逻辑:在Windows控制台环境中,
Ctrl+Z不会直接立即终止输入流。如果你输入成绩(如acffbcd)后按下回车,换行符\n会被存入输入缓冲区。此时按下Ctrl+Z,getchar()会先读取缓冲区中剩余的换行符,而这个字符不在你设定的成绩范围(a-f)内,因此会触发switch语句的默认分支。只有当缓冲区中的字符全部读取完毕后,后续的getchar()调用才会返回EOF,循环才会终止。输入1终止的差异:当你将终止条件改为输入1时,程序在读取到字符
'1'时就会直接退出循环,不会继续读取缓冲区中剩余的换行符,因此不会触发默认分支,运行表现正常。
补充验证方案:输入成绩后不按回车,直接按下Ctrl+Z(部分控制台可能需要连续按两次),此时输入缓冲区中没有剩余的换行符,程序就不会触发默认分支。或者在代码中添加判断,遇到'\n'时直接跳过,避免进入switch分支。
内容的提问来源于stack exchange,提问作者Corvus
相关产品推荐
相关产品推荐

