2016-03-13 1 views
1

Я должен напечатать два разных выхода, если пользователь выбирает -p, а не -pc. Один с аргументом и другими без аргумента. Если я пытаюсь:Могу ли я использовать getopt в C++ для чтения символа как с аргументами, так и без них?

while((arg = getopt_long(argc, argv, "p:")) != -1) 
{ 
    switch (arg) 
    { 
    case 'p': 
     p = optarg; 
     if (p=='') 
      sflag = true; 
     if (p=='c') 
      oflag = true;   
     break; 
} 

Тогда -pc работает, но если я пытаюсь -p, я получаю сообщение об ошибке сказав ожидает аргумент. Как я могу обработать необязательный аргумент параметра?

ответ

1

Вы используете GNU? Если это так, вам повезло. Из docs:

опции аргумент является строкой, которая определяет опции символы, которые действительны для данной программы. Символу опций в этой строке может следовать двоеточие (:), чтобы указать, что он принимает требуемый аргумент. Если за символом параметра следуют два двоеточия (::), его аргумент необязателен; это расширение GNU.

Таким образом, вы хотите:

while((arg = getopt_long(argc, argv, "p::")) != -1) 
+0

Большое спасибо за это. Да, я использую GNU. – maverick

0

Я отправляю мой код здесь, и я использую два двоеточия в коде

int main(int argc, char **argv){ 
char op= '\0'; 
char arg = '\0'; 
while((arg = getopt(argc, argv, "p::")) != -1){ 
switch (arg){ 
case 'p': op = *optarg; 
if (op=='c') 
flagp = true; 
else if (op=='') 
flago = true; 
else 
cout<<"Invalid parameter"<<endl; 
}} 

I am getting a empty character constant as an error and if I leave it blank as shown above 

`и другой подход, как показано ниже если я не буду использовать иначе ».

case 'p': op = *optarg; 
      flagp = true; 
} 
It does not take -p as an argument. Compiler gives me a segmentation dump error. But if i use any argument like px then it sets the flagp as true. 
+0

Я использовал это {else if (op == '\ 0')} в приведенном выше коде для разрешения пустой постоянной ошибки, но все же ошибка сегментации (сбрасывается ядром). – maverick

Смежные вопросы