图中框内的scanf语句是要输入一个整数,如果输入非数字这个函数毕汪就会失败,但程序不会退出。还有最大的问题它不会把你输入的非数字字符从输入缓冲区移除稿猜,所以下次执行scanf时还是字符输入失败。不仅仅是输入d只要是非数字都会无限循环输出printf。
有两种方法可以改,一是在scanf语句后面加入while(getchar() != '\n')每次输入完把输入缓冲期字符移除
第二种判断scanf的返回值,if(scanf("%d",&num)!=1)
{
加入输键数型入失败你想怎么处理
}
这是本人写的程序:只处理正整数,负数的运算变换下即可。
#include<iostream>
using namespace std
// *** 作数和结果的位数还可以培兆任吵中裤意加,理论上可以处理无限位。(只要内存无限大!!!)
char num1[100] //第一个 *** 作数
char num2[100] //第二个 *** 作数
char result[200]//结果
//自定义加法函数
void add(char 升简*s1,char *s2)
{
int i,j,n=0
for(i=strlen(s1)-1,j=strlen(s2)-1i>=0 && j>=0i--,j--)
result[n++]=s1[i]+s2[j]-'0'
if(i>=0)
while(i>=0)
result[n++]=s1[i--]
if(j>=0)
while(j>=0)
result[n++]=s2[j--]
//处理进位问题
for(i=0i<ni++)
if(result[i]>'9')
{
result[i]-=10
result[i+1]+=1
}
//将结果逆序
char temp
for(i=0i<n/2i++)
{
temp=result[n-1-i]
result[n-i-1]=result[i]
result[i]=temp
}
result[n]='\0'
}
//自定义减法函数
void minus(char *s1,char *s2)
{
int i,j,n=0,flag=0
char temp[100]
//如果s1<s2,则交换s1和s2
if(strlen(s1)<strlen(s2) || (strlen(s1)==strlen(s2) && strcmp(s1,s2)<0))
{
flag=1
strcpy(temp,s1)
strcpy(s1,s2)
strcpy(s2,temp)
}
for(i=strlen(s1)-1,j=strlen(s2)-1j>=0i--,j--)
result[n++]=s1[i]-s2[j]+'0'
while(i>=0)
result[n++]=s1[i--]
//处理借位问题
for(i=0i<ni++)
if(result[i]<'0')
{
result[i]+=10
result[i+1]-=1
}
//去掉高位的0
while(result[n-1]=='0' && n!=1)
n--
if(flag==1)
result[n++]='-'
//将结果逆序
char ch
for(i=0i<n/2i++)
{
ch=result[n-1-i]
result[n-i-1]=result[i]
result[i]=ch
}
result[n]='\0'
}
//自定义乘法函数
void multiple(char *s1,char *s2)
{
int i,j,n
int a[200]={0}
for(i=strlen(s2)-1i>=0i--)
{
n=strlen(s2)-1-i
for(j=strlen(s1)-1j>=0j--)
a[n++]+=(s2[i]-'0')*(s1[j]-'0')
}
for(i=0i<ni++)
{
if(a[i]>9)
{
a[i+1]+=a[i]/10
a[i]%=10
}
}
if(a[n]!=0)
n+=1
for(i=0i<ni++)
result[i]=a[i]+'0'
//将结果逆序
char ch
for(i=0i<n/2i++)
{
ch=result[n-1-i]
result[n-i-1]=result[i]
result[i]=ch
}
result[n]='\0'
}
void main()
{
char ch
while(true)
{
memset(result,0,200)
cout<<"输入运算符(+,-,*):"<<endl
cin>>ch
cout<<"输入第一个 *** 作数:"<<endl
cin>>num1
cout<<"输入第二个 *** 作数:"<<endl
cin>>num2
switch(ch)
{
case '+':
add(num1,num2)
break
case '-':
minus(num1,num2)
break
case '*':
multiple(num1,num2)
break
default:
cout<<"输入错误"<<endl
break
}
cout<<"运算结果:\n"<<result<<endl
cout<<"是否继续运算?(Y/N)"<<endl
cin>>ch
if(ch!='Y' && ch!='y')
break
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)