This question already has answers here:
Closed last year.
Scanf skips every other while loop in C
(10个答案)
对输入中的+ve、-ve和零进行计数的程序。for循环中的printf语句被多次执行。如何更正此代码。计数正确,但输出不是预期格式。
#include<stdio.h>
main()
{
    int n,pc,nc,zc;
    char s;
    pc=nc=zc=0;
    for(;1;) {
        printf("do you wanna enter: y/n\n");
        s=getchar();
        if(s=='y') {
            printf("enter num:\n");
            scanf("%d",&n);
            if(n>0) {
                pc+=1;
            }
            if(n<0) {
                nc+=1;
            }
            if(n==0) zc+=1;
        }
        if(s=='n') break;
    }
    printf("No.of +ve num: %d \n",pc);
    printf("No.of -ve num: %d \n",nc);
    printf("No.of zeroes: %d \n",zc);
}

输出:
xplorer@kali:~/Desktop/docs/yk/chap3$ ./a.out
do you wanna enter: y/n
y
enter num:
4
do you wanna enter: y/n
do you wanna enter: y/n
y
enter num:
8
do you wanna enter: y/n
do you wanna enter: y/n
y
enter num:
-7
do you wanna enter: y/n
do you wanna enter: y/n
n
No.of +ve num: 2
No.of -ve num: 1
No.of zeroes: 0

最佳答案

\n被前一次调用getchar留在输入缓冲区中,因为它一次读取一个字符。因为'\n'也是一个字符,所以n下一次迭代getchar读取\n剩余的内容。
您需要刷新输入缓冲区:

int c;
while((c = getchar()) != '\n' && c != EOF);

关于c - 为什么printf语句多次执行? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24379366/

10-10 09:53