You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现argv为空时执行其他逻辑?C++计算器argc/argv遇段错误

解决计算器程序中argc/argv导致的段错误及逻辑问题

问题根源

  • 空指针解引用:无命令行参数时argc=1,argv[1]为NULL,直接访问*argv[1]会触发段错误。
  • 字符串比较错误:用*argv[1] == '-t'判断选项无效,*argv[1]仅取第一个字符,无法匹配完整字符串"-t"。
  • 参数越界访问:命令行计算分支直接访问argv[3],若参数数量不足会引发未定义行为。
  • 数字转换局限性:*argv[1]-48仅能处理单个数字,无法支持多位数或浮点数。

修复后的完整代码

#include <iostream>
#include <string>
#include <sstream>
#include <cstring>  // 用于strcmp函数
using namespace std;

int main(int argc, char** argv) {
    // 情况1:无参数或指定-t选项,启动交互式模式
    if (argc == 1 || strcmp(argv[1], "-t") == 0) {
        double num1, num2;
        char op;
        char response('y');
        cout << " /=========================\\" << endl;
        cout << "( Operators are: +  -  *  / )" << endl;
        cout << " \\=========================/" << endl;
        do {
            cout << "> ";
            cin >> num1;
            cin >> op;
            cin >> num2;

            double result;
            if (cin.fail()) {
                cout << "ERROR" << endl;
                cout << "Either, you put a letter, or the calculator can't calculate." << endl;
                break;
            }
            if (op == '+') {
                result = num1 + num2;
            } else if (op == '-') {
                result = num1 - num2;
            } else if (op == '/') {
                result = num1 / num2;
            } else if (op == '*') {
                result = num1 * num2;
            } else {
                cout << "Invalid Operator" << endl;
                cout << "Exit code: ";
                continue;  // 跳过后续输出,回到循环开头
            }
            cout << result << endl;
            cout << "Do you want to enter another calculation? (Y/N) ";
            cin >> response;
        } while (response == 'Y' || response == 'y');
        return 0;
    } 
    // 情况2:传入3个参数(数字1、运算符、数字2),执行命令行计算
    else if (argc == 4) {
        try {
            double num1 = stod(argv[1]);
            char op = argv[2][0];
            double num2 = stod(argv[3]);
            double result;

            if (op == '+') {
                result = num1 + num2;
            } else if (op == '-') {
                result = num1 - num2;
            } else if (op == '/') {
                result = num1 / num2;
            } else if (op == '*') {
                result = num1 * num2;
            } else {
                cout << "Invalid Operator" << endl;
                return 1;
            }
            cout << result << endl;
        } catch (...) {
            cout << "ERROR: Invalid number format" << endl;
            return 1;
        }
    } 
    // 情况3:参数数量不符合要求,提示错误
    else {
        cout << "Usage:" << endl;
        cout << "  Interactive mode: ./calculator or ./calculator -t" << endl;
        cout << "  Command line mode: ./calculator <num1> <op> <num2>" << endl;
        return 1;
    }
    return 0;
}

关键修复点说明

  1. 参数数量判断:通过argc == 1直接识别无参数场景,避免访问argv[1]导致的空指针问题。
  2. 选项匹配:用strcmp(argv[1], "-t") == 0正确比较字符串,确保-t选项被识别。
  3. 参数合法性校验:命令行模式要求argc == 4,否则输出使用说明,避免越界访问。
  4. 安全数字转换:使用stod函数转换字符串为浮点数,支持多位数和小数,并通过try-catch捕获转换失败的异常。
  5. 运算符处理:命令行模式中取argv[2][0]作为运算符,确保单个字符的运算符被正确读取。

内容的提问来源于stack exchange,提问作者user20375569

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:35:36