Получить optarg как строковый объект C ++
-
03-07-2019 - |
Вопрос
Я использую getopt_long для обработки аргументов командной строки в приложении C ++. Все примеры показывают что-то вроде printf (" Имя пользователя:% s \ n " ;, optarg)
в примерах обработки. Это отлично подходит для показа примера, но я хочу иметь возможность хранить значения для последующего использования. Большая часть остального кода использует объекты string
вместо char *
, поэтому мне нужно привести / скопировать / все содержимое optarg в строку.
string bar;
while(1) {
c = getopt_long (argc, argv, "s:U:", long_options, &option_index);
if (c == -1) break;
switch(c)
{
case 'U':
// What do I need to do here to get
// the value of optarg into the string
// object bar?
bar.assign(optarg);
break;
}
}
Приведенный выше код компилируется, но когда он выполняется, я получаю сообщение об ошибке Недопустимая инструкция
, если пытаюсь распечатать значение bar с помощью printf (кажется, что он отлично работает для cout). р>
// Runs just fine, although I'm not certain it is actually safe!
cout << " bar: " << bar << "\n";
// 'Illegal instruction'
printf(" bar: %s\n", bar);
Я недостаточно знаю об отладке командной строки, чтобы лучше понять, что это за недопустимая инструкция. Я запускал valgrind, но из-за большого количества ошибок памяти, возникающих из-за этой ошибки, мне было трудно точно определить, что может быть причиной этой ошибки.
Решение
Вы сказали printf, что при указании% s вы добавили строку стиля c (массив символов с нулевым символом в конце), но вместо этого вы указали класс строки. Предполагая, что вы используете std :: string try:
printf("bar : %s\n", bar.c_str());
Другие советы
printf ()
не может обрабатывать C ++ string
. Вместо этого используйте bar.c_str ()
.
cout << " bar: " << bar << "\n";
совершенно безопасно. Что заставляет вас думать, что это не так?