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