如何用getopt.h获取程序参数的long-name?遇异常索引值问题
问题根源
你碰到的option_index出现32758这类异常高数值的情况,本质是**option_index变量未初始化**。
getopt_long的行为逻辑是:
- 处理长选项(比如
--output-dir、--help)时,会把匹配到的选项在longOptions数组里的索引写入option_index - 处理短选项(比如
-O、-h)时,完全不会改动option_index的值
你的代码里int option_index;是栈上变量,未初始化时会残留随机垃圾值,处理短选项时输出的就是这些垃圾值。
修复方法
给option_index加初始化即可,比如设为0:
int opt; int option_index = 0; // 初始化变量 while ((opt = getopt_long(argc, argv, "O:h", longOptions, &option_index)) != -1) { // 原有代码不变 }
如果不想在处理短选项时输出无意义的索引和选项名,可以加个简单判断:
std::cout << "Long option index: " << option_index << std::endl; // 只输出有效索引对应的选项名 if (option_index < 2) { std::cout << "Option name: " << longOptions[option_index].name << std::endl; }
测试验证
- 输入长选项
--output-dir ./test时,option_index会被自动设为0,输出正确的索引和"output-dir" - 输入短选项
-O ./test时,option_index保持初始化的0,此时如果加了判断,就不会输出无效的选项名,避免混淆。
内容的提问来源于stack exchange,提问作者Muddyblack k
相关产品推荐
相关产品推荐

