C语言学生信息输入程序后半段无法执行,回车仅换行问题排查
问题分析与解决方案
直接原因:死循环导致代码无法进入后半段
看代码第36-47行的逻辑:
while(1) { for(h=0;h<15;h++) { scanf("%c",&student1.name[h]); if(student1.name[h]==13) { student1.name[h]='\0'; break; } } }
这里的break只能跳出内层的for循环,外层的while(1)没有任何退出条件。当用户输入第一个学生的名字并按下回车后,程序会无限重复执行这个for循环,永远走不到第48行及以后的代码——这就是后半段代码完全无法执行的核心原因。
附加问题:输入缓冲区遗留的换行符(修复死循环后仍需解决)
当用scanf("%d")读取学生学号时,用户输入数字后按下的回车(ASCII 13)会残留在输入缓冲区中。后续用scanf("%c")读取名字时,会直接读取这个遗留的换行符,导致名字输入逻辑异常(比如直接跳过输入)。
修复方案
1. 移除多余的死循环,或给while循环添加退出条件
读取名字的逻辑只需要执行一次,完全没必要套while(1),直接去掉外层循环即可:
printf("Please enter the first student's name: "); for(h=0;h<15;h++) { scanf("%c",&student1.name[h]); if(student1.name[h]==13) { student1.name[h]='\0'; break; } }
如果一定要保留while结构,就在for循环的break之后,再加一个break跳出外层while:
while(1) { for(h=0;h<15;h++) { scanf("%c",&student1.name[h]); if(student1.name[h]==13) { student1.name[h]='\0'; break; } } break; // 添加此行跳出while循环 }
注意:第51-62行的第二个名字读取逻辑,需要做完全相同的修改。
2. 清除输入缓冲区的遗留换行符
在scanf("%d")读取学号后,用getchar()清空缓冲区里的换行符:
printf("Please enter the student number of the first student: "); scanf("%d",&student1.number); getchar(); // 清除缓冲区中残留的回车符
或者在scanf的格式串末尾加空格,让scanf自动跳过空白字符(包括换行):
scanf("%d ",&student1.number); // %d后的空格会忽略后续的空白字符
内容的提问来源于stack exchange,提问作者HuangZiHan
相关产品推荐
相关产品推荐

