2015-08-20 2 views
1

Я использую optarg. Аргумент, который я вводил, разбивается на пробелы, даже если я цитирую его.Пробелы в аргументе getopt() приводят к сбою синтаксического анализа

Мой код:

while ((c = getopt(argc, argv, "d:f:")) != -1) 
    switch (c) { 
     case 'd': 
      dflag++; 
      break; 
     case 'f': 
      fflag++; 
      break; 
     case '?': 
      if (optopt == 'd' || optopt == 'f') 
       fprintf(stderr, "Option -%c requires an argument.\n", optopt); 
      else if (isprint(optopt)) 
       fprintf(stderr, "Unknown option `-%c'.\n", optopt); 
      else 
       fprintf(stderr, 
         "Unknown option character `\\x%x'.\n", 
         optopt); 
      return 1; 
     default: 
      usage(); 
      return 1; 
    } 

if (fflag > 1 || dflag > 1 || fflag >= 1 && dflag >= 1) { 
    fprintf(stderr, "Please choose one option only."); 
    return 1; 
} 

for (index = optind; index < argc; index++) { 
    printf("Non-option argument %s\n", argv[index]); 
    usage(); 
} 

printf("%s",optarg); 

Я бегу это так:

a.exe -d "c:\Program Files\" 

Выход:

C:\Program 

Это код Getopt Я использую: https://github.com/seastorm/PuttyRider/blob/master/Wingetopt.c

+3

Возможно, это не проблема, но я не думаю, что вы используете 'optarg', если это правильно. Этот указатель изменяется каждый раз, когда вы вызываете 'getopt()', поэтому, когда он возвращает '-1',' optarg' будет неопределенным. Вы должны использовать локальную переменную, чтобы сохранить ее значение. – rodrigo

+1

помните, что из-за '" d: "' имя пути интерпретируется как аргумент '-d', но в 'case 'd'' вы ничего не делаете с' optarg' –

+0

Первое, что я хотел бы сделать, это добавить код для печати значений 'argv [1]', 'argv [2]' и т. д. Это либо устранит, либо подтвердит возможность того, что проблема находится в 'getopt' или в вашем использовании. 'getopt' может работать только с содержимым массива' argv'. –

ответ

1

Проблема заключается в ваших аргументах, а не в коде. Последние два символа в командной строке (\") приводят к тому, что последняя двойная кавычка ускользает. Поэтому ваш запрос не выполняется.

Для меня ваш код работает, если добавить косую белый символ пробела за обратной косой черты:

a.exe -d "c:\Program Files\ " 

Это также работает, если я обратный слеш перед кавычками:

a.exe -d "c:\Program Files\\" 

Я скомпилировал код в Windows 7 с помощью Visual Studio 2012. Я добавил следующие строки в начале вашего кода, чтобы он компилировался:

int c = 0; 
int dflag = 0; 
int fflag = 0; 
int index = 0; 
Смежные вопросы