程序运行无限次,如果输入字符有时,有时不

时间:2014-04-08 07:46:05

标签: c

这是一个具有两个功能的菜单驱动程序。一切正常,如果我输入数字,但当我输入字符时,它有时会运行无限次:( 就像当我输入整数它工作正常,如果我输入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();
}

2 个答案:

答案 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();