难道不循环吗?

时间:2019-05-01 09:51:51

标签: c do-while

我是一个开始学习C的初学者。我想使用C编写一个程序,以帮助用户输入编号。只要他们想要,一旦完成,程序将显示否。输入正数,负数和零。我正在尝试使用do-while lopp做到这一点。它只执行一次,但不会循环执行。我想知道我在这里做错了什么吗?

#include <stdio.h>
int main ()
{
    int a,p=0,n=0,z=0;
    char c;

    do
    {
       printf("enter a no.\n");
       scanf("%d", &a);

       if (a>0)
       {
            p++;
       }
       else if (a==0)
       {
            z++;
       }
       else if(a<0)
       {
            n++;
       }

       printf("input more no.? y or n\n");
       scanf("%c\n", &c);
    } while (c=='y');

    printf("the total count of positive, negative and zeros are %d %d %d\n", p,n,z);

    return 0;
}

预期结果是:

  

输入号码

     

4

     

输入更多号码? y或n

     

y

     

输入号码

     

3

     

输入更多号码? y或n

     

y

     

输入号码

     

-1

     

输入更多号码? y或n

     

n

正数,负数和零的最终计数为2 1 0

但是实际输出的是:

  

输入号码

     

4

     

输入更多号码? y或n

     

y

正数,负数和零的最终计数为1 0 0

2 个答案:

答案 0 :(得分:2)

您的问题是两个独立问题的组合。

第一个是scanf格式字符串中的任何空格字符都告诉scanf读取(并丢弃)输入中的任何连续空格。

但是要知道输入中空格的结束位置,它需要查看不是空格的东西。这就是为什么格式字符串中的尾部空格会迫使您(用户)输入其他内容。

第二个问题是,对于上一个输入操作(scanf("%d", &a)),您可能按 Enter 键将输入“发送”到程序。此 Enter 键将作为换行符(是空格字符)放入输入缓冲区。然后,当您使用"%c"格式读取字符时,它将读取该换行符。您需要跳过该换行符。

两个问题的解决方法相同:请scanf读取(并丢弃)前导空白。可以通过将空格放在格式字符串的开头来实现,如

scanf(" %c", &c);
//     ^
// Note space here instead

还请注意,"%c""%["格式仅需要显式跳过前导空白,所有其他格式都暗含此功能。

答案 1 :(得分:0)

您混合使用数字的读取和字符的读取,您不想让该字符通常在换行符之后输入,但是当前您会得到该换行符。

要绕过分隔符(空格/换行符),只需在%c之前添加一个空格,而无需指定换行符:scanf(" %c", &c);

之后:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
enter a no.
4
input more no.? y or n
y
enter a no.
3
input more no.? y or n
y
enter a no.
-1
input more no.? y or n
n
the total count of positive, negative and zeros are 2 1 0
pi@raspberrypi:/tmp $