Domanda

Sto usando getopt_long per elaborare gli argomenti della riga di comando in un'applicazione C ++. Gli esempi mostrano tutti qualcosa come printf (" Nome utente:% s \ n " ;, optarg) negli esempi di elaborazione. Questo è ottimo per mostrare un esempio, ma voglio essere in grado di archiviare effettivamente i valori per utilizzarli in seguito. Gran parte del resto del codice utilizza oggetti string anziché char * , quindi ho bisogno di trasmettere / copiare / qualunque sia il contenuto di optarg in una stringa.

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

Il codice sopra si compila, ma quando viene eseguito ottengo un errore Istruzione illegale se provo a stampare il valore della barra usando printf (sembra funzionare bene per cout).

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

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

Non so abbastanza sul debug da riga di comando per approfondire quali potrebbero essere le istruzioni illegali. Avevo eseguito valgrind, ma l'enorme volume di errori di memoria che derivano da questo errore mi hanno reso difficile individuare esattamente cosa potrebbe causare questo errore.

È stato utile?

Soluzione

Hai detto a printf che stavi fornendo una stringa di stile c (array di caratteri con terminazione null) quando hai specificato% s, ma hai invece fornito una classe di stringhe. Supponendo che tu stia usando std :: string try:

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

Altri suggerimenti

printf () non può gestire le stringhe C ++ . Utilizzare invece bar.c_str () .

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

è perfettamente sicuro. Cosa ti fa pensare che potrebbe non essere?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top