2012-11-07 31 views
5

इस कोड में रनटाइम त्रुटि क्यों है?स्ट्रिंग्स (सी ++) के साथ मानचित्र का उपयोग करके इस कोड में रनटाइम त्रुटि क्यों है?

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

यदि आप कोउट का उपयोग करते हैं, तो यह ठीक काम करता है; हालांकि, अगर आप printf का उपयोग करते हैं तो यह रनटाइम त्रुटि देता है। मैं इसे कैसे ठीक करूं? धन्यवाद!

+2

g ++ 4.6.3 संकलन-समय के साथ शिकायत करता है "त्रुटि: गैर-त्रिभुज-प्रतिलिपि प्रकार की संरचनाओं को पार नहीं कर सकता 'स्ट्रक्चर std :: basic_string ' through '...'"। मैं शर्त लगाता हूं कि आपके कंपाइलर में कम से कम एक प्रासंगिक चेतावनी भी है। – aschepler

उत्तर

10

आप कुछ है कि एक char * उम्मीद (के रूप में आप printf पर दस्तावेजीकरण, एक सी समारोह है, जो कक्षाएं नहीं है, अकेले string है जहाँ से देख सकते हैं) के लिए एक std::string में गुजर रहे हैं। अंतर्निहित char * की एक स्थिरांक संस्करण का उपयोग करने के लिए, c_str समारोह का उपयोग करें:

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

इसके अलावा, (*it).secondit->second के बराबर है, लेकिन बाद टाइप करने के लिए आसान है और, मेरी राय में, यह स्पष्ट क्या हो रहा है बनाता है।

+0

c_str() क्या करता है? अनुलेख बहुत बढ़िया जवाब! –

+0

@DanielTalamas, 'std :: string' में' char * 'डेटा सदस्य है जो यह स्ट्रिंग को स्टोर करने के लिए उपयोग करता है। 'c_str()' उसमें निरंतर, शून्य-समाप्त संस्करण देता है, लेकिन यह तब तक वैध है जब तक कि अगले गैर-कॉन्स्ट सदस्य फ़ंक्शन को कॉल न किया जाए। नाम की तरह सुझाव मिलता है, यह एक 'std :: string' से सी-शैली स्ट्रिंग निकालता है। – chris

3

उपयोग c_str():

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

printf()%s के लिए एक सी स्ट्रिंग उम्मीद कर रही है, और आप इसे एक सी ++ स्ट्रिंग बजाय दे रहे हैं। printf() टाइपएफ़ नहीं है, इसका निदान करने का कोई तरीका नहीं है (हालांकि एक अच्छा कंपाइलर आपको इस त्रुटि के बारे में चेतावनी दे सकता है)।

+0

c_str() क्या करता है? अनुलेख अच्छा उत्तर –