如何创建const char* [] 读取文件参数二次调用ParseCommandLine
问题根因
- 第一个类型不兼容错误:你声明的指针数组是
char**类型,而std::string::c_str()返回的是只读的const char*,不能直接赋值给可写的char*变量。 - 第二个无匹配函数错误:
ParseCommandLine要求的第二个参数类型是const char* argv[],在C++的函数参数传递中会被隐式转换为const char**,你传入的char**类型不匹配,自然找不到对应函数。
修复方案
首先调整指针数组的类型为const char**,同时修正你原有代码里逻辑判断写反的问题:你当前的if( argc <= 2 )会把正确传入参数的场景(比如命令行参数为程序名 -i 参数文件路径,此时argc=3)判定为非法,反而会触发报错。
修正后的核心代码段如下:
int ParseCommandLine( int argc, const char* argv[]) { string inFilePath = ""; string outFilePath = ""; for( int i = 1; i < argc; ++i ) { if( string( argv[i] ) == "-i" || string( argv[i] ) == "--input") { // 检查-i后面是否有跟文件路径参数 if( i + 1 < argc ) { ifstream newIn; newIn.open(argv[i+1]); // 这里不需要再转string,argv[i+1]本身就是const char* if(!newIn.is_open()) { cerr << "Incorrect file path." << endl; return 1; } string buff; vector<string> file_args; // 可选:把程序名作为第一个参数,和main传入的argv格式对齐 file_args.push_back(argv[0]); while(newIn >> buff) file_args.push_back(buff); // 调整数组类型为const char** const char** arr = new const char* [file_args.size()]; for(int j = 0; j < file_args.size(); ++j) arr[j] = file_args[j].c_str(); // 类型匹配,不会报错 // 此时传入的arr类型是const char**,和函数要求匹配 int ret = ParseCommandLine(file_args.size(), arr); delete[] arr; newIn.close(); return ret; // 按需调整返回逻辑,如果你需要继续处理原命令行其他参数可以改这里 } else { cerr << "Request with --input option must specify a file path." << endl; return 1; } } // 其他参数处理逻辑 // ... } // 原有正常返回逻辑 return 0; }
注意事项
- 这里
file_args是局部变量,在调用ParseCommandLine的全程都不会被销毁,所以存储的c_str()指针是安全的,不会出现野指针问题。 - 原有代码中直接使用
argv[++i]拿路径参数的写法有风险:如果后续逻辑不直接return,会导致for循环重复累加i,跳过后续参数。如果需要继续处理原命令行其他参数,读取完路径后记得手动将i加1,跳过路径参数。 - 如果你需要同时处理文件里的参数和原命令行的其他参数,不要在读到文件参数后直接return,把文件读取到的参数和原命令行剩余参数合并后再调用解析函数即可。
内容的提问来源于stack exchange,提问作者Wargos
相关产品推荐
相关产品推荐

