दिलचस्प पोस्ट
केवल दो पॉइंटर्स का उपयोग करके एक अकेली लिंक वाली सूची को कैसे उलटाएं? क्या मुझे सी ++ में एक अपवाद विनिर्देशक का उपयोग करना चाहिए? डिफ़ॉल्ट एन्कोडिंग ASCII है, तो पायथन क्यों यूनिकोड वर्णों को मुद्रित करता है? JQuery के साथ एक DIV पृष्ठभूमि छवि बदलना वॉली टाइमआउट अवधि बदलें स्थिरांक के लिए सी # नामकरण सम्मेलन? थर्डज के साथ ऑब्जेक्ट के zOrder को कैसे बदल सकता है? कैस्परजेएस / फेंटमोज एस एच पी एस पृष्ठ लोड नहीं करता है कैसे WCF deserialization एक निर्माता के बिना फोन वस्तुओं को तत्काल? मैं स्विफ्ट 3.0 में एकाधिक वैकल्पिक स्ट्रिंग कैसे जोड़ सकता हूं? सी # का उपयोग करते हुए Excel फ़ाइल के डेटा को कैसे पढ़ें? सरणी सॉर्ट करने के लिए जावा संगत वर्ग गिट: "भ्रष्ट ढीले वस्तु" एएसएक्स का प्रयोग करके जेएसओएन को PHP पर भेजा जा रहा है कॉलबैक के रूप में उपयोग करने के लिए किसी ब्लॉक को लेते हुए एक विधि लागू करना

क्या "और एस " एक std :: स्ट्रिंग में निकटवर्ती अक्षरों को इंगित करता है?

मैं कुछ रखरखाव का काम कर रहा हूं और कुछ की तरह नीचे चला गया:

std::string s; s.resize( strLength ); // strLength is a size_t with the length of a C string in it. memcpy( &s[0], str, strLength ); 

मुझे पता है कि & s [0] सुरक्षित होगा यदि यह एक std :: vector था, लेकिन क्या यह std :: string का एक सुरक्षित उपयोग है?

वेब के समाधान से एकत्रित समाधान "क्या "और एस " एक std :: स्ट्रिंग में निकटवर्ती अक्षरों को इंगित करता है?"

एक std :: स्ट्रिंग का आवंटन C + + 98/03 मानक के तहत संगत होने की गारंटी नहीं है, लेकिन C ++ 11 शक्तियों को यह होना चाहिए। व्यवहार में, न तो मैं और हर्ब Sutter एक कार्यान्वयन के बारे में पता है जो लगातार भंडारण का उपयोग नहीं करता है।

नोट करें कि &s[0] बात को हमेशा सी ++ 11 मानक द्वारा काम करने की गारंटी दी जाती है, यहां तक ​​कि 0-लंबाई स्ट्रिंग केस में भी। अगर आप str.begin() या &*str.begin() , लेकिन इसके लिए &s[0] मानक परिभाषित operator[] रूप में यह गारंटी नहीं दी जाएगी:

रिटर्न : *(begin() + pos) यदि pos < size() , अन्यथा कोई मूल्य T ऑब्जेक्ट का संदर्भ मूल्य के साथ charT() ; संदर्भित मान को संशोधित नहीं किया जाएगा

जारी रखने पर, data() को इस प्रकार परिभाषित किया जाता है:

रिटर्न: एक सूचक p जैसे p + i == &operator[](i) प्रत्येक i में [0,size()]

(सीमा के दोनों छोर पर वर्ग कोष्ठक देखें)


सूचना : पूर्व-मानकीकरण सी ++ 0x ने गारंटी नहीं दी &s[0] शून्य-लंबाई वाले स्ट्रिंग्स के साथ काम करने के लिए (वास्तव में, यह स्पष्ट रूप से अपरिभाषित व्यवहार था), और इस उत्तर के एक पुराने संशोधन ने यह समझाया; यह बाद के मानक ड्राफ्ट में तय किया गया है, इसलिए उत्तर को तदनुसार अद्यतन किया गया है।

तकनीकी रूप से, नहीं, क्योंकि std::string को इसकी सामग्री को स्मृति में संग्रहीत करने की आवश्यकता नहीं है।

हालांकि, लगभग सभी कार्यान्वयन (हर कार्यान्वयन जिसमें मैं जागरूक हूं) में, सामग्रियों को संचित रूप से संग्रहीत किया जाता है और यह "काम" करेगा।

यह उपयोग करने के लिए सुरक्षित है मुझे लगता है कि अधिकांश उत्तर एक बार सही थे, लेकिन मानक बदल दिया। सी ++ 11 मानक से quoting, मूल सामान्यता [ string.require ] , 21.4.1.5, कहते हैं:

एक मूल_स्ट्राइंग ऑब्जेक्ट में चार-जैसे ऑब्जेक्ट संयोग से संग्रहीत किए जाएंगे। वह है, किसी भी बुनियादी_स्ट्रिंग ऑब्जेक्ट के लिए, पहचान और * (s.begin () + n) == और * s.begin () + n n के सभी मूल्यों के लिए होनी चाहिए जैसे कि 0 <= n <s.size ()।

इससे पहले थोड़ा सा, यह कहता है कि सभी इटरेटर्स यादृच्छिक एक्सेस इटरेटर हैं। दोनों बिट आपके प्रश्न के उपयोग का समर्थन करते हैं। (इसके अतिरिक्त, स्ट्रास्ट्रस्ट्र ने जाहिरा तौर पर अपनी नवीनतम पुस्तक में इसका उपयोग किया है;))

यह संभावना नहीं है कि यह परिवर्तन सी ++ 11 में किया गया था मुझे याद आती है कि वेक्टर के लिए वही गारंटी जोड़ा गया था, जो उस रिलीज़ के साथ बहुत उपयोगी डेटा () पॉइंटर भी मिला है

उम्मीद है की वो मदद करदे।

पाठकों को ध्यान देना चाहिए कि यह प्रश्न 200 9 में पूछा गया था, जब सी ++ 03 मानक वर्तमान प्रकाशन था। यह उत्तर मानक के उस संस्करण पर आधारित है, जिसमें std::string s निकटतम भंडारण का उपयोग करने की गारंटी नहीं है । चूंकि इस प्रश्न को किसी विशेष प्लेटफॉर्म (जीसीसी) के संदर्भ में नहीं पूछा गया था, इसलिए मैं ओपी के मंच के बारे में कोई धारणा नहीं करता – विशेष रूप से, मौसम या नहीं, string लिए विवादास्पद भंडारण का उपयोग किया।

कानूनी? शायद शायद नहीं। सुरक्षित? शायद, लेकिन शायद नहीं अच्छा कोड? ठीक है, चलिए वहाँ नहीं जाना …

क्यों न करें:

 std::string s = str; 

… या:

 std::string s(str); 

… या:

 std::string s; std::copy( &str[0], &str[strLen], std::back_inserter(s)); 

… या:

 std::string s; s.assign( str, strLen ); 

?

यह आम तौर पर सुरक्षित नहीं है , भले ही आंतरिक स्ट्रिंग अनुक्रम मेमोरी में लगातार या नहीं संग्रहीत है या नहीं। इसमें कई अन्य क्रियान्वयन विवरण हो सकते हैं कि कैसे नियमित अनुक्रम std::string ऑब्जेक्ट द्वारा निरंतरता के अलावा संग्रहीत किया जाता है।

इसके साथ एक वास्तविक व्यावहारिक समस्या निम्न हो सकती है std::string का नियंत्रित अनुक्रम शून्य-समाप्त स्ट्रिंग के रूप में संग्रहीत करने के लिए आवश्यक नहीं है। हालांकि, व्यवहार में, कई (सबसे?) कार्यान्वयन 1 से आंतरिक बफर को बड़ा करना चुनता है और अनुक्रम को शून्य-समाप्त स्ट्रिंग के रूप में संग्रहित करता है क्योंकि यह c_str() विधि के कार्यान्वयन को सरल करता है: बस आंतरिक बफर पर एक सूचक वापस करें और आप कर चुके हैं।

आपके प्रश्न में उद्धृत कोड आंतरिक बफर में कॉपी किए गए डेटा को शून्य-समाप्त करने के लिए कोई भी प्रयास नहीं करता है काफी संभवतः यह नहीं जानता कि क्या std::string कार्यान्वयन में शून्य समाप्ति आवश्यक है। काफी संभवतः यह resize बाद शून्य के साथ आंतरिक बफर को भरने पर निर्भर करता है, इसलिए कार्यान्वयन द्वारा शून्य टर्मिनेटर के लिए आवंटित अतिरिक्त वर्ण आसानी से शून्य के लिए पूर्व-सेट किया गया है। यह सब कार्यान्वयन विवरण है, जिसका अर्थ है कि यह तकनीक कुछ नाजुक मान्यताओं पर निर्भर करती है।

दूसरे शब्दों में, कुछ कार्यान्वयनों में आपको डेटा को नियंत्रित अनुक्रम में मजबूर करने के लिए संभवत: strcpy लिए strcpy का उपयोग करना होगा, जैसे कि जबकि कुछ अन्य कार्यान्वयन में आपको memcpy का उपयोग करना होगा और नहीं strcpy

कोड काम कर सकता है, लेकिन फैसले की तुलना में भाग्य से अधिक, यह कार्यान्वयन के बारे में धारणा बनाता है जो कि गारंटी नहीं है। मैं सुझाव देता हूं कि कोड की वैधता अप्रासंगिक है, जबकि यह एक बेहिचक ओवर जटिलता है जो आसानी से कम हो जाती है:

 std::string s( str ) ; 

या यदि मौजूदा std :: string ऑब्जेक्ट को बताए, तो बस:

 s = str ; 

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