2010-08-11 21 views
10

सी स्ट्रिंग्स और सी ++ तारों के बीच क्या अंतर है। विशेष रूप से गतिशील स्मृति आवंटन कर रही है, जबकिसी तारों और सी ++ तारों के बीच क्या अंतर है?

+0

क्या आपका मतलब है कि दो भाषाओं में 'char *' और 'char []' तारों का उपयोग करने के बीच अंतर, या 'char' आधारित तारों और 'std :: string' के बीच का अंतर? – dmckee

+1

कृपया "सी स्ट्रिंग" और "सी ++ स्ट्रिंग" से आपका क्या मतलब है परिभाषित करें। दोनों (विशेष रूप से उत्तरार्द्ध) संदिग्ध हैं। – strager

+0

पढ़ें http://www.cplusplus.com/reference/string/string/ और http://www.macdonald.egate.net/CompSci/hstrings.html –

उत्तर

22

मैं शायद ही पता है, जहां शुरू करने के लिए :-)

सी में, तार सिर्फ char सरणियों जो, प्रथा के अनुसार, एक NUL बाइट के साथ अंत नहीं है। गतिशील स्मृति प्रबंधन के संदर्भ में, आप केवल malloc उनके लिए जगह (अतिरिक्त बाइट सहित) कर सकते हैं। मेमोरी मैनेजमेंट जब तार को संशोधित करने है अपने जिम्मेदारी:

char *s = strdup ("Hello"); 
char *s2 = malloc (strlen (s) + 6); 
strcpy (s2, s); 
strcat (s2, ", Pax"); 
free (s); 
s = s2; 

सी ++ में, तार (std::string) सभी संबद्ध स्वचालित स्मृति प्रबंधन और नियंत्रण है जो उन्हें एक बहुत सुरक्षित और आसान उपयोग करने के लिए बनाता है के साथ वस्तुओं, खासकर के लिए कर रहे हैं नौसिखिया।

std::string s = "Hello"; 
s += ", Pax"; 

मैं जानता हूँ कि जो मैं चाहते उपयोग करने के लिए, बाद पसंद करते हैं: गतिशील आवंटन के लिए, की तरह कुछ का उपयोग करें। c_str() विधि का उपयोग करके आप std::string से हमेशा एक सी स्ट्रिंग बना सकते हैं (यदि आपको आवश्यकता है)।

+2

'std :: string' ऑब्जेक्ट्स हैं ... – dmckee

+0

अरे आप c_str()! –

6

सी ++ तार ज्यादा, सुरक्षित आसान हैं, और वे संलग्न, लगता है, कॉपी, संयोजन आदि की तरह अलग अलग स्ट्रिंग परिवर्तन कार्य का समर्थन

स्ट्रिंग ++ सी स्ट्रिंग और ग के बीच एक दिलचस्प अंतर उदाहरण निम्नलिखित

के माध्यम से दर्शाया गया है
#include <iostream>        
using namespace std; 

int main() { 
    char a[6]; //c string 
    a[5]='y'; 
    a[3]='o'; 
    a[2]='b'; 
    cout<<a; 
    return 0; 
} 

उत्पादन »¿boRy¤ £ च · पाई» ¿

#include <iostream> 
using namespace std; 
int main() 
{ 
    string a; //c++ string 
    a.resize(6); 
    a[5]='y'; 
    a[3]='o'; 
    a[2]='b'; 
    cout<<a; 
    return 0; 
} 

आउटपुट लड़का

मुझे आशा है कि आपको बिंदु मिल जाएगा !!

+0

सी से इस प्रकार का व्यवहार हार्टबलेड जैसी बग का कारण बनता है। – saolof

संबंधित मुद्दे