जब आपको केवल-पढ़ने के लिए परिदृश्य में एक शून्य समाप्त स्ट्रिंग की आवश्यकता होती है?


10

मैं std::string_viewलाइब्रेरी के साथ खेल रहा हूं और मैं एक कोड बेस बदलने पर विचार कर रहा हूं, जिस पर मैं std::string_viewज्यादा से ज्यादा प्रयोग कर रहा हूं । हालाँकि, कई थ्रेड्स जो मैंने इस विषय पर पढ़े हैं कि std::string_viewइसके बजाय कब और कहाँ उपयोग करना है const std::string &। मैंने कई जवाबों को कहते देखा है, "जब आपको एक शून्य समाप्त स्ट्रिंग की आवश्यकता नहीं होती है।" इसलिए जैसे ही मैंने वेब के लिए खोज शुरू की, "आपको एक शून्य समाप्त स्ट्रिंग की आवश्यकता कब है?" मैं वास्तव में इस विषय पर किसी भी उपयोगी उत्तर पर नहीं आया हूं।

मैं एक बाहरी पुस्तकालय के एक उदाहरण के बारे में सोच सकता हूं जिसे आप उससे जोड़ेंगे std::string। और उस मामले में आपको एक शून्य समाप्त स्ट्रिंग की आवश्यकता होगी क्योंकि उस पुस्तकालय को इसकी आवश्यकता होती है। मुझे लगता है कि एक और उदाहरण होगा यदि आपको स्ट्रिंग को संशोधित करने की आवश्यकता है, लेकिन तब हम इसे पास नहीं करेंगे const &यदि हमें इसे संशोधित करने की आवश्यकता है।

तो आपको एक शून्य समाप्त स्ट्रिंग का उपयोग करने की आवश्यकता कब होगी?

लिंक जिन्हें मैंने देखा है:

  1. वास्तव में std :: string_view const std :: string & से अधिक तेज कैसे है?
  2. मैं कब const & std :: string को बदले std :: string_view पास करूंगा?
  3. केवल स्ट्रिंग दृश्य क्यों?
  4. क्या कास्ट स्टैड :: स्ट्रिंग और तर्कों को C ++ 17 में उपयोग करने में कोई समझदारी है?

5
ज्यादातर सी एपीआई के साथ इंटरफेस करने के लिए।
अखरोट

@uneven_mark क्या आप एक का उदाहरण दे सकते हैं?
सेलनर्मो

आपके द्वारा लिंक किए गए चौथे प्रश्न का स्वीकृत उत्तर ऐसा लगता है कि यह इस प्रश्न का उत्तर देता है।
फ्राँस्वा एंड्रीक्स

1
@ सेलनर्मो अधिकांश कार्य जैसे POSIX या किसी अन्य सी लाइब्रेरी से एक const char*तर्क ले रहा है । eerorika's anwer का एक उदाहरण है।
अखरोट

1
@ FrançoisAndrieux तो वास्तव में जवाब है, "जब तक एपीआई एक शून्य समाप्त स्ट्रिंग के लिए कॉल नहीं करता है?"
सेलनर्मो

जवाबों:


10

आपको एक शून्य समाप्त स्ट्रिंग की आवश्यकता कब होती है?

जब भी आप उपयोग करने वाले API को एक शून्य समाप्त स्ट्रिंग की आवश्यकता होती है, तो वह कहता है कि आपको इसकी आवश्यकता है। यह आवश्यकता सी इंटरफेस में सर्वव्यापी है और कुछ प्रलेखन में स्पष्ट रूप से नहीं बताई गई है। यदि एक फ़ंक्शन तर्क एक char*(संभवतः कांस्ट करने के लिए) है, और कोई लंबाई तर्क नहीं है, तो आपको आवश्यकता माननी चाहिए जब तक कि दस्तावेज़ अन्यथा न कहे।

चलो execveएक उदाहरण के रूप में फ़ंक्शन (POSIX मानक से) लेते हैं :

int execve(const char *pathname, char *const argv[], char *const envp[]);

यदि आप एक गैर-शून्य समाप्त तर्क पारित करते हैं pathname, तो आपके कार्यक्रम का व्यवहार अपरिभाषित होगा।


तो इस मामले में, पथनाम, क्या यह एक होना चाहिए std::string, जैसे निष्पादित किया जाएगा execve(pathname.c_str(),...,...)?
सेलनर्मो

6

यह वास्तव में पता करने के लिए बहुत आसान है। यदि आप एक फ़ंक्शन को कॉल कर रहे हैं जो बस एक सी-स्ट्रिंग ( char*/ const char*) लेता है , तो आपको एक शून्य समाप्त स्ट्रिंग की आवश्यकता है क्योंकि यह जानने का एकमात्र तरीका है कि स्ट्रिंग का अंत कहां है।

यदि आपके पास एक ऐसा फ़ंक्शन है, जो char*/ const char*प्लस आकार लेता है , या डेटा की शुरुआत और अंत को चिह्नित करने वाले सिर्फ दो बिंदु हैं, तो आपको एक शून्य समाप्त स्ट्रिंग की आवश्यकता नहीं है क्योंकि आपके पास / से स्ट्रिंग को आकार मिल सकता है। अशक्त टर्मिनेटर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.