使用`getopt`进行分段错误

时间:2013-11-17 13:30:38

标签: c++ c++11 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;
}

1 个答案:

答案 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扩展。很少有应用程序可以从中受益。