下面C语言为什么输入字母d会无限循环输出printf("请输入命令符:n");语句,数字5以上就不会无限输出?

下面C语言为什么输入字母d会无限循环输出printf("请输入命令符:n");语句,数字5以上就不会无限输出?,第1张

图中框内的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

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12333988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存