C语言Scanf()死循环问题。

输入字母或者不是数字的话他就死循环了怎么解决呢?如果输入字母,如何返回到重新输入的地方。#include<stdio.h>#include<math.h>intmain(... 输入字母或者不是数字的话 他就死循环了 怎么解决呢?
如果输入字母,如何返回到重新输入的地方。

#include <stdio.h>

#include <math.h>
int main()
{
int x,a,b,c,p;
char ch;
p=1;
do{
printf("\n请输入一个三位数:");
scanf("%d",&x);
if(x>=100 && x<=999)
{
a=x/100;
b=x/10%10;
c=x%10;
// printf("%d %d %d\n",a,b,c);
if(x==pow(a,3)+pow(b,3)+pow(c,3))
printf("\n是水仙花数!\n");
else
printf("\n不是水仙花数!\n");
printf("\n是否继续?(Y/N)\n");
scanf("%c",&ch);
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
p=1;
else
p=0;
}
else
printf("\n请输入正确的三位数!\n");

// printf("%d P:",p);
// scanf("%d",&x);

}

while(p!=0);
}
展开
 我来答
jhanker
2015-10-09 · TA获得超过1479个赞
知道小有建树答主
回答量:675
采纳率:73%
帮助的人:499万
展开全部

把scanf()换成下面例子中的函数试试:

#include <stdio.h>
#include <stdlib.h>
#define    HEAD_N   10  //Input_uint(FILE *fp)函数中限制输入的最大整数位数
int Input_uint1(); //无符号整形输入函数
int Input_uint2(int digit);//无符号整形输入函数截取前digit位
int main()
{
  int a,b;
  printf("请输入赋值给变量a的整数:");
a=Input_uint1();
  printf("请输入赋值给变量b的整数(截取前3位):");
b=Input_uint2(3);
  printf("a=%d;b=%d\n",a,b);
return 0;
}
int Input_uint1() 
{
     int count_a=0,ratio=1,count_c=0,number=0,judge=1;
     //count_a计数变量;ratio转换系数,1,10,100等;
     // count_c计数变量;number函数返回值;
     // judge输入判断变量,-1出错;
char str[HEAD_N];
    
for (count_a=0;count_a<HEAD_N;count_a++)
str[count_a]='0';
     do
{
    if (judge==1) ;
      else
{
            printf("\n输入错误。请输入一个大于等于零的整数:"); 
}
         judge=1;
 
         for(count_a=HEAD_N-1,count_c=HEAD_N-1;count_a>=0;count_a--,count_c--)
{
             str[count_a]=getchar();
             if(!((str[count_a]>='0' && str[count_a]<='9') || (str[count_a]==10)))
          judge=-1;
             if(str[count_a]==10 || count_a==0)
{  
           if(str[count_a]==10)
break;
   if(str[count_a]!=10 && count_a==0)
{   
       for(;;)
{
                        count_a=getchar();
           if(!((count_a>='0'&& count_a<='9') || (count_a==10)))
                    judge=-1;
           if (count_a==10)
              break;
}
}
            count_a=0;
}
}
         if (judge>0)
{
              for(count_a=count_c+1;count_a<HEAD_N;count_a++)
 {   
             if (str[count_a]>='0' && str[count_a]<='9')
 {
         number+=(str[count_a]-'0')*ratio;
                      ratio*=10;
 }
                  else
                 break;
 }
}
}while(judge<0);
     return number;
}
int Input_uint2(int digit) 
{
     int count_a=0,ratio=1,count_c=0,number=0,judge=1;
     //count_a计数变量;ratio转换系数,1,10,100等;
     // count_c计数变量;number函数返回值;
     // judge输入判断变量,-1出错;
char str[HEAD_N];
if (digit>HEAD_N)
digit=HEAD_N;
    
for (count_a=0;count_a<digit;count_a++)
str[count_a]='0';
     do
{
    if (judge==1) ;
      else
{
            printf("\n输入错误。请输入一个大于等于零的整数:"); 
  } 
         judge=1;
 
         for(count_a=digit-1,count_c=digit-1;count_a>=0;count_a--,count_c--)
{
             str[count_a]=getchar();
             if(!((str[count_a]>='0' && str[count_a]<='9') || (str[count_a]==10)))
          judge=-1;
             if(str[count_a]==10 || count_a==0)
{  
           if(str[count_a]==10)
break;
   if(str[count_a]!=10 && count_a==0)
{   
       for(;;)
{
                        count_a=getchar();
           if(!((count_a>='0'&& count_a<='9') || (count_a==10)))
                    judge=-1;
           if (count_a==10)
              break;
}
}
            count_a=0;
}
}
         if (judge>0)
{
              for(count_a=count_c+1;count_a<digit;count_a++)
 {   
             if (str[count_a]>='0' && str[count_a]<='9')
 {
         number+=(str[count_a]-'0')*ratio;
                      ratio*=10;
 }
                  else
                 break;
 }
}
}while(judge<0);
     return number;
}
ilvwhy
推荐于2018-05-04 · TA获得超过1.3万个赞
知道大有可为答主
回答量:1.7万
采纳率:81%
帮助的人:2825万
展开全部
问题出在scanf("%d",&x);它会读入上面输入残留的信息。
你可以用fflush(stdin);清除残余后再读
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cjj030813
2015-10-09
知道答主
回答量:10
采纳率:0%
帮助的人:3.4万
展开全部
判断输入的是否为数字,不是数字忽略,if(isalpha(x)){continue;}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhl_xina2000
2015-10-09 · TA获得超过267个赞
知道小有建树答主
回答量:656
采纳率:0%
帮助的人:477万
展开全部
if(x>=100 && x<=999)改成if((x>=100) &&( x<=999))试试
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式