为什么scanf会在这里跳过输入?

时间:2017-03-20 17:32:03

标签: c while-loop scanf

#include <stdio.h>

int main()
{
    char another;
    int num;
    do
    {
        printf("enter the number");
        scanf("%d", &num);
        printf("square of%d is %d\n", num, num * num);
        printf("want to check another number y/n");
        fflush(stdin);
        scanf("%c", &another);
    } while (another == 'y');
    return 0;
}

在上面的代码中,第二个scanf()没有被执行,因此控制台不接受输入。

5 个答案:

答案 0 :(得分:3)

根据标准,刷新stdinundefined behaviour。有关详细信息,请参阅Using fflush(stdin)

答案 1 :(得分:2)

当您为第一个scanf输入一个数字时,它后面跟着一个换行符。 %d仅取整数值,换行符仍保留在输入缓冲区中。因此,随后的scanf最终消耗了该字符,并且您的循环因另一个==&#39; y&#39;而终止。是假的。 (另一个有&#39; \ n&#39;)。

以下是解决问题的方法之一。使用%c和%d来捕获换行符并忽略它。

#include<stdio.h>
int main()
{
    char another, nl;
    int num;
    do
    {
        printf("enter the number");
        scanf("%d%c",&num,&nl);
        printf("square of%d is %d\n",num,num*num);
        printf("want to check another number y/n: ");
        //fflush(stdin);
        scanf("%c",&another);
        printf("%c", another);
    }while (another=='y');
    return 0;
}

答案 2 :(得分:0)

scanf之前输入char的原因不起作用 删除fflush并为&lt;&lt;&lt;&#&gt;%c&#34;&gt;&gt;添加空格 像这样:scanf(&#34;%c&#34;,&amp; another);

#include<stdio.h>

int main(){

    char another;

    int num;

    do
    {
        printf("enter the number ");
        scanf("%d",&num);
        printf("square of %d is %d\n",num,num*num);
        printf("want to check another number y/n ");
        scanf(" %c",&another);


    }while (another=='y');
    return 0;
}

这很棒

答案 3 :(得分:0)

如果添加语句

fseek(stdin, 0, SEEK_END);

它会将stdin指针移动到文件的末尾,因此将省略任何额外的字符。然后写第二个scanf。我的意思是:

#include<stdio.h>
int main()
{
    char another, nl;
    int num;
    do
    {
        printf("enter the number");
        scanf("%d%c",&num,&nl);
        fseek(stdin, 0, SEEK_END);
        printf("square of%d is %d\n",num,num*num);
        printf("want to check another number y/n: ");
        //fflush(stdin);
        scanf("%c",&another);
        fseek(stdin, 0, SEEK_END);
        printf("%c", another);
    }while (another=='y');
    return 0;
}

答案 4 :(得分:-1)

首先fflush;刷新流的输出缓冲区,所以你不应该在这里使用它。第二个scanf无法工作的原因是因为您正在尝试读取1位字符,在这种情况下,在第二个printf语句之后总是得到\ 0的值。希望这有帮助。