【问题标题】:C - Calculator with parameters [closed]C - 带参数的计算器 [关闭]
【发布时间】:2016-09-04 02:35:54
【问题描述】:

我尝试用 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。我认为operator参数有问题,因为当我写'+'而不是argv[2]时它可以工作。但我不知道如何修复它,它也适用于参数。

【问题讨论】:

  • calculate(number1, number2, argv[2]); --> calculate(number1, number2, *argv[2]);
  • 编译器警告应该被视为错误!如果您的编译器没有发出警告,请启用它们。如果它仍然没有警告,请将其丢弃并获取现代编译器。
  • 哈哈。此外,为您的 switch 指定一个 default 部分
  • argv[2][0]而不是argv[2]调用函数calculate

标签: c pointers parameters calculator argv


【解决方案1】:

一个问题是您的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 子句,它会产生一些输出来告诉用户出了什么问题。

【讨论】:

    【解决方案2】:

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

    $ 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?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      相关资源
      最近更新 更多