程序计算输入中的+ 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
答案 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));
事情将开始奏效。