命令行参数读取判断异常,程序始终返回无效参数错误求助
命令行参数读取判断异常,程序始终返回无效参数错误求助
别着急呀!你的程序每次都返回错误提示,核心问题出在你用错了C++里字符串比较的方式,咱们用超简单的话讲清楚~
为什么原来的判断永远不生效?
argv[1]是C风格的字符串(类型是char*),它本质上是一串字符在内存里的地址;而"draw"这种双引号写的字符串,是另一个存放在内存里的字符串常量的地址。你用==比较这两个东西,其实是在比较“两个字符串存在哪个抽屉里”,不是比较“抽屉里的字符串内容一样不一样”!就像你把两张写着“小狗”的纸条分别放抽屉1和抽屉2,你却在比较抽屉号1和2,当然永远不相等啦😅
超简单的修复办法
咱们把argv[1]转换成C++的std::string类型,这样就能用==直接比较字符串内容啦!就像把抽屉里的纸条拿出来,直接看上面的字一样~
还要加个小保险:先判断用户有没有传命令参数(也就是argc >= 2),不然如果用户啥参数都没传,程序直接访问argv[1]会崩溃哦!
修正后的完整代码
#include <iostream> #include <string> #include <vector> #include <utility> // 假设你已经实现了这些自定义函数:draw, plot, node, matches int draw(const char* file, const char* range) { return 0; } void plot(const char* func, int range) {} double node(double x, const char* func) { return 0.0; } std::vector<std::pair<double, double>> matches(const char* file, int range, double precision) { return {}; } int main(int argc, char* argv[]) { // 先判断有没有传命令参数,防止程序崩溃 if (argc < 2) { std::cerr << "Error: Please enter a command. Use 'graph help' for more information." << std::endl; return 1; } // 把命令行第一个参数转成C++字符串,方便直接比较内容 std::string cmd = argv[1]; // 从文件绘制图像 if (cmd == "draw" && argc >= 3) { std::string second_arg = argv[2]; // 判断是否是txt文件 if (second_arg.size() >=4 && second_arg.substr(second_arg.size() - 4) == ".txt") { if (argc >=4) { return draw(argv[2], argv[3]); } else { std::cerr << "Error: Missing range parameter for draw from file." << std::endl; return 1; } } // 从函数表达式绘制图像 else { if (argc >=4) { plot(argv[2], std::stoi(argv[3])); return 0; } else { std::cerr << "Error: Missing range parameter for draw from function." << std::endl; return 1; } } } // 根据x和函数表达式获取y值 else if (cmd == "get_y") { if (argc >=4) { std::cout << node(std::stod(argv[2]), argv[3]) << std::endl; return 0; } else { std::cerr << "Error: Missing x or function parameter for get_y." << std::endl; return 1; } } // 寻找函数交点 else if (cmd == "matches") { if (argc == 4) { for (std::pair<double, double> m : matches(argv[2], std::stoi(argv[3]), 0.1)) { std::cout << m.first << ": " << m.second << std::endl; } } else if (argc == 5) { for (std::pair<double, double> m : matches(argv[2], std::stoi(argv[3]), std::stod(argv[4]))) { std::cout << m.first << ": " << m.second << std::endl; } } else { std::cerr << "Error: Wrong number of parameters for matches. Use 'graph help' for info." << std::endl; return 1; } return 0; } // 帮助信息 else if (cmd == "help") { std::cout << "Commands for graph:\n" << " Draw a graph for one or multiple functions: graph draw <file.txt> <range>\n" << " graph draw <function> <range>\n" << " Find y value for a given x using given function: graph get_y <x> <function>\n" << " Find intersections between multiple functions: graph matches <file.txt> <range> [<precision>]\n"; return 0; } // 未知命令 else { std::cerr << "Error: Invalid command or arguments. Use 'graph help' for more information." << std::endl; return 1; } }
额外的小提醒
我还给你加了参数数量检查哦!比如用户用draw命令却没传range,程序会提示具体错误,而不是直接崩溃,这样你的程序对新手用户更友好~
现在你把代码改成这样,再运行试试,比如输入graph help,就会正常显示帮助信息啦🥳
内容来源于stack exchange
相关产品推荐
相关产品推荐

