而循环-getchar()在c中不起作用



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。建议将chchar更改为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 newline0等时,您输入的所有内容都以字符串(字符序列)的形式存储在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.

代码块工作正常。

相关内容

  • 没有找到相关文章

最新更新