दिलचस्प पोस्ट
मैं एक Django मॉडल इंस्टेंस ऑब्जेक्ट कैसे क्लोन करता हूं और इसे डेटाबेस में सहेजता हूं? एंड्रॉइड की अनुमति काम नहीं करती है, भले ही मैंने इसे घोषित किया हो मैं पायथन में matplotlib में 'बैकेंड' कैसे सेट कर सकता हूं? नया फ़ायरबेज क्लाउड मेसेजिंग सिस्टम के साथ अधिसूचना आइकन शेल स्क्रिप्ट: स्क्रिप्ट से ssh पर फ़ंक्शन चलाएं MySQL में ऐक्सेंट को कैसे हटाएं? आईओएस दुर्घटना लॉग कैश, डीबग जानकारी .. पकड़ो और देव टीम को ईमेल के माध्यम से भेजें आराम में लेनदेन? मैं एक ही आईडी के साथ सभी तत्वों के लिए jQuery फ़ंक्शन कैसे लागू करूं? एमवीसी 4 रेजर फाइल अपलोड करें जावा जेडीबीसी का इस्तेमाल करते हुए मैस के "स्कीमा" नामों की सूची कैसे प्राप्त करें I क्यों वैश्विक चर 'नाम' स्ट्रिंग में परिवर्तन? चलने योग्य / ड्रैग करने योग्य <div> Android प्रोग्राम में इनबॉक्स से एक एसएमएस कैसे हटाया जाए? दृश्य स्टूडियो 2008 एक्सप्रेस संस्करणों में "गायब" क्या है?

सी ++ में स्ट्रिंग और चार प्रकारों के बीच का अंतर

मुझे थोड़ा सी पता है और अब मैं सी ++ पर एक नज़र रखता हूं मुझे सी स्ट्रिंग्स से निपटने के लिए चार सरणियों के लिए उपयोग किया जाता है, लेकिन जब मैं सी ++ कोड को देखता हूं तो मुझे लगता है कि स्ट्रिंग टाइप और चार सरणी दोनों का इस्तेमाल करते हुए उदाहरण हैं:

#include <iostream> #include <string> using namespace std; int main () { string mystr; cout << "What's your name? "; getline (cin, mystr); cout << "Hello " << mystr << ".\n"; cout << "What is your favorite team? "; getline (cin, mystr); cout << "I like " << mystr << " too!\n"; return 0; } 

तथा

 #include <iostream> using namespace std; int main () { char name[256], title[256]; cout << "Enter your name: "; cin.getline (name,256); cout << "Enter your favourite movie: "; cin.getline (title,256); cout << name << "'s favourite movie is " << title; return 0; } 

( http://www.cplusplus.com से दोनों उदाहरण)

मुझे लगता है कि यह व्यापक रूप से पूछा गया है और उत्तर दिया गया है (स्पष्ट?) सवाल है, लेकिन यह अच्छा होगा अगर कोई मुझे बता सकता है कि सी ++ (प्रदर्शन, एपीआई एकीकरण, जिस तरह से हर एक बेहतर, …)

धन्यवाद।

वेब के समाधान से एकत्रित समाधान "सी ++ में स्ट्रिंग और चार प्रकारों के बीच का अंतर"

एक चार सरणी बस है – वर्णों की एक सरणी:

  • यदि स्टैक पर आवंटित किया गया है (जैसे कि आपके उदाहरण में), तो यह हमेशा जैसे- 256 बाइट कोई फर्क नहीं पड़ता कि इसमें कितना समय है पाठ
  • यदि ढेर पर आवंटित (मॉलोक () या नए चार [] का उपयोग करके) आप बाद में स्मृति को रिलीज़ करने के लिए जिम्मेदार हैं और आप हमेशा एक ढेर आवंटन का ओवरहेड होगा।
  • अगर आप सरणी में 256 से अधिक वर्णों की एक पाठ की प्रतिलिपि बनाते हैं, तो यह क्रैश हो सकता है, बदसूरत आरोपण संदेश उत्पन्न कर सकता है या अपने प्रोग्राम में कहीं और (गलत) व्यवहार का कारण हो सकता है।
  • पाठ की लंबाई निर्धारित करने के लिए, सरणी को वर्णित करना होगा, वर्ण द्वारा वर्ण, \ 0 वर्ण के लिए

एक स्ट्रिंग एक क्लास है जिसमें एक चार एरे शामिल है, लेकिन आप इसे अपने लिए प्रबंधित कर सकते हैं। अधिकांश स्ट्रिंग कार्यान्वयन में 16 अक्षरों का एक अंतर्निर्मित सरणी है (इतनी छोटी स्ट्रिंग्स ढेर के टुकड़े नहीं हैं) और लंबी स्ट्रिंग के लिए ढेर का उपयोग करें।

आप इस तरह स्ट्रिंग की चार सरणी तक पहुंच सकते हैं:

 std::string myString = "Hello World"; const char *myStringChars = myString.c_str(); 

सी ++ स्ट्रिंग्स में एम्बेडेड \ 0 वर्ण हो सकते हैं, गिनती के बिना उनकी लंबाई पता है, छोटे ग्रंथों के लिए ढेर-आवंटित चार सरणीओं की तुलना में तेज़ हैं और बफर ओवर्रन्स से आपकी रक्षा कर सकते हैं। प्लस वे अधिक पठनीय और उपयोग करने में आसान हो

हालांकि, सी ++ स्ट्रिंग डीएलएल सीमाओं पर उपयोग के लिए (बहुत) उपयुक्त नहीं हैं, क्योंकि इसके लिए ऐसा कोई भी डीएलएल फ़ंक्शन के किसी भी उपयोगकर्ता की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि वह सटीक एक ही संकलक और सी ++ रनटाइम कार्यान्वयन का उपयोग कर रहा है, ऐसा न हो कि वह अपने स्ट्रिंग क्लास को अलग ढंग से व्यवहार करने का जोखिम उठाए।

आम तौर पर, एक स्ट्रिंग क्लास कॉल करने के ढेर पर अपनी हीप मेमोरी भी रिलीज़ करेगा, इसलिए यदि आप रनटाइम के साझा किए गए (.dll या .so) संस्करण का उपयोग कर रहे हैं, तो यह केवल फिर से स्मृति को खाली करने में सक्षम होगा।

संक्षेप में: अपने सभी आंतरिक कार्यों और तरीकों में सी ++ स्ट्रिंग का उपयोग करें। यदि आप कभी भी। Dll लिखते हैं या, तो अपने सार्वजनिक (डीएलएल / इतनी उजागर) कार्यों में सी स्ट्रिंग का उपयोग करें।

खैर, स्ट्रिंग टाईप वर्ण स्ट्रिंग के लिए एक पूरी तरह से प्रबंधित क्लास है, जबकि चार [] अभी भी सी में था, आपके लिए एक अक्षर स्ट्रिंग का प्रतिनिधित्व करते हुए एक बाइट सरणी।

एपीआई और मानक लाइब्रेरी के संदर्भ में सब कुछ स्ट्रिंग के संदर्भ में कार्यान्वित किया जाता है और न कि चार [], लेकिन अब भी बहुत सारे कार्यों को libc से मिलते हैं जो कि चार [] प्राप्त करते हैं ताकि आप इसे उन लोगों के लिए इस्तेमाल कर सकते हैं हमेशा std :: string का उपयोग करें

निश्चित रूप से दक्षता के मामले में अप्रबंधित स्मृति का एक कच्चा बफर बहुत सारी चीजों के लिए लगभग हमेशा तेज़ हो जाएगा, लेकिन उदाहरण के लिए स्ट्रिंग की तुलना करने के लिए खाते में ले लो, std :: स्ट्रिंग हमेशा इसे जांचने के लिए हमेशा आकार लेता है, जबकि चार [] के साथ वर्ण द्वारा चरित्र की तुलना करने की आवश्यकता है

Arkaitz सही है कि string एक प्रबंधित प्रकार है आपके लिए यह क्या मतलब है कि आपको कभी भी चिंता नहीं है कि स्ट्रिंग कितनी देर तक है, और न ही आपको स्ट्रिंग की याददाश्त को मुक्त करने या पुन: निर्दिष्ट करने की चिंता है।

दूसरी ओर, ऊपर दिए गए मामले में char[] नोटेशन ने चरित्र बफर को लगभग 256 वर्णों तक सीमित कर दिया है। अगर आपने उस बफर में 256 से अधिक वर्ण लिखने का प्रयास किया था, तो सबसे अच्छा आप अन्य स्मृति को अधिलेखित कर देंगे, जो आपके प्रोग्राम "स्वामी" है बुरी तरह से, आप अपनी स्मृति को अधिलेखित करने की कोशिश करेंगे, और आपका ओएस आपके कार्यक्रम को मौके पर मार देगा।

जमीनी स्तर? स्ट्रिंग्स बहुत अधिक प्रोग्रामर के अनुकूल हैं, चार [] कंप्यूटर के लिए बहुत अधिक कुशल हैं

मैं व्यक्तिगत तौर पर किसी भी कारण से नहीं देखता कि क्यों कोई पुरानी कोड के साथ अनुकूलता को छोड़कर चार * या चार [] का उपयोग करना चाहेगा std :: स्ट्रिंग का सी-स्ट्रिंग का उपयोग करने की तुलना में धीमी नहीं है, सिवाय इसके कि यह आपके लिए पुन: आवंटन को संभाल देगा। जब आप इसे बनाते हैं तो आप इसका आकार सेट कर सकते हैं, और यदि आप चाहें तो पुन: आवंटन से बचें। यह इंडेक्सिंग ऑपरेटर ([]) निरंतर समय पहुंच प्रदान करता है (और शब्द के प्रत्येक अर्थ में सी-स्ट्रिंग इंडेक्सर का उपयोग करने के रूप में सटीक एक ही चीज़ है)। विधि के प्रयोग से आप की जांच की गई सुरक्षा के साथ-साथ सीमाएं भी मिलती हैं, जो आपको सी-स्ट्रिंग्स के साथ नहीं मिलती, जब तक कि आप इसे लिखते नहीं हैं। आपका संकलक रिलीज़ मोड में अनुक्रमणक उपयोग को सबसे अधिक ऑप्टिमाइज़ करेगा। सी-स्ट्रिंग के साथ गड़बड़ करना आसान है; ऐसी चीजों जैसे हटाएं बनाम हटाएं [], अपवाद सुरक्षा, यहां तक ​​कि सी-स्ट्रिंग को फिर से कैसे निर्दिष्ट करें

और जब आपको उन्नत अवधारणाओं जैसे गाल के तार होने और गैर-गायक के लिए एमटी आदि के साथ सौदा करना है, तो आपको std :: string की आवश्यकता होगी।

यदि आप प्रतियों के बारे में चिंतित हैं, जब तक आप संदर्भ का उपयोग करते हैं, और जहाँ भी आप संदर्भ कर सकते हैं, आप प्रतियों के कारण किसी भी ऊपरी हिस्से में नहीं होंगे, और यह उसी चीज के समान है, जैसा कि आप c-string के साथ करेंगे

तारों में सहायक फ़ंक्शन हैं और स्वचालित रूप से चार सरणी प्रबंधित करें आप स्ट्रिंग को जोड़ सकते हैं, एक चार सरणी के लिए आपको उसे एक नई सरणी में प्रतिलिपि बनाने की आवश्यकता होगी, तार क्रमशः पर अपनी लंबाई बदल सकते हैं। एक चार सरणी स्ट्रिंग की तुलना में प्रबंधन के लिए कठिन है और कुछ फ़ंक्शन केवल एक स्ट्रिंग को इनपुट के रूप में स्वीकार कर सकते हैं, जिससे आपको स्ट्रिंग में सरणी परिवर्तित करने की आवश्यकता होती है। तारों का उपयोग करने के लिए बेहतर है, उन्हें बनाया गया ताकि आपको एरेज़ का प्रयोग न करना पड़े। यदि arrays निष्पक्ष बेहतर थे तो हमारे पास तार नहीं होंगे।

के बारे में सोच (char *) string.begin () के रूप में आवश्यक अंतर यह है कि (चार *) एक इटरेटर है और std :: स्ट्रिंग कंटेनर है यदि आप बुनियादी स्ट्रिंग्स पर चिपकते हैं तो एक (चार *) आपको बताता है कि std :: string :: iterator क्या करता है जब आप एक इटरेटर के लाभ और सी के साथ संगतता चाहते हैं तो आप (चार *) का उपयोग कर सकते हैं, लेकिन यह अपवाद है और नियम नहीं है। हमेशा की तरह, इटरेटर अमान्य के बारे में सावधान रहें जब लोग कहते हैं (चार *) सुरक्षित नहीं है तो यही उनका मतलब है यह किसी भी अन्य C ++ iterator के रूप में सुरक्षित है

अंतर में से एक शून्य समाप्ति (\ 0) है।

सी और सी ++ में, चार * या चार [] एक पॉइंटर को एक एकल वर्ण में पैरामीटर के रूप में ले जाएगा और जब तक 0 मेमोरी वैल्यू तक पहुंचना नहीं (जब तक कि नल टर्मिनेटर कहलाता है) स्मृति के साथ नज़र रखेगा।

सी ++ स्ट्रिंग्स में एम्बेडेड \ 0 वर्ण हो सकते हैं, उनकी लम्बाई गिनती के बिना पता है।

 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; void NullTerminatedString(string str){ int NUll_term = 3; str[NUll_term] = '\0'; // specific character is kept as NULL in string cout << str << endl <<endl <<endl; } void NullTerminatedChar(char *str){ int NUll_term = 3; str[NUll_term] = 0; // from specific, all the character are removed cout << str << endl; } int main(){ string str = "Feels Happy"; printf("string = %s\n", str.c_str()); printf("strlen = %d\n", strlen(str.c_str())); printf("size = %d\n", str.size()); printf("sizeof = %d\n", sizeof(str)); // sizeof std::string class and compiler dependent NullTerminatedString(str); char str1[12] = "Feels Happy"; printf("char[] = %s\n", str1); printf("strlen = %d\n", strlen(str1)); printf("sizeof = %d\n", sizeof(str1)); // sizeof char array NullTerminatedChar(str1); return 0; } 

आउटपुट:

 strlen = 11 size = 11 sizeof = 32 Fee s Happy strlen = 11 sizeof = 12 Fee