带有“getopt”的分段错误
Segmentation Fault with `getopt`
我有一个处理参数两个三个全局变量的函数。它适用于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;
}
在 -s
的处理程序中,您不检查optarg
为 0。但是您在选项字符串中s
后指定两个冒号:(来自man 3 getopt
):
两个冒号表示一个选项需要一个可选的参数;如果当前 argv-element 中有文本(即,与选项名称本身使用相同的单词,例如"-oarg"),则以 optarg 返回,否则
optarg
设置为零。 这是一个 GNU 扩展。
当 shell 在调用 program -s 3
后启动程序时,它会在 argv
向量中提供三个元素:
0: program
1: -s
2: 3
通常,getopt
会将其解释为与调用program -s3
相同,并且很难看到更改此行为的理由。但是,gnu 为您提供了这样的选项,允许您将program -s 3
解释为没有参数和位置参数3
的-s
选项。一旦你走上这条路,你必须在尝试使用它之前检查optarg
是否0
。
我怀疑你并不是真的想启用这个 gnu 扩展。很少有应用程序会从中受益。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?