为什么printf语句不止一次执行?

时间:2014-06-24 06:03:08

标签: c linux loops

程序计算输入中的+ ve,-ve和0的数量.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

6 个答案:

答案 0 :(得分:2)

先前调用\n

getchar在输入缓冲区中留下,因为它一次读取一个字符。由于'\ n'也是一个字符,因此下一次迭代getchar会读取\n左侧的字符。
您需要刷新输入缓冲区:

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

答案 1 :(得分:0)

...
{
printf("enter num:\n");
scanf("%d",&n);
...

&#39; scanf&#39;在上面的问题代码片段中,从stdin读取一个整数,但只有在用户按下return后才能读取。返回字符&#39; \ n&#39;也被发送到stdin,但是,上面的&#39; scanf&#39;只读取整数值,并留下&#39; \ n&#39; stdin流中的字符。下次任何函数尝试从stdin读取时,&#39; \ n&#39;人物将在那里阅读。这会在问题代码中导致不良结果:

...
{
printf("do you wanna enter: y/n\n");
s=getchar();
....

&#39; getchar&#39;功能阅读&#39; \ n&#39;来自stdin的角色,程序就会对它起作用。

避免此问题的一种方法是使用&#39; scanf&#39;功能读取残差&#39; \ n&#39;来自缓冲区的字符。这可以通过改变这个来完成:

scanf("%d",&n);

对此:

scanf("%d%*c",&n);

后者从stdin流中读取整数值,然后读取(并丢弃)残差&#39; \ n&#39;字符。

答案 2 :(得分:0)

每次从stdin读取后,使用以下命令从缓冲区中删除所有其他字符:

/* discard (flush) remaining chars in stdin */
while (ch !='\n') ch = getchar();

正如其他答案中所讨论的,在使用scanf或其他输入实用程序进行测试后,其他字符仍保留在输入缓冲区中。您无法使用任何标准函数(例如fflush)可靠地刷新输入缓冲区,因为它们适用于输出缓冲区而不适用于输入缓冲区。扫描换行符的简单while循环确保读取所有字符,无论在换行符之前是否存在回车符,因此可在大多数操作系统之间移植。

答案 3 :(得分:0)

如果您的系统上有curses.h,则可以使用flushinp功能刷新输入。 检查C常见问题解答:http://c-faq.com/stdio/stdinflush2.html

答案 4 :(得分:0)

您只检查了两个条件,即&#39; y&#39;或者&#39; n&#39;而不是为了另一个所以它可能会发生它需要输入而不是&#39; y&#39;或者以前的输入和循环继续。因此,如果它正在进行任何其他输入并进行相应的更改,则只需打印。

答案 5 :(得分:0)

替换s = getchar();与

do
{
   s=getchar();
}while (isspace(s));

事情将开始奏效。