当我输入第一个数字作为字母时,为什么我不能输入第二个数字(num2)?

时间:2016-06-20 22:32:27

标签: c addition

/ 程序添加两个整数,如果输入不是整数打印无效输出 /

#include <stdio.h>

int main()
{
int num1,num2,flag=0,sum;
char chek,chek2;

/* To check input value a integer or not*/

if(scanf("%d%c", &num1, &chek);!= 2 || chek != '\n')
  { 
      flag=flag+1;

  }  
if(scanf("%d%c", &num2, &chek2) != 2 || chek2 != '\n')
   { 
       flag=flag+1;

   }   
if(flag!=0)
    printf("invalid input\n");
else
 { 
     sum=num1+num2;
     printf("the sum is:%d",sum);
 }
 return 0;
}

1 个答案:

答案 0 :(得分:0)

scanf函数返回读取的项目数,或者更简单的说,返回分配给您的格式字符串的项目。

如果输入一个字符,则第一个scanf将返回0,因为它希望匹配一个数字并且if语句立即执行。当它到达下一个scanf时,stdin中仍有数据,因为初始字符与第一个scanf不匹配,所以它也会使第二个字符返回0.这就是为什么你在第一个字符后打印的消息输入

如果您总是想要输入第二个数字,即使第一个数字无效,您还需要确保清除stdin缓冲区,以便它可以阻止第二个数字,并等待您输入新数据。有一个名为fflush的函数可以像fflush(stdin)一样调用,但它的行为是非常不明确的,你不应该依赖它来做任何事情。

我会用一点点黑客发布你的代码,以使程序能够正常运行。

#include <stdio.h>

int main() {

    int num1,num2,flag=0,sum;
    char chek,chek2;


    if( scanf("%d%c", &num1, &chek) != 2 || chek != '\n')
    {
        flag = flag + 1;

        //Ugly hack to clear the stin buffer
        char ch;
        while ((ch = getchar()) != EOF && ch != '\n');

    }

    if( scanf("%d%c", &num2, &chek2) != 2 || chek2 != '\n')
    {
        flag = flag + 1;
    }

    if(flag!=0) {
        printf("invalid input\n");
    } else {
        sum = num1 + num2;
        printf("the sum is:%d\n", sum);
    }
    return 0;
} 

我所做的是尝试从stdin读取所有内容,直到找到新行或文件结尾。这样缓冲区为空,下一个scanf不会尝试匹配上次输入的任何剩余数据。