क्या C स्ट्रिंग्स को हमेशा ख़त्म किया जाता है, या यह प्लेटफ़ॉर्म पर निर्भर करता है?


13

अभी मैं एम्बेडेड सिस्टम के साथ काम कर रहा हूं और बिना किसी ऑपरेटिंग सिस्टम वाले माइक्रोप्रोसेसर पर तारों को लागू करने के तरीकों का पता लगा रहा हूं। अब तक मैं जो कर रहा हूं वह केवल NULL टर्मिनेटेड कैरेक्टर पॉइंटर्स के विचार का उपयोग कर रहा हूं और उन्हें स्ट्रिंग्स के रूप में मानता हूं जहां NULL अंत का संकेत देता है। मुझे पता है कि यह काफी सामान्य है, लेकिन क्या आप हमेशा इस पर भरोसा कर सकते हैं ?

मेरे द्वारा पूछे जाने का कारण यह है कि मैं किसी समय एक वास्तविक समय ऑपरेटिंग सिस्टम का उपयोग करने के बारे में सोच रहा था, और मैं अपने वर्तमान कोड का यथासंभव उपयोग करना चाहूंगा। तो विभिन्न विकल्पों के लिए जो वहाँ हैं, क्या मैं बहुत उम्मीद कर सकता हूँ कि स्ट्रिंग्स भी उसी तरह काम करें?

मुझे अपने मामले के लिए अधिक विशिष्ट होने दें। मैं एक ऐसे सिस्टम को लागू कर रहा हूं जो सीरियल पोर्ट पर कमांड लेता है और प्रोसेस करता है। क्या मैं अपना कमांड प्रोसेसिंग कोड समान रख सकता हूं, और फिर यह उम्मीद कर सकता हूं कि सभी आरटीओएस (जिसमें कमांड शामिल हैं) पर बनाए गए स्ट्रिंग ऑब्जेक्ट्स को पूर्ण रूप से समाप्त कर दिया जाए? या, यह ओएस पर आधारित अलग होगा?

अपडेट करें

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


3
मैंने एक लंबे समय में C का उपयोग नहीं किया है, लेकिन मैं एक ऐसे समय के बारे में नहीं सोच सकता जब मैं एक कार्यान्वयन में भाग लिया था जिसमें NULL-term स्ट्रिंग्स का उपयोग नहीं किया गया था। यह मानक C का हिस्सा है, अगर मुझे सही से याद है (जैसे मैंने कहा, यह थोड़ी देर हो गई है ...)
MetalMikester

1
मैं C का विशेषज्ञ नहीं हूं, लेकिन जहां तक ​​मुझे पता है कि C के सभी तार चार, शून्य से समाप्त किए गए हैं। आप अपने स्वयं के स्ट्रिंग प्रकार बना सकते हैं, लेकिन आपको अपने द्वारा सभी स्ट्रिंग हेरफेर कार्यों को लागू करना होगा।
मचाडो


1
@MetalMikester आपको लगता है कि यह जानकारी मानक सी कल्पना में मिल सकती है?
स्नूप

3
@ चंदवा सबसे अधिक संभावना है, हाँ। लेकिन वास्तव में, जब C में तार के बारे में बात की जाती है, तो वे केवल वर्णों का एक सरणी होते हैं, जो NULL के साथ समाप्त होते हैं और यह तब तक है, जब तक आप किसी प्रकार के गैर-मानक स्ट्रिंग लाइब्रेरी का उपयोग नहीं करते हैं, लेकिन हम यहाँ वैसे भी बात नहीं कर रहे हैं। मुझे संदेह है कि आपको एक ऐसा मंच मिलेगा जो सम्मान नहीं करता है, खासकर सी की ताकत में से एक पोर्टेबिलिटी के साथ।
मेटलमेस्टर

जवाबों:


42

जिन चीजों को "सी स्ट्रिंग्स" कहा जाता है, उन्हें किसी भी मंच पर शून्य-समाप्त कर दिया जाएगा। इस तरह से मानक सी लाइब्रेरी फ़ंक्शन एक स्ट्रिंग के अंत का निर्धारण करते हैं।

सी भाषा के भीतर, ऐसे पात्रों की एक सरणी होने से आपको रोकना कुछ भी नहीं है जो एक शून्य में समाप्त नहीं होते हैं। हालाँकि आपको किसी स्ट्रिंग के अंत से बचने के लिए किसी अन्य विधि का उपयोग करना होगा।


4
बस पर जोड़ने के लिए; आमतौर पर आपके पास तार की लंबाई का ट्रैक रखने के लिए एक पूर्णांक होता है और फिर आप इसे करने के लिए एक कस्टम डेटा संरचना के साथ समाप्त करते हैं, क्यूटी में QString वर्ग की
रुडोल्फ ओलाह

8
बिंदु में मामला: मैं एक सी प्रोग्राम के साथ काम करता हूं जो कम से कम पांच अलग-अलग स्ट्रिंग स्वरूपों का उपयोग करता है: अशक्त-समाप्त charसरणियों, charपहली बाइट में एन्कोडेड लंबाई के साथ सरणियों (आमतौर पर "पास्कल स्ट्रिंग्स" के रूप में जाना जाता है), wchar_tदोनों के -बेड संस्करण ऊपर, और charसरणियाँ जो दोनों विधियों को जोड़ती हैं: पहली बाइट में एन्कोडेड लंबाई, और स्ट्रिंग को समाप्त करने वाला एक अशक्त चरित्र।
मार्क

4
@ 3 डी पार्टी घटकों / अनुप्रयोगों या एक विरासत कोड मेस के बहुत सारे के साथ अंतर?
दान

2
@DanNeely, उपरोक्त सभी। क्लासिक MacOS के साथ इंटरफेसिंग के लिए पास्कल स्ट्रिंग्स, आंतरिक उपयोग के लिए C स्ट्रिंग्स और विंडोज, यूनिकोड सपोर्ट के लिए वाइड स्ट्रिंग्स, और बास्टर्ड स्ट्रिंग्स, क्योंकि किसी ने चालाक होने की कोशिश की और एक ऐसा स्ट्रिंग बनाया जो एक ही समय में MacOS और Windows दोनों के साथ इंटरफेस कर सके।
मार्क

1
@ मर्क ... और निश्चित रूप से कोई भी तकनीकी ऋण का भुगतान करने के लिए पैसा खर्च करने को तैयार नहीं है क्योंकि क्लासिक मैकओएस लंबे समय तक मृत है, और हरामी तार हर बार एक डबल क्लस्टरफ्राक होता है जिसे उन्हें छूने की आवश्यकता होती है। मेरी सहानुभूति।
दान

22

समाप्त करने वाले चरित्र का निर्धारण सामान्य रूप से तार के लिए शाब्दिक और मानक पुस्तकालय के कार्यान्वयन के लिए कंपाइलर तक है। यह ऑपरेटिंग सिस्टम द्वारा निर्धारित नहीं किया जाता है।

NULसमाप्ति का सम्मेलन पूर्व-मानक सी पर वापस जाता है, और 30+ वर्षों में, मैं यह नहीं कह सकता कि मैं एक ऐसे वातावरण में चला गया हूं जो कुछ और करता है। यह व्यवहार C89 में संहिताबद्ध था और C भाषा के मानक का हिस्सा बना हुआ है (लिंक C99 के मसौदे के लिए है):

  • धारा 6.4.5 में NULस्ट्रिंग शाब्दिकों के लिए NULसंलग्न होने की आवश्यकता के द्वारा मंच के लिए अलग- अलग तार निर्धारित किए गए हैं ।
  • धारा Section.१.१ मानक पुस्तकालय में कार्यों को एक स्ट्रिंग द्वारा परिभाषित करते हुए "पहले रिक्त चरित्र द्वारा और पात्रों को समाप्‍त करने वाला अनुक्रम" के रूप में लाता है ।

ऐसा कोई कारण नहीं है कि कोई ऐसे कार्यों को नहीं लिख सकता है जो किसी अन्य चरित्र द्वारा समाप्त किए गए तारों को संभालते हैं, लेकिन ज्यादातर मामलों में स्थापित मानक को हिरन करने का कोई कारण नहीं है जब तक कि आपका लक्ष्य प्रोग्रामर फिट नहीं हो रहा है। :-)


2
एक ही कारण होगा कि बार-बार एक ही स्ट्रिंग के अंत का पता लगाने से बचें।
पाओलो एबरमन

@ Pa @loEbermann अधिकार। एक के बजाय दो मूल्यों को पारित करने की कीमत पर। यदि आप एक स्ट्रिंग शाब्दिक पास करते हैं, तो यह थोड़ा अजीब है printf("string: \"%s\"\n", "my cool string")। इस मामले में चार मापदंडों को पारित करने का एकमात्र तरीका (कुछ प्रकार की समाप्ति बाइट के अलावा) std::stringसी + + में कुछ होने के लिए एक स्ट्रिंग को परिभाषित करना होगा , जिसकी अपनी समस्याएं और सीमाएं हैं।
सेंटास्टर - मोनिका

1
धारा 6.4.5 की आवश्यकता नहीं है एक स्ट्रिंग शाब्दिक एक अशक्त चरित्र के साथ समाप्त किया जाना है। यह स्पष्ट रूप से नोट करता है " एक चरित्र स्ट्रिंग शाब्दिक की आवश्यकता एक स्ट्रिंग नहीं है (7.1.1 देखें), क्योंकि एक अशक्त चरित्र को इसमें \ 0 एस्केप अनुक्रम द्वारा एम्बेड किया जा सकता है। "
बेज़मैन

1
@bzeaman फुटनोट कहता है कि आप एक स्ट्रिंग शाब्दिक का निर्माण कर सकते हैं जो एक स्ट्रिंग की 7.1.1 की परिभाषा को पूरा नहीं करता है, लेकिन इसका उल्लेख करने वाला वाक्य कहता है कि कंपाइलर कंपाइलर NULउन्हें कोई फर्क नहीं पड़ता है: "अनुवाद चरण 7, एक बाइट या कोड में। मूल्य शून्य को प्रत्येक मल्टीबीट चरित्र अनुक्रम से जोड़ा जाता है जो एक स्ट्रिंग शाब्दिक या शाब्दिक परिणाम देता है। " लायब्रेरी फ़ंक्शन 7.1.1 की परिभाषा का उपयोग करते हुए सबसे पहले NULवे पाते हैं और पता नहीं चलेगा या परवाह नहीं करेगा कि इसके अतिरिक्त वर्ण मौजूद हैं।
ब्लरफ्ल

मुझे सही साबित होना है। मैंने 'null' जैसे विभिन्न शब्दों की खोज की, लेकिन 6.4.5.5 'मूल्य शून्य' का उल्लेख करने से चूक गया।
बेज़मैन ३०'१

3

मैं एम्बेडेड सिस्टम के साथ काम कर रहा हूं ... बिना ऑपरेटिंग सिस्टम के ... मैं ... NULL टर्मिनेटेड कैरेक्टर पॉइंटर्स होने के विचार का उपयोग कर रहा हूं और उन्हें स्ट्रिंग्स के रूप में मानता हूं जहां NULL अंत का संकेत देता है। मुझे पता है कि यह काफी सामान्य है, लेकिन क्या आप हमेशा इस पर भरोसा कर सकते हैं?

सी भाषा में कोई स्ट्रिंग डेटा प्रकार नहीं है, लेकिन स्ट्रिंग शाब्दिक हैं

यदि आप अपने कार्यक्रम में एक स्ट्रिंग शाब्दिक डालते हैं, तो यह आमतौर पर एनयूएल समाप्त हो जाएगा (लेकिन नीचे दिए गए टिप्पणियों में चर्चा किए गए विशेष मामले को देखें।) यह कहना है, यदि आप "foobar"उस स्थान पर रखते हैं जहां एक const char *मूल्य की उम्मीद है, तो कंपाइलर निकल जाएगा। foobar⊘आपके प्रोग्राम के कॉन्स्ट / कोड सेगमेंट / सेक्शन और एक्सप्रेशन का मूल्य उस एड्रेस के लिए एक पॉइंटर होगा, जहाँ उसने fकैरेक्टर स्टोर किया था । (नोट: मैं NUL बाइट को दर्शाने के लिए उपयोग कर रहा हूं ।)

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

वे केवल कोड हैं --- उस कोड से अलग नहीं जिसे आप स्वयं लिखते हैं। यदि आप उन्हें पोर्ट करते समय नहीं तोड़ते हैं, तो वे वही करेंगे जो वे हमेशा करते हैं (उदाहरण के लिए, एनयूएल पर रोक)।


2
पुन: "यदि आप अपने कार्यक्रम में एक स्ट्रिंग शाब्दिक डालते हैं, तो यह हमेशा एनयूएल समाप्त हो जाएगा": क्या आप इसके बारे में निश्चित हैं? मुझे पूरा यकीन है कि (जैसे) char foo[4] = "abcd";चार वर्णों के गैर-शून्य-समाप्त सरणी बनाने के लिए एक वैध तरीका है।
21:17

2
@ruakh, उफ़! यह एक ऐसा मामला है जिस पर मैंने विचार नहीं किया। मैं एक स्ट्रिंग शाब्दिक के बारे में सोच रहा था जो एक ऐसी जगह पर दिखाई देता है जहां एक char const * अभिव्यक्ति की उम्मीद है। मैं भूल गया कि सी इनिशियलाइज़र कभी-कभी विभिन्न नियमों का पालन कर सकते हैं।
सोलोमन स्लो

@ruakh स्ट्रिंग शाब्दिक NUL- समाप्त है। सरणी नहीं है।
jamesdlin

2
@ ओरुख आपके पास ए char[4]। यह एक तार नहीं है, लेकिन इसे एक से शुरू किया गया था
कैलथ

2
@ कैलेथ, "एक से इनिशियलाइज़्ड" कुछ ऐसा नहीं है जो रन टाइम पर होना चाहिए। यदि हम staticRuakh के उदाहरण में कीवर्ड जोड़ते हैं , तो कंपाइलर एक आरंभिक डेटा सेगमेंट में एक गैर NUL टर्मिनेटेड "abcd" का उत्सर्जन कर सकता है , ताकि वेरिएबल प्रोग्राम लोडर द्वारा आरम्भ किया जा सके। तो, रुख सही था: कम से कम एक मामला है जहां एक कार्यक्रम में एक स्ट्रिंग शाब्दिक की उपस्थिति को एनयूएल-समाप्त स्ट्रिंग का उत्सर्जन करने के लिए संकलक की आवश्यकता नहीं होती है। (पीएस, मैंने वास्तव में उदाहरण 5.4 gcc के साथ संकलित किया, और संकलक ने NUL का उत्सर्जन नहीं किया।)
सोलोमन स्लो

2

जैसा कि अन्य लोगों ने उल्लेख किया है, स्ट्रिंग्स का शून्य समापन सी स्टैंडर्ड लाइब्रेरी का एक सम्मेलन है। यदि आप मानक पुस्तकालय का उपयोग नहीं करने जा रहे हैं, तो आप किसी भी तरह से अपनी इच्छानुसार तारों को संभाल सकते हैं।

यह 'सी' संकलक के साथ किसी भी ऑपरेटिंग सिस्टम का सच है, और साथ ही, आप 'सी' प्रोग्राम लिख सकते हैं जो एक सच्चे ऑपरेटिंग सिस्टम के तहत नहीं चलते हैं जैसा कि आप अपने प्रश्न में उल्लेख करते हैं। एक उदाहरण एक स्याही जेट प्रिंटर के लिए नियंत्रक होगा जिसे मैंने एक बार डिज़ाइन किया था। एम्बेडेड सिस्टम में, ऑपरेटिंग सिस्टम की मेमोरी ओवरहेड आवश्यक नहीं हो सकती है।

स्मृति-तंग स्थितियों में, मैं अपने संकलक की विशेषताओं को देखूंगा, उदाहरण के लिए, प्रोसेसर का निर्देश सेट। एक आवेदन में जहां तार को काफी संसाधित किया जाता है, स्ट्रिंग स्ट्रिंग लंबाई जैसे विवरणों का उपयोग करना वांछनीय हो सकता है। मैं एक ऐसे मामले के बारे में सोच रहा हूं जहां सीपीयू विशेष रूप से छोटे रजिस्टरों और / या रिश्तेदार रजिस्टरों के साथ काम कर रहा है।

तो जो आपके आवेदन में अधिक महत्वपूर्ण है: कोड आकार और दक्षता, या ओएस या लाइब्रेरी के साथ संगतता? एक और विचार रख-रखाव हो सकता है। जितना अधिक आप सम्मेलन से भटकेंगे, उतना ही कठिन होगा किसी और को बनाए रखना।


1

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

सी स्ट्रिंग्स अशक्त हैं। है यही कारण है कि, वे में शून्य वर्ण के द्वारा समाप्त कर रहे हैं NUL। वे शून्य सूचक द्वारा समाप्त नहीं किए जाते हैं NULL, जो कि पूरी तरह से अलग उद्देश्य के साथ एक अलग तरह का मूल्य है।

NULपूर्णांक मान शून्य होने की गारंटी है। स्ट्रिंग के भीतर, इसमें अंतर्निहित चरित्र प्रकार का आकार भी होगा, जो आमतौर पर 1 होगा।

NULLपूर्णांक प्रकार की गारंटी नहीं है। NULLएक पॉइंटर संदर्भ में उपयोग के लिए अभिप्रेत है, और आमतौर पर एक पॉइंटर प्रकार की अपेक्षा की जाती है, जो कि आपके कंपाइलर के किसी भी अच्छे होने पर एक चरित्र या पूर्णांक में परिवर्तित नहीं होना चाहिए। जबकि NULLग्लिफ़ की परिभाषा में 0, यह वास्तव में उस मूल्य [1] की गारंटी नहीं है, और जब तक आपका संकलक एक-चरित्र के रूप में स्थिरांक को लागू #defineनहीं करता है (कई नहीं, क्योंकि NULL वास्तव में गैर में सार्थक नहीं होना चाहिए सूचक संदर्भ), इसलिए विस्तारित कोड वास्तव में एक शून्य मान (भले ही यह भ्रामक रूप से एक शून्य ग्लिफ़ शामिल करता है) को शामिल करने की गारंटी नहीं है।

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

अब ज्यादातर लोग इसे देखेंगे और सोचेंगे, "ऑल-ज़ीरो-बिट्स के अलावा कुछ भी संकेत के रूप में शून्य संकेत? क्या बकवास है" - लेकिन इस तरह की धारणाएं x86 जैसे सामान्य प्लेटफार्मों पर ही सुरक्षित हैं। चूंकि आपने स्पष्ट रूप से अन्य प्लेटफार्मों को लक्षित करने में रुचि का उल्लेख किया है, इसलिए आपको इस मुद्दे को ध्यान में रखना होगा, क्योंकि आपने पॉइंटर्स और पूर्णांकों के बीच संबंधों की प्रकृति के बारे में मान्यताओं से अपने कोड को स्पष्ट रूप से अलग कर दिया है।

इसलिए, जबकि C तार अशक्त हैं, उन्हें समाप्त नहीं किया गया है NULL, लेकिन NUL(आमतौर पर लिखा गया है '\0')। कोड जो स्पष्ट NULLरूप से एक स्ट्रिंग टर्मिनेटर के रूप में उपयोग करता है, प्लेटफ़ॉर्म पर एक सीधी पता संरचना के साथ काम करेगा, और यहां तक ​​कि कई कंपाइलरों के साथ भी संकलित करेगा, लेकिन यह बिल्कुल सही सी नहीं है।


[१] वास्तविक अशक्त पॉइंटर मान को संकलक द्वारा डाला जाता है जब यह एक संदर्भ में एक 0 टोकन पढ़ता है जहां इसे एक पॉइंटर प्रकार में परिवर्तित किया जाएगा। यह पूर्णांक मान 0 से रूपांतरण नहीं है , और यह सुनिश्चित करने की गारंटी नहीं है कि टोकन के अलावा कुछ भी 0उपयोग नहीं किया जाता है, जैसे कि एक चर से एक गतिशील मूल्य; रूपांतरण भी प्रतिवर्ती नहीं है, और एक शून्य सूचक को पूर्णांक में परिवर्तित होने पर मान 0 प्राप्त नहीं करना पड़ता है।


महान बिंदु। मैंने इसे स्पष्ट करने में सहायता के लिए एक संपादन प्रस्तुत किया है।
मोंटी हार्डर

" NULपूर्णांक मान शून्य होने की गारंटी है।" -> C परिभाषित नहीं करता है NUL। इसके बजाय C परिभाषित करता है कि तार में एक अंतिम नल का टुकड़ा है , एक बाइट जिसमें सभी बिट्स 0.
chux के

1

मैं सी में स्ट्रिंग का उपयोग कर रहा हूं, इसका मतलब है कि शून्य समाप्ति वाले वर्णों को स्ट्रिंग्स कहा जाता है।

जब आप बेयरमेटल या विंडोज, लिनक्स, आरटीओएस: (फ्रीआरटीओ, ओएसई) जैसे किसी भी ऑपरेटिंग सिस्टम में उपयोग करते हैं, तो यह कोई समस्या नहीं होगी।

एम्बेडेड वर्ल्ड में अशक्त समाप्ति वास्तव में स्ट्रिंग के रूप में चरित्र को टोकन करने में अधिक मदद करती है।

मैं कई सुरक्षा महत्वपूर्ण प्रणालियों में सी की तरह तार का उपयोग कर रहा हूँ।

आप सोच रहे होंगे कि वास्तव में C में स्ट्रिंग क्या है?

सी-स्टाइल स्ट्रिंग्स, जो सरणियां हैं, स्ट्रिंग स्ट्रिंग भी हैं, जैसे "यह"। वास्तव में, ये दोनों स्ट्रिंग प्रकार केवल स्मृति में एक दूसरे के बगल में बैठे पात्रों के संग्रह हैं।

जब भी आप एक स्ट्रिंग लिखते हैं, दोहरे उद्धरण चिह्नों में संलग्न होता है, C स्वतः ही हमारे लिए एक वर्ण बनाता है, जिसमें वह स्ट्रिंग होती है, जिसे \ 0 वर्ण द्वारा समाप्त किया जाता है।

उदाहरण के लिए, आप वर्णों की एक सरणी घोषित और परिभाषित कर सकते हैं, और इसे एक स्ट्रिंग स्थिरांक के साथ आरंभ कर सकते हैं:

char string[] = "Hello cruel world!";

सीधा जवाब: आपको वास्तव में अशक्त समाप्ति वाले पात्रों के उपयोग के बारे में चिंता करने की आवश्यकता नहीं है, यह किसी भी मंच से स्वतंत्र है।


धन्यवाद, पता नहीं था कि जब दोहरे उद्धरण चिह्नों के साथ घोषित किया जाता है, NULतो स्वचालित रूप से जोड़ा जाता है।
स्नूप

1

जैसा कि दूसरों ने कहा है, अशक्त समाप्ति मानक सी के लिए बहुत सार्वभौमिक है। लेकिन (जैसा कि अन्य ने भी बताया है) 100% नहीं। (एक और) उदाहरण के लिए, वीएमएस ऑपरेटिंग सिस्टम आम तौर पर क्या यह "स्ट्रिंग वर्णनकर्ता" कहा जाता इस्तेमाल किया http://h41379.www4.hpe.com/commercial/c/docs/5492p012.html द्वारा सी में पहुँचा # शामिल <descrip.h >

एप्लिकेशन-स्तरीय सामान शून्य समाप्ति का उपयोग कर सकता है या नहीं, हालांकि डेवलपर फिट देखता है। लेकिन निम्न स्तर के वीएमएस सामान के लिए पूरी तरह से वर्णनकर्ताओं की आवश्यकता होती है, जो कि शून्य समाप्ति का उपयोग नहीं करते हैं (विवरण के लिए उपरोक्त लिंक देखें)। यह काफी हद तक इतना है कि सभी भाषाओं (सी, विधानसभा, आदि) जो सीधे वीएमएस इंटर्नल्स का उपयोग करते हैं, उनके साथ एक सामान्य इंटरफ़ेस हो सकता है।

इसलिए यदि आप किसी भी तरह की समान स्थिति की आशंका कर रहे हैं, तो आप "सार्वभौमिक अशक्तता समाप्ति" की तुलना में कुछ अधिक सावधान रहना चाह सकते हैं। यदि आप जो कर रहे हैं, तो मैं अधिक सावधान रहूंगा, लेकिन मेरे आवेदन-स्तर के सामान के लिए यह शून्य समाप्ति मान लेना सुरक्षित है। मैं आपको सुरक्षा के समान स्तर का सुझाव नहीं दूंगा। आपके कोड को अच्छी तरह से असेंबली, और / या अन्य के साथ इंटरफ़ेस करना पड़ सकता है, कुछ भविष्य के बिंदु पर भाषा कोड, जो हमेशा शून्य-समाप्त स्ट्रिंग्स के सी मानक के अनुरूप नहीं हो सकता है।


आज, 0 समाप्ति वास्तव में काफी असामान्य है। C ++ std :: string does, Java String, Objective-C NSString नहीं करता, Swift String नहीं करता है - परिणामस्वरूप, प्रत्येक भाषा पुस्तकालय स्ट्रिंग के अंदर NUL कोड के साथ तार का समर्थन करता है (जो C के साथ असंभव है। स्पष्ट कारणों के लिए तार)।
gnasher729

@ gnasher729 मैं बदल गया "... बहुत अधिक सार्वभौमिक" से "मानक सी के लिए बहुत सार्वभौमिक", जो मुझे आशा है कि किसी भी अस्पष्टता को हटाता है और आज भी सही है (और जो मेरा मतलब था, ओपी के विषय और प्रश्न के अनुसार)।
जॉन फोर्कोश

0

एम्बेडेड, सेफ्टी क्रिटिकल और रियल टाइम सिस्टम के मेरे अनुभव में, यह C और PASCAL स्ट्रिंग कन्वेंशन दोनों का उपयोग करने के लिए असामान्य नहीं है, अर्थात स्ट्रिंग्स की लंबाई को पहले चरित्र के रूप में आपूर्ति करने के लिए, (जो लंबाई 255 तक सीमित है), और अंत करने के लिए कम से कम एक 0x00, ( NUL) के साथ स्ट्रिंग , जो प्रयोग करने योग्य आकार को 254 तक कम कर देता है।

इसका एक कारण यह जानना है कि पहली बाइट प्राप्त होने के बाद आप कितने डेटा की उम्मीद कर रहे हैं और दूसरा यह है कि, ऐसे सिस्टम में डायनेमिक बफर साइज़ से बचा जा सकता है - जहाँ एक निश्चित 256 बफर साइज़ आवंटित करना तेज़ और सुरक्षित है, (नहीं जाँच करने की आवश्यकता है कि क्या mallocविफल)। एक और यह है कि जिन अन्य प्रणालियों के साथ आप संवाद कर रहे हैं, वे एएनएसआई-सी में नहीं लिखी जा सकती हैं।

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

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