Pergunta

Eu estou usando getopt_long aos argumentos de linha de comando processo em um aplicativo C ++. Os exemplos All Mostrar algo como printf("Username: %s\n", optarg) nos exemplos de processamento. Isso é ótimo para mostrar um exemplo, mas eu quero ser capaz de realmente armazenar os valores para uso posterior. Grande parte do resto do string usa código objetos em vez de char* então eu preciso elenco / copiar / whatever o conteúdo de OPTARG em uma string.

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;
        }
}

Os compila o código acima, mas quando ele executa eu recebo um erro Illegal instruction se eu tentar imprimir o valor de bar usando printf (parece funcionar muito bem para cout).

// Runs just fine, although I'm not certain it is actually safe!
cout << " bar: " << bar << "\n";

// 'Illegal instruction'
printf(" bar: %s\n", bar);

Eu não sei o suficiente sobre linha de comando depuração para melhor cavar o que a instrução ilegal poderia ser. Eu tinha sido executado valgrind, mas o grande volume de erros de memória que resultam deste erro têm tornado difícil para mim identificar exatamente o que pode estar causando esse erro.

Foi útil?

Solução

Você disse printf que você estava suppling uma string c estilo (null terminada matriz de caracteres) ao especificar% s, mas você forneceu uma classe string em seu lugar. Supondo que você está usando tentativa std :: string:

printf("bar : %s\n", bar.c_str());

Outras dicas

printf() não pode lidar com strings C ++. Use bar.c_str() vez.

cout << " bar: " << bar << "\n";

é perfeitamente seguro. O que faz você pensar que ele pode não ser?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top