C - 带参数的计算器

标签 c pointers parameters calculator argv

<分区>

我尝试用 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,导致未定义的行为。

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

// 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
}

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

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

关于C - 带参数的计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37116107/

相关文章:

vb.net - 如何使用参数将新任务声明为 SUB

c# - 如何为 c#7 元组中的方法参数指定默认值?

c - 如何清除内存中的char*数组?

c - 我想知道 OCIStmt 结构

C++函数调用带类型指针,参数混淆: incomplete type is not allowed

c - 如果我将值重新分配给 c 中的字符指针会发生什么

c - 非套接字或错误文件描述符上的套接字操作

c - 有人可以帮我找出这段C编程代码中的错误

c++ - 重载函数以同时获取指针或引用是不好的做法吗?

java - 从 Java 将参数传递给 VBS