Pregunta

Estoy usando getopt_long para procesar los argumentos de la línea de comandos en una aplicación C ++. Todos los ejemplos muestran algo como printf (" Nombre de usuario:% s \ n " ;, optarg) en los ejemplos de procesamiento. Esto es excelente para mostrar un ejemplo, pero quiero poder almacenar los valores para usarlos más tarde. Gran parte del resto del código usa objetos string en lugar de char * , así que necesito convertir / copiar / cualquiera que sea el contenido de optarg en una cadena.

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

El código anterior se compila, pero cuando se ejecuta, obtengo el error Instrucción no válida si intento imprimir el valor de la barra usando printf (parece que funciona bien 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);

No sé lo suficiente sobre la depuración de la línea de comandos para profundizar en lo que podría ser la instrucción ilegal. Había estado ejecutando valgrind, pero el gran volumen de errores de memoria que resultan de este error me han dificultado identificar exactamente qué podría estar causando este error.

¿Fue útil?

Solución

Le dijo a printf que estaba suministrando una cadena de estilo c (una matriz de caracteres terminada en nulo) al especificar% s, pero en su lugar proporcionó una clase de cadena. Suponiendo que está utilizando std :: string try:

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

Otros consejos

printf () no puede manejar las cadenas Ccode s. Utilice bar.c_str () en su lugar.

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

es perfectamente seguro. ¿Qué te hace pensar que podría no ser?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top