getchar()在下面的程序中不起作用,有人能帮我解决这个问题吗。我试着用scanf()函数代替getchar(),但它也不起作用。
我无法找出问题的根本原因,有人能帮我吗?
#include<stdio.h>
int main()
{
int x, n=0, p=0,z=0,i=0;
char ch;
do
{
printf("nEnter a number : ");
scanf("%d",&x);
if (x<0)
n++;
else if (x>0)
p++;
else
z++;
printf("nAny more number want to enter : Y , N ? ");
ch = getchar();
i++;
}while(ch=='y'||ch=='Y');
printf("nTotal numbers entered : %dn",i);
printf("Total Negative Number : %dn",n);
printf("Total Positive number : %dn",p);
printf("Total Zero : %dn",z);
return 0 ;
}
代码已从"Yashvant Kanetkar"的书中复制
我认为,在您的代码中,问题在于中剩余的n
scanf("%d",&x);
您可以将扫描语句更改为
scanf("%d%*c",&x);
以吃掉CCD_ 2。然后,下一个getchar()
将按预期等待用户输入。
也就是说,getchar()
的返回类型是int
。您可以查看手册页了解详细信息。因此,返回的值可能并不总是适合char
。建议将ch
从char
更改为int
。
最后,推荐的main()
的签名是int main(void)
。
这是因为scanf()
在输入中留下了尾随的换行符。
我建议更换这个:
ch = getchar();
带有:
scanf(" %c", &ch);
请注意格式字符串中的前导空格。需要强制scanf()
忽略每个空白字符,直到读取到非空白字符为止。这通常比在前一个scanf()
中消耗单个字符更健壮,因为它忽略了任何数量的空格。
当用户输入x
并按下回车键时,在scanf()
操作后,换行符将留在输入流中。然后,当您尝试使用getchar()
读取字符时,它会读取相同的换行符。简而言之,ch
得到换行符的值。您可以使用循环来忽略换行符。
ch=getchar();
while(ch=='n')
ch=getchar();
当您使用scanf
newline
0等时,您输入的所有内容都以字符串(字符序列)的形式存储在stdin
(标准输入)中,然后程序使用所需内容,并将剩余内容保留在stdin
中。
例如:456是{'4','5','6',' '}
,4tf是{'4','t','f',' '}
和scanf("%d",&x);
。如果您要求程序读取一个整数,在第一种情况下将读取456并将{' '}
留在stdin
中,在第二种情况下读取4并将其留在{''t','f', '}
中。
在scanf
之后,您应该使用fflush(stdin)
来清除输入流。
用scanf(" %c", &ch);
替换ch = getchar();
对我来说很好!
但在scanf
后使用fflush(stdin)
无效。
我的建议是定义一个类似的宏
#define __GETCHAR__ if (getchar()=='n') getchar();
然后你可以像这样使用它:
printf("nAny more number want to enter : Y , N ? ");
__GETCHAR__;
我同意这不是最好的选择,但它更优雅一点。
再添加一行ch = getchar();
介于scanf("%d",&x);
和ch = getchar();
之间那么你的代码就能正常工作。
因为当你接受用户的输入时,在这个时候,你在整数值后面按一个新行n
,然后变量ch
通过这行代码ch = getchar();
存储这一新行,这就是为什么你的程序崩溃,因为条件不能正确工作。
因为我们知道新行n
也是一个字符,这就是代码崩溃的原因。
因此,为了跳过这条新行n
,再加一次ch = getchar();
比如
ch = getchar(); // this line of code skip your new line when you press enter key after taking input.
ch = getchar(); // this line store your char input
或
scanf("%d",&x);
ch = getchar(); // this line of code skip your new line when you press enter key after taking input.
代码块工作正常。