在 C 中创建简单计算器时出现问题

Issue while creating a simple calculator in C

我正在用 C 语言创建一个非常基本的计算器,但输出结果不尽如人意。

#include<stdio.h>
int main(int argc, char const *argv[])
{
    /* code */
    char ch;
    int a,b,p=0;
    scanf("%d",&a);
    while(1)
    {
        ch=getchar();
        if(ch==';')
        {
            p=2;
            break;
        }
        scanf("%d",&b);
        if(ch=='+')
        {
            a+=b;
        }
        if(ch=='-')
        {
            a-=b;
        }
        if(ch=='*')
        {
            a*=b;
        }
        if(ch=='/' && b!=0)
        {
            a/=b;
        }
        if(ch=='/' && b==0)
        {
            printf("INVALID INPUT\n");
            p=2;
            break;
        }
    }

    if(p!=0)
        printf("%d",a);
    return 0;
}

输出总是作为分配给“a”的初始值出现。

即将到来的输出-

4
+
5
;
4

预期输出 -

4
+
5
;
9

你能帮我解决这个表达式为什么没有被正确评估的问题吗?

scanf("%d",&a);

将使用输入流中的第一个数字,但会在输入流中保留换行符。

因此,当您稍后调用

ch=getchar();

它将读取换行符。它不会读取 + 字符。

如果您想阅读 + 字符,则可以将该行更改为以下内容:

scanf( " %c", &ch );

此行将首先丢弃所有空白字符并匹配输入流中的第一个非空白字符。

之后,您的程序将具有所需的输出:

4
+
5 
;
9

另一种解决方案是在每次调用使用 %d 格式说明符的 scanf 后丢弃该行的其余部分。这样,之后立即调用 getchar 应该会按预期读取 + 字符。

您可以使用以下代码丢弃输入行的剩余部分:

//discard remainder of input line
{
    int c;

    do
    {
        c = getchar();

    } while ( c != EOF && c != '\n' );
}

这里有一个更紧凑的写法:

//discard remainder of input line
for ( int c; (c=getchar()) != EOF && c != '\n'; )
    ;

唯一的问题是扫描输入。
作为制表符或新行必须分隔提供给 scanf 的值。

简单来说就是在scanf的末尾加上\n即可。

scanf("%d\n", &a);
scanf("%d\n", &b);

应该这样做。