你如何获得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;
}
答案 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()
我希望
$ ./opt -a 5 -c something A: 1 File: 2: 5 File: 3: -c File: 4: something $
和-a
选项进行参数化。我要做的是我有两个函数接受两个参数,所以如果设置了-b
,那么我想调用函数-a
如果a
则调用函数{{1 }}。我需要两个值来调用函数。
鉴于澄清,代码可能如下所示:
-b
示例运行:
b