दिलचस्प पोस्ट
आर में वेटोरिफाइड IF स्टेटमेंट? रीयलएम ऑब्जेक्ट से फील्ड वैल्यू पुनर्प्राप्त नहीं की जा सकती, मान डीबगर में शून्य हैं मुझे क्या करना चाहिए यदि दो लाइब्रेरी एक समान नाम के साथ एक फ़ंक्शन प्रदान करते हैं जो एक संघर्ष पैदा करता है? रूबी – अर्रे # के बीच अंतर << और ऐरे # पुश बयान के लिए एन्हांस्ड कैसे कार्य करता है, और सरणी के लिए एक इटरेटर कैसे प्राप्त करें? चल रहा है: पृष्ठभूमि में जीवीआईएम से बनाओ UIImage के लिए एक पिक्सेल अल्फा मान पुनर्प्राप्त करना एसवीजी डॉक्स कस्टम डेटा-विशेषताओं का समर्थन करते हैं? रिमोट लिनक्स मशीन पर सी + + संकलन – "घड़ी तिरछा" चेतावनी स्कैला में मिलान पैटर्न क्यों चर के साथ काम नहीं करता है? अपरिभाषित व्यवहार और अनुक्रम अंक ASP.NET MVC की आवश्यकताएँ केवल उत्पादन में शामिल हैं दूसरे दृश्य से खींचा जाने पर किसी दृश्य पर टच ईवेंट का पता लगाएं "लाइनिंग" क्या है? मैं meteor.com पर एक उल्का ऐप में नोड मॉड्यूल को कैसे लागू कर सकता हूं?

क्या "और एस " एक 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 का एक सुरक्षित उपयोग है?

Solutions Collecting From Web of "क्या "और एस " एक 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 का उपयोग नहीं कर सकते हैं और जब तक आप सी स्ट्रिंग से जुड़े सभी खतरों को पुन: शुरू कर रहे हैं तब तक नहीं रह सकते हैं।