2012-11-07 3 views
5

Perché questo codice ha un errore di runtime?Perché questo codice ha un errore di runtime utilizzando la mappa con stringhe (C++)?

#include <cstdio> 
#include <map> 
#include <string> 
#include <iostream> 

using namespace std; 
map <int, string> A; 
map <int, string>::iterator it; 

int main(){ 
    A[5]="yes"; 
    A[7]="no"; 
    it=A.lower_bound(5); 
    cout<<(*it).second<<endl; // No problem 
    printf("%s\n",(*it).second); // Run-time error 
    return 0; 
} 

Se si utilizza cout, funziona correttamente; tuttavia, se si utilizza printf, viene visualizzato un errore di runtime. Come si corregge? Grazie!

+2

g ++ 4.6.3 si lamenta con un errore "in fase di compilazione": impossibile passare oggetti di tipo non banale-copiabili "struct std :: basic_string " tramite "..." ". Scommetto che anche il tuo compilatore ha almeno un avvertimento rilevante. – aschepler

risposta

10

Stai passando un std::string a qualcosa che si aspetta un char * (come si può vedere dalla documentazione su printf, che è una funzione C, che non ha classi, per non parlare string). Per accedere a una versione const del sottostante char *, utilizzare la funzione c_str:

printf("%s\n",(*it).second.c_str()); 

Inoltre, (*it).second è equivalente a it->second, ma quest'ultimo è più facile da scrivere e, a mio parere, rende più chiaro ciò che sta accadendo.

+0

Che cosa fa esattamente c_str()? Post scriptum Bella risposta! –

+0

@DanielTalamas, 'std :: string' ha un membro dati' char * 'che usa per memorizzare la stringa. 'c_str()' restituisce una versione costante, terminata da null, ma è valida solo fino a quando viene chiamata la successiva funzione membro non const. Come suggerisce il nome, estrae una stringa in stile C da una 'std :: string'. – chris

3

Uso c_str():

printf("%s\n",(*it).second.c_str()); 

printf() si aspetta una stringa di C per %s, e si sta dando una stringa C++, invece. Dato che printf() non è tipicamente corretto, non ha modo di diagnosticare questo problema (sebbene un buon compilatore possa avvisare di questo errore).

+0

Che cosa fa esattamente c_str()? Post scriptum bella risposta –