क्या std :: string में null termator होता है?


90

क्या नीचे वाले स्ट्रिंग में शून्य टर्मिनेटर '\ 0' होगा?

std::string temp = "hello whats up";

धन्यवाद! :)



1
अब यह खड़ा है, @jahhaj से स्वीकृत उत्तर user529758 से उत्तर के साथ संघर्ष करता है, जिसका उत्तर यकीनन अधिक है। मना करते हुए, मैंने जेसी गुड की टिप्पणी को छोड़ दिया, इसलिए यह यहां इसके महत्व पर जोर देने के लिए है।
जोनाथन कोमर

जवाबों:


100

नहीं, लेकिन यदि आप कहते हैं कि temp.c_str()एक शून्य टर्मिनेटर को इस पद्धति से वापसी में शामिल किया जाएगा।

यह भी कहने योग्य है कि आप किसी भी अन्य वर्ण की तरह एक स्ट्रिंग में एक अशक्त चरित्र को शामिल कर सकते हैं।

string s("hello");
cout << s.size() << ' ';
s[1] = '\0';
cout << s.size() << '\n';

प्रिंट

5 5

और 5 1जैसा कि आप उम्मीद कर सकते हैं कि अगर अशक्त पात्रों के तार के लिए एक विशेष अर्थ था।


5
यदि आप कहते temp.c_str()हैं अशक्त चरित्र को शामिल किया जाएगा। यदि आपको वास्तव में स्ट्रिंग में इसकी आवश्यकता है, तो इसे किसी अन्य वर्ण की तरह ही जोड़ें। temp.push_back('\0')। अब दो अशक्त वर्ण temp.c_str()शामिल होंगे ।
जहज

1
@dupdupdup, जैसा कि कुछ उत्तरों ने उल्लेख किया है, यदि आपको एक अशक्त-समाप्त स्ट्रिंग की आवश्यकता है, तो आपको निर्मित ऑब्जेक्ट पर एक s.c_str () कॉल करना चाहिए। यह वर्ण सरणी के लिए एक पॉइंटर लौटाएगा जो अंत में '\ 0' की गारंटी है।
मकिसिम स्केरडज़िन

@ रिको, जाहज फिर स्ट्रिंग को कैसे समाप्त करें। उदाहरण के लिए - मैंने स्ट्रिंग के रूप में अपने स्ट्रिंग में कुछ अक्षर जोड़े हैं [i]। अब मैं इसे cout का उपयोग करके प्रिंट नहीं कर पा रहा हूँ।
भावुक माथुर

अपनी बात में जोड़ने के लिए: चूंकि ऑपरेटर << अतिभारित होता है, इसलिए cout << s, हालांकि पूर्ण स्ट्रिंग char को char द्वारा प्रिंट करेगा, लेकिन, यदि आप c_str () लेते हैं और ऑपरेटर को डालते हैं << यह तब तक प्रिंट होगा अशक्त चार। निम्नलिखित कार्यक्रम इस बिंदु को दर्शाते हैं। {स्ट्रिंग एस ("सैंपलस्ट्रिंग"); cout << s.size () << "\ t" << s << एंडल; s [3] = '\ 0'; cout << "\ n \ n के बाद Null \ n \ n" << s.size () << "\ t" << sl; cout << "\ n \ n टेकिंग c_str \ n \ n" << s.size () << "\ t" << s.c_str () << endl; }
फूओ

71

C ++ 03 में नहीं है, और C ++ 11 से पहले इसकी गारंटी भी नहीं है कि C ++ std :: string मेमोरी में निरंतर है। केवल C स्ट्रिंग्स (char arrays जो स्ट्रिंग्स को स्टोर करने के लिए अभिप्रेत हैं) में शून्य टर्मिनेटर था।

C ++ 11 में और बाद में, mystring.c_str()के बराबर mystring.data()है &mystring[0]और होने mystring[mystring.size()]की गारंटी है '\0'


4
C ++ 11 के साथ, स्ट्रिंग्स को अब मेमोरी में सन्निहित होने की गारंटी दी जाती है।
zneak

@zneak धन्यवाद! अपडेट किया गया। लेकिन मुझे संदेह है कि कम से कम उचित रूप से C ++ 11-संकलक कंपाइलर हैं ... यहां तक ​​कि जीसीसी ने भी इसके लिए समर्थन तोड़ दिया है।

4
@ H2CO3: C ++ 11 एक तरफ, यह 2005 में DR 530 में संबोधित किया गया था । मानक पुस्तकालय कार्यान्वयन के विशाल बहुमत ने कम से कम लंबे समय के लिए सन्निहित स्मृति में स्ट्रिंग डेटा संग्रहीत किया है।
ildjarn

3
धन्यवाद @ दिलदार, मैं ठीक उसी की तलाश में था। इस कदम के लिए तर्क का एक हिस्सा यह था कि समिति में कोई भी एक एसटीएल कार्यान्वयन के बारे में नहीं जानता था जो निरंतर मेमोरी का उपयोग नहीं करता था।
5

7
@ H2CO3: ईमानदारी से, अगर यह आपको नाराज करता है, तो आपको मोटी त्वचा की आवश्यकता है।
ildjarn

9

यह यहां 'सम्‍मिलित' की आपकी परिभाषा पर निर्भर करता है। में

std::string temp = "hello whats up";

ध्यान देने योग्य बातें हैं:

  • temp.size()पहले hसे अंतिम p(दोनों सम्मिलित) से वर्णों की संख्या लौटाएगा
  • लेकिन एक ही समय में temp.c_str()या temp.data()एक nullटर्मिनेटर के साथ वापस आ जाएगा
  • या दूसरे शब्दों में शून्यint(temp[temp.size()]) होगा

मैं जानता हूँ कि, मैं जवाब यहां से कुछ के समान ध्वनि, लेकिन मैं कहना है कि करना चाहते हैं sizeकी std::stringमें C++है अलग से बनाए रखा और इसे पसंद नहीं है में Cजहां गिनती जब तक आप पहले लगता है रखने nullटर्मिनेटर।

जोड़ने के लिए, कहानी थोड़ी अलग होगी यदि आपके string literalएम्बेड शामिल हैं \0। इस मामले में, std::stringपहले nullचरित्र पर स्टॉप का निर्माण , निम्नानुसार है:

std::string s1 = "ab\0\0cd";   // s1 contains "ab",       using string literal
std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd", using different ctr
std::string s3 = "ab\0\0cd"s;  // s3 contains "ab\0\0cd", using ""s operator

संदर्भ:


2

हां, यदि आप कॉल करते हैं temp.c_str(), तो यह अशक्त-समाप्त सी-स्ट्रिंग लौटाएगा।

हालाँकि, ऑब्जेक्ट में संग्रहीत वास्तविक डेटा को tempशून्य-समाप्त नहीं किया जा सकता है, लेकिन यह प्रोग्रामर के लिए कोई मायने नहीं रखता है और इससे कोई फर्क नहीं पड़ता है, क्योंकि जब प्रोग्रामर चाहता है const char*, तो वह c_str()ऑब्जेक्ट पर कॉल करेगा , जो अशक्त लौटने की गारंटी है -संबंधित स्ट्रिंग।


1
न ही शून्य टर्मिनेटर (यदि यह मौजूद है) से वापसी में शामिल किया जाएगा temp.size()
जहज

1

C ++ स्ट्रिंग्स के साथ आपको इसके बारे में चिंता करने की ज़रूरत नहीं है, और यह संभवतः कार्यान्वयन पर निर्भर है।

उपयोग करने से temp.c_str()आपको स्ट्रिंग का सी प्रतिनिधित्व मिलता है, जिसमें निश्चित रूप से \0चार शामिल होंगे । इसके अलावा, मैं वास्तव में यह नहीं देखता कि यह C ++ स्ट्रिंग पर कैसे उपयोगी होगा


1

std::stringआंतरिक रूप से वर्णों की संख्या की गिनती रखता है। आंतरिक रूप से यह इस गिनती का उपयोग करके काम करता है। जैसे दूसरों ने कहा है, जब आपको प्रदर्शन के लिए स्ट्रिंग की आवश्यकता होती है या जो भी कारण हो, तो आप इसकी c_str()विधि कर सकते हैं जो आपको अंत में अशक्त टर्मिनेटर के साथ स्ट्रिंग देगा।


क्या आप इस कथन के लिए कुछ संदर्भ दे सकते हैं, "std :: string आंतरिक रूप से वर्णों की संख्या की गिनती रखता है। आंतरिक रूप से यह इस गिनती का उपयोग करके काम करता है"
rimalroshan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.