为什么printf()会播放两次?

时间:2014-12-12 09:41:16

标签: c printf

我写了这个程序:

#include <conio.h>
#include <stdio.h>
void main()
{
    char ch='a';
    while(ch!='y'&&ch!='n')
    {
        printf("\nDo you want to print the output?(y/n)");
        scanf("%c",&ch);
    }
    if(ch=='y')
        printf("\n accepted!");
    getch();
}

预期产出:

Do you want to print the output?(y/n)1
Do you want to print the output?(y/n)5
Do you want to print the output?(y/n)y
accepted!

相反,我得到:

Do you want to print the output?(y/n)
Do you want to print the output?(y/n)1

Do you want to print the output?(y/n)
Do you want to print the output?(y/n)5

Do you want to print the output?(y/n)
Do you want to print the output?(y/n)y
accepted!

我不知道为什么这句话&#34;你想打印输出吗?(是/否)&#34;在输出中写两次?

4 个答案:

答案 0 :(得分:5)

Beacuse scanf接受\n字符并将其保留在缓冲区中。 要使用该角色,您可以使用:

scanf(" %c",&ch);

答案 1 :(得分:2)

这应该适合你:

(您必须删除所有'\n'并在%c)之前放置一个空格

(因为scanf将所有内容读取到\n并且新行仍然在缓冲区中,所以在下一次迭代中,新行从scanf读取)

#include <conio.h>
#include <stdio.h>
void main()
{
    char ch='a';
    while(ch!='y'&&ch!='n')
    {
        printf("Do you want to print the output?(y/n)");
        scanf(" %c",&ch);
    }
    if(ch=='y')
        printf("accepted!");
    getch();
}

所以你得到你的输出:

Do you want to print the output?(y/n)1
Do you want to print the output?(y/n)5
Do you want to print the output?(y/n)y
accepted!

答案 2 :(得分:0)

在你的函数中制作scanf。

scanf(" %c",&ch);

这样做的原因。当您输入该问题时,将按下时间输入。因此,当按下enter时,会放置换行符。所以scanf将换行符作为一个字符,然后循环将继续下一次。如果在控制字符串之前给出空格,它将跳过输入中的白线字符,然后询问输入。

答案 3 :(得分:0)

输入缓冲区问题。但是,解决方案非常简单:

而不是scanf(" %c",&ch);,请使用:

do { ch=getchar(); } while(ch=='\n');