C - 带参数的计算器

C - Calculator with parameters

我尝试用 C 创建一个简单的计算器。数字和运算符应该是参数。我已经有了主函数和计算函数:

主要内容:

int main(int argc, char *argv[]){
    long result;
    long number1 = strtol(argv[1], NULL, 10);
    long number2 = strtol(argv[3], NULL, 10);

    result = calculate(number1, number2, argv[2]);
    printf("Result: %li", result);

    return 0;
}

计算:

long calculate(long number1, long number2, char operator){
    long result;

    switch(operator){
        case '+': result = number1 + number2; break;
        case '-': result = number1 - number2; break;
    }
    return result;
}

当我这样启动程序时:

./calc 1 + 2

结果是0。我认为运算符参数有问题,因为当我写'+'而不是argv[2]时它起作用了。但我不知道如何修复它,它也适用于参数。

一个问题是您的 calculate 函数需要一个 char,但是您的 main 传递了一个 C 字符串。 另一个问题是,当传递了一个意外的参数时,switch 无法设置 result,导致未定义的行为。

获得编译器帮助检测此类问题的一种方法是在调用函数之前为所有函数提供原型:

// Put the prototype first
long calculate(long number1, long number2, char operator);

int main(int argc, char *argv[]){
    // main's code with the call of calculate
}

long calculate(long number1, long number2, char operator) {
    // implementation
}

有了原型,编译器会因错误停止构建,因为 argv[2]char 的预期类型不匹配。问题对您来说立即变得显而易见,您插入缺少的星号,程序开始按预期运行。

您可能会看到有关第二个问题的警告(未在某些代码路径中设置 result);你不应该忽略它,并添加一个 default 子句来产生一些输出,告诉用户出了什么问题。

我在尝试您的代码时收到警告。

$ gcc main.c 
main.c: In function ‘main’:
main.c:19:42: warning: passing argument 3 of ‘calculate’ makes integer from pointer without a cast [-Wint-conversion]
     result = calculate(number1, number2, argv[2]);
                                          ^
main.c:4:6: note: expected ‘char’ but argument is of type ‘char *’
 long calculate(long number1, long number2, char opcode){

修复警告后,似乎没问题。

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

long calculate(long number1, long number2, char opcode) {
    long result = 0;

    switch (opcode) {
        case '+':
            result = number1 + number2;
            break;
        case '-':
            result = number1 - number2;
            break;
        default: {
            break;
        }
    }
    return result;
}

int main(int argc, char *argv[]) {
    long result;
    long number1 = strtol(argv[1], NULL, 10);
    long number2 = strtol(argv[3], NULL, 10);

    result = calculate(number1, number2, *argv[2]);
    printf("Result: %li", result);

    return 0;
}

输出

$ ./a.out 4 + 4
Result: 8

(但认为它可以做优先级:$ ./a.out 4 + 4 * 2 Result: 8在真正的数学中,你有运算符优先级,所以更广泛的答案是计算器的语法,这样你就可以有递归运算符优先级。How does a simple calculator with parentheses work?)