C语言问题,为什么输入字母就无限循环,数字没事,怎么改,谢谢

2025-04-06 02:30:43
推荐回答(4个)
回答1:

呃,他们回答都没回答到点上…
之所以输入字母就会无限循环,是因为scanf函数的问题.
while(1)
{
do
{
printf("输入转换的原进制数:");
scanf("%ld",&b);
}while(b!=2&&b!=8&&b!=16);
在上面这段代码中,当输入的是字母时,由于scanf里的格式要求输入的是%ld,而你输入的不是这格式,所以scanf函数就会出错,并终止程序中后续的所有scanf语句,这时b的值是不会改变的(因为scanf输入错误时,它不改变b的值),b会是个未知值(因为你没对他进行初始化,而且,如果你对他初始化为2的话,那么输入字母后就会无限循环输出"输入转换之后的进制数:"),所以一直满足b!=2&&b!=8&&b!=16,所以就一直循环输出"输入转换的原进制数:".

你可以这样修改,由于scanf函数的返回值是返回输入正确的个数或返回-1(当输入ctrl+z组合键时),所以你输入字母那scanf函数是返回0的,而若输入数字则返回1.在程序里每个scanf语句都修改为类似这样的格式:
if(!scanf("%ld",&b))
{
puts("输入格式不对,请重新开始:");
return;
}
之所以是如果输入错误就结束程序,是因为一旦输入错误就会终止程序后续的所以scanf语句.

哪里有问题可追问:

回答2:

第一个dowhile循环判只认2、8、16,如果正常运行的话,输入除了以上三个数之外的都会循环再吃执行输入。
这段循环本意就是让输入正确的数字,以防止下面程序出现错误,当然如果非要加一个推出的话,可以添加一个变量来判断,如果输入与你定义的变量值相等,则不进行数据转换,直接运行到程序末尾。

回答3:

你的代码
while(1){//死循环
scanf("%d",&a);
if(a==1||a==2||a==3||a==4||a==0)break;//很明显只有01234退出循环
else{
printf("error:菜单中没有本选项,请重新输入!");
printf("请输入你选择的菜单(0---4):");
}
}你输入字母执行了else又回到while(1),这是死循环,没有break肯定一直循环

回答4:

你输入字母,字母(字母!=2、8、16)是第一个do-while循环的真实条件,所以第一个dowhile一直会进行,一直打印“输入转换的原进制数”。