C में एक स्ट्रिंग की परिभाषा की विशिष्टताएं क्या हैं?


10

मैं अपनी एक कक्षा के लिए एक होमवर्क प्रश्न का उत्तर देने वाला हूं। विशेष रूप से, मुझे यह कहना है कि यदि C में कुछ सरणियों को स्ट्रिंग माना जाता है या नहीं। इस लेख के आधार पर ( https://www.geeksforgeeks.org/strings-in-c-2/ ) मुझे पता है कि तार अंत में अशक्त टर्मिनेटर के साथ वर्णों की एक सरणी है।

मेरा मुख्य हैंगअप प्रश्न का एक हिस्सा है जो एक सरणी के बारे में पूछता है जो इस तरह दिखता है:

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };

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

संपादित करें: टिप्पणियों के आधार पर, मैंने प्रश्न का वास्तविक शब्द प्रदान किया है:

"निम्न सरणियों में से किसे" स्ट्रिंग्स "को स्ट्रैपी (), स्ट्रेंची (), स्ट्रैम्प (), स्ट्रेंकम्प (), और इसी तरह के स्ट्रिंग फ़ंक्शंस (सभी लागू इंगित करें) के रूप में उपयोग करने के प्रयोजनों के लिए" स्ट्रिंग्स "माना जा सकता है?"

EDIT: मैंने अपने प्रोफेसर को इसके बारे में ईमेल किया था क्योंकि सवाल अस्पष्ट रूप से शब्द के रूप में लग रहा था (जैसा कि कई लोगों ने बताया)। अगर किसी को उत्सुकता है, तो उसने मुझसे कहा "हाँ यह एक स्ट्रिंग है। कुंजी यह है कि एक अशक्त चरित्र है। लेकिन निश्चित रूप से यह किसी भी स्ट्रिंग संचालन को प्रभावित करेगा; स्ट्रिंग अशक्त चरित्र पर समाप्त होता है।"


4
आप कह सकते हैं कि यह "CS"कूड़े के कुछ बाइट्स के साथ स्ट्रिंग है (जिसमें अंतिम एनयूएल चरित्र अप्रासंगिक है)। लेकिन यह एक स्ट्रिंग नहीं है "एक पूरे के रूप में"। - फिर भी, इसे strcpyआदि को खिलाने से आपके पीसी में विस्फोट नहीं होगा क्योंकि ये कार्य केवल "CS"भाग को "देखेंगे" ।
हेगन वॉन एटिजन

2
c1 कर सकते हैं पूरी तरह से करने के लिए एक तर्क के रूप में इस्तेमाल किया जा strcmp()। क्या इसे स्ट्रिंग फ़ंक्शन को म्यूट करने के लिए एक तर्क के रूप में इस्तेमाल किया जा सकता है जो प्रदान नहीं किए गए अतिरिक्त कारकों पर निर्भर करता है।
EOF

2
सामग्री c1परस्पर परिवर्तनशील हैं, इसलिए मैं यह नहीं देखता कि यह strcpyतब तक या इसके समान वैध गंतव्य तर्क में विफल क्यों न हो जाए , क्योंकि यह स्रोत स्ट्रिंग को समायोजित करने के लिए पर्याप्त बड़ा नहीं था। यह एक स्ट्रिंग नहीं होगा, बस एक दिए गए उद्देश्य के लिए एक उपयुक्त नहीं है।
जॉन बोलिंगर

1
कुल मिलाकर, मैं सहमत हूं कि प्रश्न अस्पष्ट रूप से शब्दबद्ध है। अभिव्यक्ति c1सभी मानक पुस्तकालय (संकीर्ण) स्ट्रिंग कार्यों के लिए तर्कों के लिए बुनियादी आवश्यकताओं को पूरा करेगी, जिसमें विशेष रूप से नामित सभी शामिल हैं, लेकिन व्यवहार वह नहीं हो सकता है जो कॉलर उम्मीद करता है या चाहता है (यहां तक ​​कि अपरिभाषित व्यवहारों की अनदेखी भी करता है)।
जॉन बोलिंगर

1
ध्यान दें कि प्रकार की आवश्यकता नहीं है char। कोई भी कैरेक्टर टाइप करेगा।
चक्स

जवाबों:


8

c1ज्यादातर [1] बराबर करने के लिए है &c1[0], है, जो एक स्ट्रिंग कर रहा है "CS"

वहाँ एक दूसरा स्ट्रिंग है, वहाँ "324"पर, शुरू &c1[3]- लेकिन जब तक आप के c1रूप में पहुँच c1, स्ट्रिंग "CS"सभी कार्यों strcpy()एट अल है। देखना होगा।


[१]: c1एक सरणी है, &c1[0]एक सूचक है।


तो, क्या कमांड c1में लक्ष्य स्ट्रिंग के रूप में उपयोग करना उचित है strcpy()? सवाल अस्पष्ट है - सबसे अच्छा।
एंड्रयू हेनले

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

" मिसल्स के c1बराबर है &c1[0]"। c1एक सरणी है। &c1[0]एक सूचक है।
chux -

2

यदि आप सी में एक स्ट्रिंग की परिभाषा की बारीकियों को जानना चाहते हैं, तो स्रोत पर जाएं।

C90 मानक से :

7 पुस्तकालय

Introduction.१ परिचय

7.1.1 शब्दों की परिभाषाएँ
एक स्ट्रिंग वर्णों का एक सन्निहित अनुक्रम है, जिसमें पहले अशक्त चरित्र को शामिल किया गया है। एक "सूचक" एक स्ट्रिंग अपने प्रारंभिक (सबसे कम संबोधित) चरित्र के लिए एक सूचक है। एक स्ट्रिंग की "लंबाई" शून्य वर्ण से पहले के वर्णों की संख्या है और इसका "मूल्य" क्रम में निहित वर्णों के मूल्यों का अनुक्रम है।

(बाद के मानकों में कोई प्रासंगिक परिवर्तन नहीं थे।)

इस प्रकार, c1दो लगातार तार शामिल हैं, "सीएस" और "324", लेकिन स्वयं एक स्ट्रिंग नहीं है।

यदि हम किसी फ़ंक्शन के लिए एक सरणी पास करते हैं, तो यह एक पॉइंटर को उसके पहले तत्व के लिए तय करता है, इस प्रकार +c1एक स्ट्रिंग (पहले वाला) को इंगित करता है, जो किसी भी फ़ंक्शन को स्ट्रिंग के लिए एक पॉइंटर की उम्मीद के लिए पर्याप्त है। यह "CS \ 0324" स्ट्रिंग की ओर इशारा नहीं करता है, लेकिन यह शायद आपके प्रशिक्षकों के प्रश्न के लिए पर्याप्त है, जो अस्पष्ट है।


4
मेरा तर्क है कि इस परिभाषा से भी, c1 स्पष्ट रूप से स्ट्रिंग "CS" है। अवधि। तथ्य यह है कि यह टर्मिनेटर अप्रासंगिक होने के बाद गैर-शून्य बाइट्स हो सकता है - कई तार अपने जीवनकाल में उस तरह होंगे।
ली डैनियल क्रोकर

+c1एक स्ट्रिंग को इंगित करता है, क्योंकि c1एक स्ट्रिंग से शुरू होता है। यह किसी भी तरह से, आकार या रूप में नहीं है, c1हालांकि एक स्ट्रिंग बनाते हैं ।
डेडुप्लिकेटर

2
यह मेमोरी के एक सेक्शन का पता है जिसमें शून्य बाइट द्वारा समाप्त किए गए कुछ अक्षर होते हैं। यदि% s के साथ प्रिंटफ () ठीक है, तो यह स्ट्रैलेन () को पारित किए गए बिलकुल अच्छे नंबर देगा, अगर स्ट्रैपी (), आदि को पारित किया जाता है, तो यह मेरे लिए एक स्ट्रिंग की तरह लगता है।
ली डैनियल क्रोकर


बेशक। लेकिन सरणियाँ निश्चित रूप से तार हो सकती हैं।
ली डैनियल क्रोकर

0

@ DevSolar के उत्तर में जोड़ते हुए, कुछ ऐसा जो मैंने दिए गए स्ट्रिंग के साथ रहने के बाद खोजा, अगर यह होना चाहिए:

char c1[] = { 'C', 'S', '\\0', '3', '2', '4', '\\0' };

यदि आप इस स्ट्रिंग को आउटपुट करते हैं, तो आपको मिलेगा CS03240और इस स्ट्रिंग का आकार है। 7. जहां तक ​​मेरी समझ है, \\0का उपयोग अशक्त वर्ण ( यानी \0 ) को दर्शाने के लिए किया जाता है । यदि तुम करो:

printf("\0");

आपको आउटपुट लॉग पर कुछ भी दिखाई नहीं देता है, लेकिन यदि आप ऐसा करते हैं:

printf("\\0");

आप एक \0ऐसी चीज देखते हैं , जो अपेक्षित है क्योंकि विशेष वर्ण जैसे कि बैकस्लैश या कोट्स को आउटपुट करने के लिए, आपको \उनके साथ उपयोग करने की आवश्यकता है ।

कुछ जो मुझे पहेली है वह आउटपुट है CS03240और इसका आकार 7 है। यह आम समझ है कि एक स्ट्रिंग का आकार इसके प्लस एक (शून्य वर्ण के लिए) वर्णों की संख्या है। इसके अलावा, स्ट्रिंग के लिए आकार 7 भी है char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };

तो शायद इस सवाल का पालन करें, यहां क्या चल रहा है?


1
'\\0'एक अशक्त चरित्र नहीं है । यह एक बहु-चरित्र स्थिरांक है। इसमें निश्चित रूप से सीमा के बाहर कार्यान्वयन परिभाषित मूल्य है charc1[]एक स्ट्रिंग नहीं है क्योंकि इसमें एक अशक्त चरित्र का अभाव है । "आप इस स्ट्रिंग को आउटपुट करते हैं" अनिर्धारित व्यवहार के संभावित परिणाम ।
chux -

हालांकि, मैंने मल्टी कैरेक्टर कांस्टेंट के रूप में देखा, लेकिन मैं आपको बिल्कुल नहीं मिला। यदि c1 [] एक स्ट्रिंग नहीं है क्योंकि इसमें अंत में एक अशक्त चरित्र नहीं है, तो ओपी द्वारा पोस्ट किए गए प्रारंभिक मामले में आकार 7 के रूप में क्यों निकल रहा है?
rasengan__

char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' };आकार 7 है क्योंकि यह 7 मानों के साथ आरंभिक है। यह आकार के साथ कोई संबंध नहीं है तारchar c1[] = { 1, 2, 3, 4, 5, 6, 7 };यह अभी भी आकार बना देगा 7.
chux - मोनिका

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