如何实现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; }
关键修复点说明
- 参数数量判断:通过
argc == 1直接识别无参数场景,避免访问argv[1]导致的空指针问题。 - 选项匹配:用
strcmp(argv[1], "-t") == 0正确比较字符串,确保-t选项被识别。 - 参数合法性校验:命令行模式要求
argc == 4,否则输出使用说明,避免越界访问。 - 安全数字转换:使用
stod函数转换字符串为浮点数,支持多位数和小数,并通过try-catch捕获转换失败的异常。 - 运算符处理:命令行模式中取
argv[2][0]作为运算符,确保单个字符的运算符被正确读取。
内容的提问来源于stack exchange,提问作者user20375569
相关产品推荐
相关产品推荐

