[英]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.