为什么此代码在C中添加字符时会产生1?

时间:2018-11-13 14:28:06

标签: c

我试图限制用户输入字母(例如:重复输入,直到提供正确的输入),以便只添加数字。不知何故,我无法添加字母,但是没有加“ 1”

如果给出带有字符的数字,则该数字递增1。

#include<stdio.h>

int main() {
    int x,y;
    while(1)
    {
         printf("Enter a number > ");
         if(scanf("%d%d",&x,&y) != 1){
             printf("%d",x+y);
             break;
         }
    }
    return 0;
}

其背后的原因可能是什么?

1 个答案:

答案 0 :(得分:1)

scanf()返回它针对给定输入执行的成功转换次数。

使用

scanf("%d%d", &x, &y)

您要求输入两个整数,因此scanf()将成功返回2。但是,您的代码会检查!= 1,如果scanf()返回0也是正确的,因为您输入了“ a b”并且无法进行对话。

如果不是所有转换都成功,则所有不属于成功转换的字符都保留在stdin中,下一个scanf()将尝试再次解释它们并失败。为了防止这种情况发生,您必须“清除”它们:

#include <stdio.h>

int main()
{
    while(1)
    {
         printf("Enter two numbers: ");
         int x, y;  // define variables as close to where they're used as possible
         if (scanf("%d%d", &x, &y) == 2) {
             printf("%d\n", x + y);
             break;
         }
         else {
             int ch;  // discard all characters until EOF or a newline:
             while ((ch = getchar()) != EOF && ch != '\n');
         }
    }
    return 0;
}

更具意识形态的方式:

int x, y;
while (printf("Enter two numbers: "),
       scanf("%d%d", &x, &y) != 2)
{
    fputs("Input error :(\n\n", stderr);
    int ch;
    while ((ch = getchar()) != EOF && ch != '\n');
}

printf("%d\n", x + y);