关于C语言的:一个程序的漏洞修补

来源:百度知道 编辑:UC知道 时间:2024/06/04 17:15:57
这是我学VC时编的一个程序:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int e=0,h,l;
int a,b;
void sui(void);
void main(void)
{
int n;
while(e==0)
{
printf("请选择运算符号(1为加,2为减,3为乘,4为除,5为关闭程序),程序会自动生成一个运算数不超过2位数的算术式:");
scanf("%d",&n);
if(n==1)
{
sui();
printf("%d%c%d\n",a,'+',b);
h=a+b;
}
else if(n==2)
{
sui();
printf("%d%c%d\n",a,'-',b);
h=a-b;
}
else if(n==3)
{
sui();
printf("%d%c%d\n",a,'*',b);
h=a*b;
}
else if(n==4)
{
sui();
printf("%d%c%d\n",a,'/',b);
h=a/b;
}
else if(n==5)
{
exit(0);
}
else
{
printf(&q

函数scanf()在转换不成功的情况下不会清空标准输入流,因此造成程序不断的读取到同一个字符串。

解决办法,只需要在每次读取后把标准输入流清空就可以了
即在每个scanf函数后加入以下语句,fflush( stdin );

我觉得这题最好用switch分支,而且既然在“printf("请选择运算符号(1为加,2为减,3为乘,4为除,5为关闭程序),程序会自动生成一个运算数不超过2位数的算术式:"); ”输入字母时判断为错误,我觉得后面就没有再输入答案的必要了,所以我改为在“printf("请选择运算符号(1为加,2为减,3为乘,4为除,5为关闭程序),程序会自动生成一个运算数不超过2位数的算术式:"); ”前加一个" Loop:",把continue改为goto Loop;虽然在C中goto语句最好不使用,但我觉得这题足取!

在两个scanf语句后面都加上一个getchar();