繁体   English   中英

难道不循环吗?

[英]Do while not looping?

我是一个开始学习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

ÿ

输入一个编号

3

输入更多号码? y或n

ÿ

输入一个编号

-1

输入更多号码? y或n

ñ

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

但是实际输出是:

输入一个编号

4

输入更多号码? y或n

ÿ

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

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

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

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

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

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

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

还要注意,仅"%c""%["格式才需要显式跳过前导空格,所有其他格式都隐式地执行此操作。

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

要绕过分隔符(空格/换行符),只需在%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 $ 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM