C语言switch和函数的运用,程序有死循环,求大神解 #include<stdio.h> #include<math.h> void main()

{
void zuoye3_1();//声明调用函数
int x,y,i,t;//x控制章数,y控制题号,i返回菜单
do
{
printf("请选择章节号:");//章节只有3/4章
scanf("%d",&x);
switch(x)
{
case 3://第三章
{do
{
printf(" *******************第%d章作业******************* \n",x);
printf("请输入题号:");scanf("%d",&y);//题号
switch(y)
{
case 1:{printf("第%d题:\n",y);zuoye3_1();//调用函数
};break;
case 2:printf("第%d题:\n",y);break;
case 3:printf("第%d题:\n",y);break;
case 4:printf("第%d题:\n",y);break;
default:printf("查无此题,请核对题号后重新输入\n");
}printf("返回选择题号请按“0”,否则返回主菜单");
scanf("%d",&i);
}
while(0==i);//返回菜单
};break;

case 4:
{do
{
printf(" *******************第%d章作业******************* \n",x);
printf("请输入题号:");scanf("%d",&y);//题号
switch(y)
{
case 1:printf("第%d题:\n",y);break;
case 2:printf("第%d题:\n",y);break;
case 3:printf("第%d题:\n",y);break;
case 4:printf("第%d题:\n",y);break;
default:printf("查无此题,请核对题号后重新输入\n");
}printf("返回选择题号请按“0”,否则返回主菜单");
scanf("%d",&i);
}
while(0==i);//返回菜单
};break;
default:printf("无此章节,请核对后重新输入\n");break;//返回主菜单
}printf("请按“0”返回主菜单");
scanf ("%d", &t);
}while (0 == t);
}
void zuoye3_1()
{char c1,c2,c3,c4,c5;
printf("请输入任意5个字母:\n");
c1=getchar();
c2=getchar();
c3=getchar();
c4=getchar();
c5=getchar();
c1=c1+4;
c2=c2+4;
c3=c3+4;
c4=c4+4;
c5=c5+4;
printf("这五个字母的后四个字母分别为:\n");
putchar(c1);
putchar(c2);
putchar(c3);
putchar(c4);
putchar(c5);
putchar('\n');
}

开始不选择地3章第一题,先循环,在选择3章第1题就会出现这种情况,没插函数之前是能正常运行的,求解
应该是你的scanf接收到了缓冲逗知区里的旧内容,梁闭
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影橡指裂响的scanf前面加rewind(stdin);

或者在scanf("%d", x)的%d前面加一个空格