getopt命令行获取值c ++

时间:2014-11-13 03:45:29

标签: c++

你如何获得getopt中的标志值,我试过谷歌搜索它,但我得到的是如何切换案例和设置标志。我得到了下面的代码,我想要做的是有三个标志,-a,-b,-c,但只有两个标志传递,如./filename -a somevalue -c anothervalue./filename -b somevalue -c anothervalue任何帮助?

int main(int argc, char *argv[])
{
   int flagA = 0;
   int flagB = 0;

   while (1) {
    char c;

    c = getopt (argc, argv, "abc:");
    if (c == -1) {
        break;
    }
    switch (c) {
    case 'a':
        flagA = 1;
         //cout<<optarg<<endl; //I tried printing the value but it only prints the second  flag value
        break;
    case 'b':
        flagB = 1;
        cout<<optarg<<endl;
        break;
    case 'c':
        cout<<optarg<<endl;
        break;
   case '?':
    default:
       cout<<"Usage: %s [-a] [-b <something>].\n", argv[0]<<endl;
    }
   if(flagA > 0){
    //do something using the values of flagA and flagC 
   }
   else if(flagB > 0){
      //do something using the values of flagB and flagC

   }
 }
 return 0;
 }

2 个答案:

答案 0 :(得分:0)

如果您打算将optarg与标志一起使用,则该标志必须在选项字符串后面有:

        c = getopt(argc, argv, "a:b:c:");

您的用法输出语句不应该为您编译。此外,您正在尝试将C样式格式说明符混合到C ++输出流中,这是不正确的。

            cout << "Usage: " << argv[0] << " [-a] [-b <something>].\n";

答案 1 :(得分:0)

代码存在多个问题,但关键问题在于getopt()的调用。您有选项控制字符串"abc:",这意味着-a-b都没有选项。

假设您使用的是POSIX标准版getopt()而不是GNU getopt(),那么当您运行时:

./filename -a somevalue -c anothervalue
./filename -b somevalue -c anothervalue

第一个标志后的somevalue表示选项已完成,其余参数为非选项参数。在没有环境变量getopt()的情况下,GNU POSIXLY_CORRECT将置换参数列表,以便{?1}}也被识别(并且参数被置换,使-c anothervalue结束最后)。

您的代码写得更好:

somevalue

上面的代码(修改后的代码)在Mac OS X 10.10(Yosemite)上与GCC 4.9.1完全编译:

#define _XOPEN_SOURCE 600 
#include <iostream>
#include <unistd.h>
using namespace std;

int main(int argc, char *argv[])
{
    int flagA = 0;
    int flagB = 0;
    int opt;
    char *c_opt = 0;

    while ((opt = getopt(argc, argv, "abc:")) != -1)
    {
        switch (opt)
        {
        case 'a':
            flagA = 1;
            cout << "A: " << flagA << "\n";
            break;
        case 'b':
            flagB = 1;
            cout << "B: " << flagB << "\n";
            break;
        case 'c':
            c_opt = optarg;
            cout << "C: " << c_opt << "\n";
            break;
        default:
            cerr << "Usage: " << argv[0] << " [-a] [-b] [-c <something>]\n";
            return -1;
        }
    }

    if (flagA)
    {
        // do something using the values of flagA and c_opt (if set)
    }
    else if (flagB)
    {
        // do something using the values of flagB and c_opt (if set)
    }
    else if (c_opt)
    {
        // do something using just c_opt (neither flagA nor flagB is set)
    }
    else
    {
        // do something if no options are specified (report error?)
    }

    for (int i = optind; i < argc; i++)
        cout << "File: " << i << ": " << argv[i] << "\n";
    return 0;
}

BSD-ish g++ -O3 -g -std=c++11 -Wall -Wextra -Werror opt.cpp -o opt 接近POSIX标准,所以得到的结果是:

getopt()

florw.wat commented

  

我希望$ ./opt -a 5 -c something A: 1 File: 2: 5 File: 3: -c File: 4: something $ -a选项进行参数化。我要做的是我有两个函数接受两个参数,所以如果设置了-b,那么我想调用函数-a如果a则调用函数{{1 }}。我需要两个值来调用函数。

鉴于澄清,代码可能如下所示:

-b

示例运行:

b