Вопрос

Я использую 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";

совершенно безопасно. Что заставляет вас думать, что это не так?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top