Получить optarg как строковый объект C ++ - PullRequest
2 голосов
/ 06 марта 2009

Я использую getopt_long для обработки аргументов командной строки в приложении C ++. Все примеры показывают что-то вроде printf("Username: %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;
        }
}

Приведенный выше код компилируется, но когда он выполняется, я получаю ошибку Illegal instruction, если я пытаюсь распечатать значение 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, но из-за большого количества ошибок памяти, возникающих из-за этой ошибки, мне было трудно точно определить, что может быть причиной этой ошибки.

Ответы [ 3 ]

7 голосов
/ 06 марта 2009

Вы сказали printf, что добавляете строку стиля c (массив символов с нулевым символом в конце) при указании% s, но вместо этого вы указали класс строки. Предполагая, что вы используете std :: string try:

printf("bar : %s\n", bar.c_str());
6 голосов
/ 06 марта 2009

printf() не может обрабатывать C ++ string s. Вместо этого используйте bar.c_str().

3 голосов
/ 06 марта 2009
cout << " bar: " << bar << "\n";

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

...