Scanf函数非法输入的处理

xiaoxu1148 2015-11-01 05:00:44
先看一段极常见的程序
    
#include<stdio.h>
int main()
{
int a,b,c; /*计算a+b*/
scanf("%d%d",&a,&b);
c=a+b;
printf("%d+%d=%d",a,b,c);
return 0;.
}

问题来了:如果我输入的是“1 c”这种非法数据,那么只有a被正确赋值。
如何能够完成:若输入的数据是非法的(不是两个数字),要求用户重新输入,直到输入的是合法数据为止?
如上述程序中,输入"1 c"后要求重新输入,再输入"c d"后又要求重新输入,最后输入"1 2",则运行加法输出结果

试过了以下代码无效,为什么?

int main()
{
int a,b,c; /*计算a+b*/
int input=scanf(" %d %d",&a,&b);
while(input!=2)
{
fflush(stdin);
input=scanf(" %d %d",&a,&b);
}
c=a+b;
printf("%d+%d=%d",a,b,c);
return 0;
}
...全文
1239 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-11-02
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
int main()
{
    int a,b,n,v,r,k;
    char buf[80];
    char *p;

    k=0;
    r=EOF;
    while (1) {
        if (EOF==r) {
            fgets(buf,80,stdin);
            p=buf;
        }
        while (1) {
            r=sscanf(p,"%d%n",&v,&n);
            if (1==r) {k++;break;}
            if (EOF==r) break;
            p++;
        }
        if (EOF==r) continue;
        p+=n;
        if (1==k) a=v;
        if (2==k) {
            b=v;
            break;
        }
    }
    printf("%d,%d\n",a,b);
    return 0;
}
ChampangeYo 2015-11-02
  • 打赏
  • 举报
回复
引用 5楼wang0635 的回复:
代码哪里无效了? 没问题啊
你输入错误的格式,可以提示继续输入?输出结果贴上来看看?
wang0635 2015-11-01
  • 打赏
  • 举报
回复
代码哪里无效了? 没问题啊
ChampangeYo 2015-11-01
  • 打赏
  • 举报
回复
楼主的那个循环是个死循环,fflush的作用只是清空输入流,但是后面的读取一直可以是0。你可以做一个实验试一下。 另外,上面我那段代码还有个缺陷,输入1,3e时也会认为是正确结果。 考虑到fflush是微软自己引进的一个函数,它的机能不是很明确改进为(这种机制可以识别1,3e的错误):
  1 #include<stdio.h>
  2 int main()
  3 //计算过程中保证只有1,3形式输入才计算,1 3和1,e等
  4 //认为是错误输入。直到正确输入才开始计算。
  5 {
  6 int i,j,a,b,c; /*计算a+b*/
  7 int input;
  8 char t;
  9 for(i=0;;i++)
 10 {
 11 j=0;
 12 input=scanf("%d,%d",&a,&b);
 13 while((t=getchar())!='\n'&& t!=EOF) j++;
 14 if(input==2 && j==0) break;
 15 }
 16 c=a+b;
 17 printf("%d+%d=%d\n",a,b,c);
 18 return 0;
 19 }
这种形式scanf("%d,%d")的正确输入格式是var1,var2;如果需要var[空格]var形式,对应改为scanf("%d%d")即可。
skyline@kaja 2015-11-01
  • 打赏
  • 举报
回复
楼主的意思是第二段代码输入非法数据的时候程序不提示重新输入?
ChampangeYo 2015-11-01
  • 打赏
  • 举报
回复
  1 #include<stdio.h>
  2 int main()
  3 {
  4 int i,a,b,c; /*计算a+b*/
  5 int input;
  6 char t;
  7 for(i=0;;i++)
  8 {
  9 input=scanf("%d,%d",&a,&b);
 10 fflush(stdin);
 11 if(input==2) break;
 12 scanf("%c",&t);
 13 }
 14 c=a+b;
 15 printf("%d+%d=%d",a,b,c);
 16 return 0;
 17 }
gcc编译通过,前提是输入方式是1,3,1 3认为是不合格的输入。
lm_whales 2015-11-01
  • 打赏
  • 举报
回复
输入的数据,和格式符号个数相等,表示成功, 函数返回值 就是成功输入的个数 返回值不等于格式要求输入的数据个数以及 0,EOF等表示输入失败 返回正数 表示至少有一个输入成功, 返回值和要求输入的个数相同,表示输入成功 输入失败,包括不完全成功,最好清掉输入缓存

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧