【问题标题】:Simple Calculator using c problems使用 c 问题的简单计算器
【发布时间】:2017-07-16 11:14:58
【问题描述】:

我是 C 新手,我正在尝试制作一个简单的计算器

#include <stdio.h>
#include <stdlib.h>

int main() {
    int firstNumber, secondNumber, answer;
    char mathSign[20];

    printf("Enter first number \n");
    scanf("%d", &firstNumber);

    printf("Enter sign \n a - Add \n s = Subtract \n m - Multiply \n d - Divide \n");
    scanf("%s", mathSign);

    printf("Enter second number \n");
    scanf("%d", &secondNumber);

    if (mathSign == 'a') {
        answer = firstNumber + secondNumber;
    } else if (mathSign == 's') {
        answer = firstNumber - secondNumber;
    } else if (mathSign == 'm') {
        answer = firstNumber * secondNumber;
    } else if (mathSign == 'd') {
        answer = firstNumber / secondNumber;
    }

    printf("Your answer is %d", answer);

    return 0;
}

由于某种原因,答案总是以52 结尾。我应该让整数加倍吗?

【问题讨论】:

  • mathSign 是一个数组,即一个字符串。您使用strcmp 比较字符串。或者您可以将mathSign 的第一个字符 与另一个字符进行比较。
  • 为什么要使用 char 数组?您可以在这里简单地使用 char
  • 您应该阅读编译器发出的警告。
  • 使用switch case,例如使用字符串的第一个字符
  • @ManjinderSinghHanjra chararray of char 是两个不同的术语。第一个对应单个字符,第二个对应一个或多个字符的序列(这不是字符串,我错了)。

标签: c


【解决方案1】:

试试这个代码。这应该有效。此外,这将是优化的。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int firstNumber, secondNumber, answer;
    char mathSign;

    printf("1.Enter first number \n");
    scanf("%d", &firstNumber);

    printf("Enter sign \n a - Add \n s = Subtract \n m - Multiply \n d - Divide \n");
    scanf(" %c", &mathSign);

    printf("Enter second number \n");
    scanf("%d", &secondNumber);

    switch (tolower(mathSign)) {
    case 'a':
        answer = firstNumber + secondNumber;
        break;
    case 's':
        answer = firstNumber - secondNumber;
        break;
    case 'm':
        answer = firstNumber * secondNumber;
        break;
    case 'd':
        answer = firstNumber / secondNumber;
        break;
    default:
        printf("Invalid Choice");
        break;
    }

    printf("Your answer is %d", answer);
    return 0;
}

【讨论】:

    【解决方案2】:

    你测试了mathSign == 'a',但mathSign是一个数组,所以你应该写mathSign[0] == 'a'。编译器应该产生警告。您不应忽略这些警告,它们表明问题通常是真正的错误。您可以通过提高警告级别来获得更多有用的诊断信息:gcc -Wall -W -Werrorclang -Weverything -Werror...

    注意scanf("%s", mathSign); 如果用户键入的单词超过 19 个字符,将导致缓冲区溢出。您应该使用以下方法保护目标数组:

    scanf("%19s", mathSign);
    

    此外,您应该检查转换是否成功,否则如果输入无法转换并且您使用仍未初始化的值,您可能会出现未定义的行为。

    您可以使用" %c" 来读取单个字符并使用经典运算符来提高可读性。注意%c 之前的空格:它让scanf() 跳过待处理的空白字符,例如上一个响应中的换行符。

    这是修改后的版本:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int firstNumber, secondNumber, answer;
        char mathSign;
    
        printf("Enter first number: ");
        if (scanf("%d", &firstNumber) != 1)
            return 1;
    
        printf("Enter operation\n + - Add\n - = Subtract\n * - Multiply\n / - Divide\n");
        if (scanf(" %c", &mathSign) != 1)
            return 1;
    
        printf("Enter second number: ");
        if (scanf("%d", &secondNumber) != 1)
            return 1;
    
        if (mathSign == '+') {
            answer = firstNumber + secondNumber;
        } else if (mathSign == '-') {
            answer = firstNumber - secondNumber;
        } else if (mathSign == '*') {
            answer = firstNumber * secondNumber;
        } else if (mathSign == '/') {
            answer = firstNumber / secondNumber;
        } else {
            printf("unsupported operation: %c\n", mathSign);
            return 1;
        }
    
        printf("Your answer is %d\n", answer);
    
        return 0;
    }
    

    您可以使用switch 语句进一步简化程序:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
        int firstNumber, secondNumber, answer;
        char mathSign;
    
        printf("Enter a simple expression: ");
        if (scanf("%i %c%i", &firstNumber, &mathSign, &secondNumber) != 3)
            return 1;
    
        switch (mathSign) {
          case '+': answer = firstNumber + secondNumber; break;
          case '-': answer = firstNumber - secondNumber; break;
          case '*': answer = firstNumber * secondNumber; break;
          case '/': answer = firstNumber / secondNumber; break;
          case '%': answer = firstNumber % secondNumber; break;
          default: 
            printf("unsupported operation: %c\n", mathSign);
            return 1;
        }
        printf("the result is %d\n", answer);
        return 0;
    }
    

    【讨论】:

    • 谢谢!但是,每当我不将其设为数组时,它都会跳过要求 mathsSign 的整个部分
    • @AntonTruong: @AntonTruong: char mathSign; scanf("%c", &amp;mathSign); 确实有一个问题:在需要运算符之前跳过待处理的空格,否则您可能会将待处理的换行符读入mathSign。为此,您可以将格式字符串更改为scanf(" %c", mathSign)
    【解决方案3】:

    当您只使用mathSign 时,它是一个指向数组的指针。 要访问第一个元素,您必须使用 mathSign[0]。

    另外,由于您只对符号的一个字符感兴趣,您可以声明 char mathSign 而不是 char mathSign[20] 然后使用 scanf(" %c", mathSign); 读取符号字符 在这种情况下,比较 mathSign == 'a 是正确的。

    【讨论】:

    • 必须在运算符之前跳过待处理的空格,否则您可能会将待处理的换行符读入mathSign。为此,您可以将格式字符串更改为scanf(" %c", mathSign)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多