我有一个处理两个三个全局变量的参数的函数。
它适用于program -s3
,但如果我在s
和参数之间放置一个空格,即使我使用atoi
删除空格,我也会遇到分段错误。
以下是代码:
bool handleArgs(int argc, char *argv[])
{
int arg;
bool rtVal = true;
while (true)
{
static struct option long_options[] =
{
{"steps", optional_argument, 0, 's'},
{"walks", optional_argument, 0, 'w'},
{"dimensions", optional_argument, 0, 'd'},
{nullptr, 0, 0, 0}
};
int option_index = 0;
arg = getopt_long (argc, argv, "s::w::d::",long_options, &option_index);
if(arg == -1)
{
break;
}
switch(arg)
{
case 0:
std::cout << long_options[option_index].name << std::endl;
if (optarg)
std::cout << " with arg " << optarg << std::endl;
break;
case 's':
std::cout << "option -s with value " << atoi(optarg) << std::endl;
break;
case 'w':
std::cout << "option -w with value " << atoi(optarg) << std::endl;
break;
case 'd':
std::cout << "option -d with value " << atoi(optarg) << std::endl;
break;
case '?':
/* getopt_long already printed an error message. */
rtVal = false;
break;
default:
rtVal = false;
}
}
return rtVal;
}
答案 0 :(得分:3)
在-s
的处理程序中,您不会检查optarg
是否为0.但是您在选项字符串中s
后指定了两个冒号:(来自man 3 getopt
):
两个冒号意味着一个选项需要一个可选的arg;如果当前argv-element中有文本(即,与选项名称本身相同的单词,例如“-oarg”),则在optarg中返回,否则设置
optarg
为零。这是一个GNU扩展。
当shell在调用program -s 3
之后启动程序时,它在argv
向量中提供了三个元素:
0: program
1: -s
2: 3
通常,getopt
会将此解释与调用program -s3
相同,并且很难看到改变此行为的理由。但是,gnu可以帮助您提供这样的选项,允许您将program -s 3
解释为-s
选项而不需要参数和位置参数3
。沿着这条路前进后,您必须先检查optarg
是否0
才能使用它。
我怀疑你真的不想启用这个gnu扩展。很少有应用程序可以从中受益。