c - 使用 getchar() 的简单 C 计算器 - 第二个操作数不正确

标签 c getchar

我的教授希望我们创建一个采用两个正操作数和一个运算符的计算器。应忽略用户输入的任何空格。

我在这段代码中遇到的问题是

else if (symbolRead == 1 && isNumber(ch)) {

num2 += (num2 * 10) + (ch - '0');
}

如果我输入 55 + 66,我反而得到 55 + 72。这可能与 ascii 有关。 6 在 ascii 中是 54,但我完全看不出 6 += (6 * 10) + (54 - '0') 如何产生 72。

这是我做的一些错误检查

请输入一个简单的算术表达式:55 + 66

添加前:num1 为 0

添加后:num1 为 5

添加前:num1 为 5

添加后:num1 为 55

添加前:num2 为 0

添加后:num2 为 6

添加前:num2 为 6

添加后:num2 为 72

我想指出,如果我这样做了,比方说,55 + 7,我将得到正确的答案,所以这与 num2 添加下一个数字的方式有关。我知道代码还有其他一些问题,但是一旦我弄清楚为什么会这样,它就相对完成了。非常感谢您的帮助!

#include <stdio.h>

int addition(num1, num2);
int subtraction(num1, num2);
float division(num1, num2);
int multiply(num1, num2);
int modulus(num1, num2);

//functions made to act like isdigit, ispunct, and isspace
int isNumber(int chara);
int isSymbol(char chara);
int isASpace(int chara);

int main() {

    int ch, num1 = 0, num2 = 0, goAgain = 1, result = 0;
    char symbol = 0;
    int symbolRead = 0;
    int error = 0;

    printf("Welcome to simple calculator simulator.\nPlease enter a simple arithmetic expression: ");
    do {
        while ((ch = getchar()) != EOF && ch != '\n') {
            if (isASpace(ch)) {
                continue;
            }
            else if (!isNumber(ch) && !isSymbol(ch)) {
                printf("ERRORr: %d is not a valid input", ch);
                error = 1;
            }   //error checking

            if (error == 0) {
                if (symbolRead == 0 && isNumber(ch)) {
                    num1 = (num1 * 10) + (ch - '0');
                }
                else if (symbolRead == 1 && isNumber(ch)) {
                    num2 += (num2 * 10) + (ch - '0');
                }
                else if (isSymbol(ch)) {
                    symbol = ch;
                    symbolRead++;
                }
            }
        }
        if (symbolRead > 1) {
            printf("ERROR: More than one symbol detected. Please try again using only positive integers.");
            error = 1;
        }
        if (error == 0) {
            switch (symbol) {
            case '+':
                printf("You have selected addition. Calculating your result...\n");
                result = addition(num1, num2);
                printf("%d + %d = %d", num1, num2, result);

                break;
            case '-':
                printf("You have selected subtraction. Calculating your result...\n");
                result = subtraction(num1, num2);
                printf("%d - %d = %d", num1, num2, result);
                break;
            case '/':
                printf("You have selected integer division. Calculating your result...\n");
                result = division(num1, num2);
                printf("%d / %d = %d", num1, num2, result);
                break;
            case '*':
                printf("You have selected multiplication. Calculating your result...\n");
                result = multiply(num1, num2);
                printf("%d * %d = %d", num1, num2, result);
                break;
            case '%':
                printf("You have selected modulus divison. Calculating your result...\n");
                result = modulus(num1, num2);
                printf("%d %% %d = %d", num1, num2, result);
                break;
            }

        }
        printf("\nWould you like to try another expression? 1 for yes and 0 for no: ");
        scanf("%d", &goAgain);

    } while (goAgain == 1);

    system("pause");
    return 0;
}
int isASpace(int chara) {
    if (chara == ' ' || chara == '\t')
        return 1;
    return 0;
}
int isNumber(int chara) {
    if (chara >= 48 && chara <=57)
        return 1;
    return 0;
}
int isSymbol(char chara) {
    if (chara == '*' || chara == '%' || chara == '+' || chara == '/' || chara == '-')
        return 1;
    return 0;
}
int addition(num1, num2) {
    return (num1 + num2);
}
int subtraction(num1, num2) {
    return (num1 - num2);
}
float division(num1, num2) {
    return (num1 / num2);
}
int multiply(num1, num2) {
    return (num1 * num2);
}
int modulus(num1, num2) {
    return (num1 % num2);
}

最佳答案

已解决。问题是由于一个小的语法错误:

num2 += (num2 * 10) + (ch - '0')

对比

num2 = (num2 * 10) + (ch - '0')

关于c - 使用 getchar() 的简单 C 计算器 - 第二个操作数不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796161/

相关文章:

C: for 循环中的 Scanf 函数比它应该多运行一次

c - 如何解释此 PMAP 输出?

c - 如何获取给定字符串的子串?

c - 通过 getchar 和 putchar 打印多行

c - 在 C 中构建词法分析器

c++ - 在 Eclipse 中使用 C 库到 C++ 项目

c - 我想 getchar 两次,但我不能

c - 为什么某些函数可以将 sleep(n) 减少为 sleep(0)?

C 将 char 转换为 int

c - Strncmp:异常段错误