这是一个具有两个功能的菜单驱动程序。一切正常,如果我输入数字,但当我输入字符时,它有时会运行无限次:( 就像当我输入整数它工作正常,如果我输入char它显示一些垃圾值,然后再次尝试选项显示,我再次输入char它无限次运行
#include<stdio.h>
#include<conio.h>
#include<math.h>
void cal()
{
int x,y,z;
printf("enter two numbers\n");
scanf("%d%d",&x,&y);
z=x+y;
printf("%d\n",z);
}
void mul()
{
int x,y,z;
printf("enter two numbers\n");
scanf("%d%d",&x,&y);
z=x*y;
printf("%d\n",z);
}
void main()
{
int x,c;
clrscr();
menu :
printf("1.sum\n");
printf("2.mul\n");
printf("enter choice\n");
scanf("%d",&x);
switch(x)
{
case 1:cal();break;
case 2:mul();break;
default :printf("try again\n");
}
printf("press 5 to run another function\n");
scanf("%d",&c);
if(c==5)
{
goto menu;
}
getch();
}
答案 0 :(得分:0)
您可以尝试更新您的gcc编译器。我在gcc 4.8上运行了代码,代码也终止了。 否则,如果你真的想要处理字符,你可以使用char指针(字符串)进行输入,然后使用atoi(str)将其存储在int变量中,然后处理它。您可以检查:如果用户输入字符(使用isalpha()),则终止代码。
示例代码:(运行得很好)
char *s = malloc(64);
scanf("%s",s);
if(isalpha(s[0]))
return ;
else
int x = atoi(s);
int sum = x + 1; //or whatever manipulations you need to do
答案 1 :(得分:0)
&#34;当我输入角色时,它有时会无限次地运行......&#34;
尝试阅读int
的所有代码都使用以下某种类型。输入非数字数据时,scanf("%d", ...
不消耗该IO(将其留作下一个IO操作),不将c
设置为任何值,然后返回0(未测试) )。此时c
具有scanf()
调用之前的任何值。由于c
未初始化,因此其值可能是任何值 - 因此@BLUEPIXY建议的未定义行为
int c;
...
scanf("%d",&c);
由于非数字数据留给下一个IO而下一个IO可能是另一个scanf("%d"
,因此代码卡在一个无限循环中。
为了最好地修复,初始化变量,通过fgets()
获取用户输入,并通过sscanf()或strtol()
确定值。
int c = 0;
char buf[80];
if (fget(buf, sizeof buf, stdin) == NULL) Handle_EOForIOerror();
if (sscanf(buf, "%d",&c) != 1) Handle_NonNumericInpupt();