You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:25:18