Я использую 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
Возможно, это не проблема, но я не думаю, что вы используете 'optarg', если это правильно. Этот указатель изменяется каждый раз, когда вы вызываете 'getopt()', поэтому, когда он возвращает '-1',' optarg' будет неопределенным. Вы должны использовать локальную переменную, чтобы сохранить ее значение. – rodrigo
помните, что из-за '" d: "' имя пути интерпретируется как аргумент '-d', но в 'case 'd'' вы ничего не делаете с' optarg' –
Первое, что я хотел бы сделать, это добавить код для печати значений 'argv [1]', 'argv [2]' и т. д. Это либо устранит, либо подтвердит возможность того, что проблема находится в 'getopt' или в вашем использовании. 'getopt' может работать только с содержимым массива' argv'. –