2012-11-07 35 views
5

Bu kod neden çalışma zamanı hatası veriyor?Bu kod neden harita dizeleriyle (C++) çalışma zamanı hatası veriyor?

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

Eğer cout kullanırsanız, iyi çalışır; Ancak, printf kullanırsanız, çalışma zamanı hatası verir. Nasıl düzeltebilirim? Teşekkürler!

+2

g ++ 4.6.3 derleme zamanı "hata: önemsiz olarak kopyalanamaz tipte nesneler iletemez" struct std :: basic_string '' ... '' aracılığıyla şikayet eder. Bahse girerim, derleyicinin de en azından ilgili bir uyarısı vardır. – aschepler

cevap

10

Sen (siz dursun string, sınıfları olmayan bir C fonksiyonudur printf ilgili belgeleri, görebileceğiniz gibi) char * beklediği şey bir std::string içinde geçiyoruz. altta yatan char * bir const sürümünü erişmek için c_str işlevini kullanın:

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

Ayrıca (*it).secondit->second eşdeğerdir ancak ikincisi yazmak daha kolay ve bence, neler olup bittiğine daha anlaşılır hale getirir.

+0

Tam olarak ne yapar c_str()? Not; mükemmel cevap! –

+0

@DanielTalamas, 'std :: string', dizeyi saklamak için kullandığı bir' char * 'veri üyesine sahiptir. 'c_str()', bunun sabit, boş sonlandırılmış bir sürümünü döndürür, ancak yalnızca bir sonraki const olmayan üye işlevi çağrılana kadar geçerlidir. Adından da anlaşılacağı gibi, bir std :: string'den bir C stili dizge ayıklar. – chris

3

Kullanım c_str():

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

printf()

%s için bir C dize bekleniyor ve bunun yerine bunu bir C++ dize veriyoruz. printf(), türafe olmadığı için, bunu teşhis etme yolu yoktur (iyi bir derleyici bu hata hakkında sizi uyarsa da).

+0

Tam olarak ne yapar c_str()? Not; güzel cevap –

İlgili konular