स्ट्रिंग (कंप्यूटर विज्ञान): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(9 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|Sequence of characters, data type}}
{{Short description|Sequence of characters, data type}}
{{more citations needed|date=March 2015}}
{{more citations needed|date=March 2015}}
[[कंप्यूटर प्रोग्रामिंग]] में, एक स्ट्रिंग पारंपरिक रूप से वर्णों का एक [[अनुक्रम]] है, या तो शाब्दिक स्थिरांक या किसी प्रकार के चर के रूप में। उत्तरार्द्ध अपने तत्वों को उत्परिवर्तित करने और लंबाई बदलने की अनुमति दे सकता है, या इसे तय किया जा सकता है (निर्माण के बाद)। एक स्ट्रिंग को सामान्यतः [[डेटा प्रकार]] के रूप में माना जाता है और इसे अक्सर बाइट्स (या शब्दों) की सरणी डेटा संरचना के रूप में कार्यान्वित किया जाता है जो कुछ [[अक्षरों को सांकेतिक अक्षरों में बदलना|वर्ण एन्कोडिंग]] का उपयोग करके तत्वों के अनुक्रम को संग्रहीत करता है, सामान्यतः वर्ण स्ट्रिंग अधिक सामान्य सरणियों या अन्य अनुक्रम (या [[सूची (सार डेटा प्रकार)|सूची]]) डेटा प्रकारों और संरचनाओं को भी निरूपित कर सकता है।
[[कंप्यूटर प्रोग्रामिंग]] में, '''स्ट्रिंग''' पारंपरिक रूप से वर्णों का एक [[अनुक्रम]] है जो शाब्दिक स्थिरांक या किसी अन्य प्रकार के चर के रूप में निर्धारित डेटा को उत्परिवर्तित करने या लंबाई मे परिवर्तन की स्वीकृति देती है प्रायः इसे प्रोग्राम के बाद निर्धारित किया जा सकता है। एक स्ट्रिंग को सामान्यतः [[डेटा प्रकार]] के रूप में माना जाता है और इसे प्रायः बाइट्स या शब्दों की सूची डेटा संरचना के रूप में कार्यान्वित किया जाता है इसमे कुछ [[अक्षरों को सांकेतिक अक्षरों में बदलना|वर्ण संकेतीकरण]] का उपयोग करके डेटा के अनुक्रम को संग्रहीत करते है सामान्यतः वर्ण स्ट्रिंग अधिक सामान्य तालिका या अन्य अनुक्रम [[सूची (सार डेटा प्रकार)|सूची]] से डेटा प्रकारों और संरचनाओं को भी निरूपित कर सकते हैं।


प्रोग्रामिंग भाषा और उपयोग किए गए सटीक डेटा प्रकार के आधार पर, एक स्ट्रिंग के रूप में घोषित चर या तो स्मृति में भंडारण को पूर्व निर्धारित अधिकतम लंबाई के लिए स्थिर रूप से आवंटित किया जा सकता है या [[गतिशील आवंटन]] को नियोजित कर सकता है ताकि यह तत्वों की एक चर संख्या को धारण कर सके।
प्रोग्रामिंग भाषा और अपेक्षाकृत डेटा प्रकार के आधार पर एक स्ट्रिंग के रूप में घोषित चर का उपयोग या तो मेमोरी में भंडारण की पूर्व निर्धारित अधिकतम लंबाई के लिए स्थिर रूप से आवंटित किया जा सकता है या [[गतिशील आवंटन|गतिशील भंडारण]] को नियोजित करने के लिए इसे डेटा की एक चर संख्या निर्धारित करने के लिए स्वीकृत किया जा सकता है।


जब एक स्ट्रिंग शाब्दिक रूप से स्रोत कोड में दिखाई देती है, तो इसे एक स्ट्रिंग शाब्दिक या अनाम स्ट्रिंग के रूप में जाना जाता है।<ref>{{cite web|url=http://www.acsu.buffalo.edu/~fineberg/mfc158/week10lecture.htm|title=Introduction To Java - MFC 158 G|quote=String literals (or constants) are called ‘anonymous strings’|url-status=live|archive-url=https://web.archive.org/web/20160303233357/http://www.acsu.buffalo.edu/~fineberg/mfc158/week10lecture.htm|archive-date=2016-03-03}}</ref>
जब एक स्ट्रिंग शाब्दिक रूप से स्रोत कोड में प्रदर्शित होती है, तो इसे एक स्ट्रिंग शाब्दिक या अस्पष्ट स्ट्रिंग के रूप में जाना जाता है।<ref>{{cite web|url=http://www.acsu.buffalo.edu/~fineberg/mfc158/week10lecture.htm|title=Introduction To Java - MFC 158 G|quote=String literals (or constants) are called ‘anonymous strings’|url-status=live|archive-url=https://web.archive.org/web/20160303233357/http://www.acsu.buffalo.edu/~fineberg/mfc158/week10lecture.htm|archive-date=2016-03-03}}</ref> [[औपचारिक भाषा|औपचारिक भाषाओ]] में जिनका उपयोग [[गणितीय तर्क]] और [[सैद्धांतिक कंप्यूटर विज्ञान]] में किया जाता है वह स्ट्रिंग [[प्रतीक (औपचारिक)|प्रतीकों]] का एक परिमित अनुक्रम होता है जिसे वर्णमाला नामक एक [[सेट (गणित)|समुच्चय]] से चयनित किया जाता है।


[[औपचारिक भाषा]]ओं में, जिनका उपयोग [[गणितीय तर्क]] और [[सैद्धांतिक कंप्यूटर विज्ञान]] में किया जाता है, एक स्ट्रिंग [[प्रतीक (औपचारिक)|प्रतीकों]] का एक परिमित अनुक्रम है जिसे वर्णमाला नामक एक [[सेट (गणित)|सेट]] से चुना जाता है।
[[File:String Variable Diagram Middle Aspect Ratio.png|alt=Diagram of String data in computing।वाक्य यह एक स्ट्रिंग है!एक अलग बॉक्स में प्रत्येक पत्र के साथ।शब्द स्ट्रिंग ऊपर है, पूरे वाक्य का जिक्र है।लेबल चरित्र नीचे है और व्यक्तिगत बक्से की ओर इशारा करता है। अंगूठे |658x658px| स्ट्रिंग्स अक्सर चरित्र (कंप्यूटिंग) से बने होते हैं।वे मानव-पठनीय डेटा को संग्रहीत करने के लिए उपयोगी हैं, जैसे वाक्यों, या वर्णमाला डेटा की सूची, जैसे कि [[डीएनए]] के न्यूक्लिक एसिड अनुक्रम।]]


[[File:String Variable Diagram Middle Aspect Ratio.png|alt=Diagram of String data in computing।वाक्य यह एक स्ट्रिंग है!एक अलग बॉक्स में प्रत्येक पत्र के साथ।शब्द स्ट्रिंग ऊपर है, पूरे वाक्य का जिक्र है।लेबल चरित्र नीचे है और व्यक्तिगत बक्से की ओर इशारा करता है। अंगूठे |475x475px| स्ट्रिंग्स अक्सर चरित्र (कंप्यूटिंग) से बने होते हैं।वे मानव-पठनीय डेटा को संग्रहीत करने के लिए उपयोगी हैं, जैसे वाक्यों, या वर्णमाला डेटा की सूची, जैसे कि [[डीएनए]] के न्यूक्लिक एसिड अनुक्रम।]]
== इतिहास ==


== इतिहास ==
"स्ट्रिंग" शब्द का प्रयोग "एक निश्चित अनुक्रम में प्रतीकों या भाषा के डेटा का एक अनुक्रम" [[प्रतीकात्मक तर्क|गणितय प्रतीकात्मक तर्क]] और [[भाषाई सिद्धांत|भाषा सिद्धांत]] से विकसित हुआ है जो प्रतीकात्मक प्रणालियों के औपचारिक सिद्धान्त का अनुसरण करता है और प्रतीकों के अर्थ को अलग करता है।<ref>{{cite encyclopedia |title=string |encyclopedia=A Supplement to the Oxford English Dictionary |year=1986 |last=Burchfield |first=R.W. |publisher=Oxford at the Clarendon Press |author-link=Robert Burchfield }}</ref>


शब्द "स्ट्रिंग" का अर्थ "एक निश्चित क्रम में प्रतीकों या भाषाई तत्वों का एक क्रम" गणित, [[प्रतीकात्मक तर्क]] और [[भाषाई सिद्धांत]] से उभरा है, जो प्रतीकात्मक प्रणालियों के औपचारिक व्यवहार के बारे में बात करता है, प्रतीकों के अर्थ को अलग करता है।<ref>{{cite encyclopedia |title=string |encyclopedia=A Supplement to the Oxford English Dictionary |year=1986 |last=Burchfield |first=R.W. |publisher=Oxford at the Clarendon Press |author-link=Robert Burchfield }}</ref> उदाहरण के लिए, तर्कशास्त्री सी. आई. लुईस ने 1918 में लिखा था:<ref>{{cite book |title=A survey of symbolic logic |location=Berkeley |publisher=University of California Press |year=1918 |page=355 |last=Lewis |first=C.I. |author-link=C.I. Lewis |url=https://archive.org/details/asurveyofsymboli00lewiuoft/page/355/mode/1up }}</ref> एक गणितीय प्रणाली पहचानने योग्य चिह्नों के तारों का कोई सेट है जिसमें कुछ तारों को प्रारंभ में लिया जाता है और शेष इन नियमों के अनुसार किए गए संचालन से प्राप्त होते हैं जो अंकों को निर्दिष्ट किसी भी अर्थ से स्वतंत्र होते हैं। ध्वनि या गंध के अतिरिक्त एक प्रणाली में 'निशान' होना चाहिए, यह सारहीन है।
उदाहरण के लिए, तर्कशास्त्री सी. आई. लुईस ने 1918 में लिखा था<ref>{{cite book |title=A survey of symbolic logic |location=Berkeley |publisher=University of California Press |year=1918 |page=355 |last=Lewis |first=C.I. |author-link=C.I. Lewis |url=https://archive.org/details/asurveyofsymboli00lewiuoft/page/355/mode/1up }}</ref> कि एक गणितीय प्रणाली पहचानने योग्य चिह्नों के स्ट्रिंग का कोई समूह है जिसमें कुछ स्ट्रिंग को प्रारंभ में लिया जाता है और शेष इन नियमों के अनुसार किए गए संचालन से प्राप्त होते हैं जो अंकों को निर्दिष्ट किसी भी अर्थ से स्वतंत्र होते हैं। ध्वनि के अतिरिक्त एक प्रणाली में 'संकेत चिह्न' होता है।


जीन ई. सैममेट के अनुसार, कंप्यूटर के लिए "पहली यथार्थवादी स्ट्रिंग हैंडलिंग और पैटर्न मिलान भाषा" 1950 के दशक में [[वादा करना|COMIT]] थी, जिसके बाद 1960 के दशक की शुरुआत में [[स्नोबोल]] भाषा थी।<ref>{{cite journal |url=https://redirect.cs.umbc.edu/courses/undergraduate/331/resources/papers/sammet1972.pdf |journal=Communications of the ACM |first=Jean E. |last=Sammet |title=Programming Languages: History and Future |date=July 1972 |volume=15 |number=7 }}</ref>
जीन ई. सैममेट के अनुसार, कंप्यूटर के लिए "पहली यथार्थवादी स्ट्रिंग प्रबंधन और प्रतिदर्श अनुरूप भाषा" 1950 के दशक में [[वादा करना|कॉमिट भाषा]] थी जिसके बाद 1960 के दशक के प्रारम्भ में [[स्नोबोल|स्नोबॉल]] भाषा थी।<ref>{{cite journal |url=https://redirect.cs.umbc.edu/courses/undergraduate/331/resources/papers/sammet1972.pdf |journal=Communications of the ACM |first=Jean E. |last=Sammet |title=Programming Languages: History and Future |date=July 1972 |volume=15 |number=7 }}</ref>
== स्ट्रिंग डेटाटाइप ==
== स्ट्रिंग डेटाटाइप ==
{{See also|प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग फ़ंक्शंस)}}
{{See also|प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग फ़ंक्शंस)}}


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


=== स्ट्रिंग लंबाई ===
=== स्ट्रिंग लंबाई ===
हालांकि औपचारिक स्ट्रिंग्स की मनमाना परिमित लंबाई हो सकती है, वास्तविक भाषाओं में स्ट्रिंग्स की लंबाई अक्सर एक कृत्रिम अधिकतम तक सीमित होती है। सामान्य तौर पर, दो प्रकार के स्ट्रिंग डेटाटाइप होते हैं: निश्चित-लंबाई वाले तार, जिनकी एक निश्चित अधिकतम लंबाई होती है, जिसे [[संकलन समय]] पर निर्धारित किया जाता है और जो समान मात्रा में मेमोरी का उपयोग करते हैं, चाहे इस अधिकतम की आवश्यकता हो या नहीं, और चर-लंबाई के तार, जिसकी लंबाई मनमाने ढंग से तय नहीं है और जो रन टाइम पर वास्तविक आवश्यकताओं के आधार पर अलग-अलग मात्रा में मेमोरी का उपयोग कर सकता है (मेमोरी प्रबंधन देखें)। आधुनिक [[प्रोग्रामिंग भाषा]]ओं में अधिकांश तार चर-लंबाई के तार हैं। बेशक, चर-लंबाई के तार भी लंबाई में सीमित हैं - उपलब्ध कंप्यूटर मेमोरी के आकार से। स्ट्रिंग की लंबाई को एक अलग पूर्णांक के रूप में संग्रहीत किया जा सकता है (जो लंबाई पर एक और कृत्रिम सीमा लगा सकता है) या अंत में एक समाप्ति वर्ण के माध्यम से, सामान्यतः सभी बिट्स शून्य के साथ एक वर्ण मान जैसे सी प्रोग्रामिंग भाषा में। नीचे "नल-टर्मिनेटेड" भी देखें।
हालांकि औपचारिक स्ट्रिंग्स की अपेक्षाकृत परिमित लंबाई हो सकती है वास्तविक भाषाओं में स्ट्रिंग्स की लंबाई प्रायः एक कृत्रिम रूप से अधिकतम सीमित होती है। सामान्यतः दो प्रकार के स्ट्रिंग डेटाटाइप होते हैं: निश्चित-लंबाई वाली स्ट्रिंग, जिनकी एक निश्चित अधिकतम लंबाई होती है, जिसे रन-टाइम पर निर्धारित किया जाता है और जो समान स्थिति में भंडारण का उपयोग करते हैं इसे अधिकतम भंडारण की आवश्यकता हो या न हो लेकिन निश्चित-लंबाई वाली स्ट्रिंग जिसकी लंबाई अपेक्षाकृत रूप से सीमित होती है और जो रन-टाइम पर वास्तविक आवश्यकताओं के आधार पर अलग-अलग स्थिति में मेमोरी का उपयोग कर सकता है आधुनिक [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओ]] में अधिकांश स्ट्रिंग चर-लंबाई स्ट्रिंग होती हैं। जिसके परिणाम स्वरूप चर-लंबाई की स्ट्रिंग भी लंबाई में सीमित होती हैं उपलब्ध कंप्यूटर मेमोरी के आकार से स्ट्रिंग की लंबाई को एक अलग पूर्णांक के रूप में संग्रहीत किया जा सकता है जो लंबाई पर एक और कृत्रिम सीमा को निर्धारित कर सकता है या अंत में एक अंतिम वर्ण के माध्यम से, सामान्यतः सभी बिट्स शून्य के साथ एक वर्ण मान जैसे सी प्रोग्रामिंग भाषा में स्ट्रिंग के रूप मे सम्मिलित होते है।


=== चरित्र एन्कोडिंग ===
=== वर्ण संकेतीकरण ===
स्ट्रिंग डेटाटाइप्स ने ऐतिहासिक रूप से एक बाइट प्रति वर्ण आवंटित किया है, और, हालांकि सटीक वर्ण सेट क्षेत्र के अनुसार भिन्न होता है, वर्ण एन्कोडिंग पर्याप्त समान थे कि प्रोग्रामर अक्सर इसे अनदेखा कर सकते थे, क्योंकि वर्णों को विशेष रूप से व्यवहार किया जाता है (जैसे कि अवधि और स्थान और अल्पविराम ) सभी एनकोडिंग में एक ही स्थान पर एक प्रोग्राम का सामना करना पड़ेगा। ये वर्ण सेट सामान्यतः सूचना परिवर्तन के लिए अमेरिकन स्टैंडर्ड कोड ([[ASCII|एएससीआईआई)]] या [[EBCDIC|इबीसीडीआईसी]] पर आधारित थे। यदि एक एन्कोडिंग में पाठ एक अलग एन्कोडिंग का उपयोग कर सिस्टम पर प्रदर्शित किया गया था, तो पाठ अक्सर खंडित होता था, हालांकि अक्सर कुछ पढ़ने योग्य होता था और कुछ कंप्यूटर उपयोगकर्ता क्षतिग्रस्त पाठ को पढ़ना सीखते थे।
स्ट्रिंग डेटाटाइप्स ने ऐतिहासिक रूप से एक बाइट प्रति वर्ण आवंटित किया है हालांकि वर्ण समूह क्षेत्र के अनुसार वर्ण संकेतीकरण पर्याप्त रूप से भिन्न होता है जिससे प्रोग्रामर प्रायः इसे अस्वीकृत कर सकते है क्योंकि वर्णों को विशेष रूप से क्रियान्वित किया जाता है जैसे कि समय और स्थान सभी संकेतीकरण को एक ही स्थान पर एक प्रोग्राम का सामना करना पड़ता है ये वर्ण समूह सामान्यतः सूचना परिवर्तन के लिए अमेरिकन मानक कोड ([[ASCII|एएससीआईआई)]] या [[EBCDIC|इबीसीडीआईसी]] पर आधारित थे। यदि एक संकेतीकरण में टेक्स्ट एक अलग संकेतीकरण का उपयोग कर सिस्टम पर प्रदर्शित किया गया था तो टेक्स्ट प्रायः खंडित होता था हालांकि प्रायः कुछ पढ़ने योग्य होता था और कुछ कंप्यूटर उपयोगकर्ता क्षतिग्रस्त टेक्स्ट को पढ़ना सीखते है।


[[चीनी भाषा]], [[जापानी भाषा]] (सामूहिक रूप से [[CJK वर्ण|सीजेके वर्ण]] के रूप में जाना जाता है) जैसी तार्किक भाषाओं को उचित प्रतिनिधित्व के लिए 256 से अधिक वर्णों (8-बिट बाइट प्रति-वर्ण एन्कोडिंग की सीमा) की आवश्यकता होती है। सामान्य समाधान में एएससीआईआई के लिए सिंगल-बाइट प्रस्तुतियों को सम्मिलित करना और सीजेके [[विचारधारा|विचारधाराओं]] के लिए दो-बाइट प्रस्तुतियों का उपयोग करना सम्मिलित है। सम्मिलिता कोड के साथ इनका उपयोग करने से स्ट्रिंग्स के मिलान और काटने में समस्याएँ पैदा हुईं, जिसकी गंभीरता इस बात पर निर्भर करती थी कि वर्ण एन्कोडिंग कैसे डिज़ाइन की गई थी। ईयूसी परिवार जैसे कुछ एनकोडिंग गारंटी देते हैं कि एएससीआईआई श्रेणी में एक बाइट मान केवल उस एएससीआईआई वर्ण का प्रतिनिधित्व करेगा, जो उन वर्णों को फ़ील्ड विभाजक के रूप में उपयोग करने वाले सिस्टम के लिए एन्कोडिंग सुरक्षित बनाता है। अन्य एनकोडिंग जैसे [[ISO-2022|आईएसओ-2022]] और Shift-JIS ऐसी गारंटी नहीं देते हैं, जिससे बाइट कोड का मिलान असुरक्षित हो जाता है। ये एन्कोडिंग "स्व-सिंक्रनाइज़िंग" भी नहीं थे, ताकि एक स्ट्रिंग की शुरुआत तक बैक अप लेने के लिए वर्ण सीमाओं का पता लगाने की आवश्यकता हो, और दो स्ट्रिंग्स को एक साथ चिपकाने से दूसरे स्ट्रिंग का भ्रष्टाचार हो सकता है।
[[चीनी भाषा]], [[जापानी भाषा]] (सामूहिक रूप से [[CJK वर्ण|सीजेके वर्ण]] के रूप में जाना जाता है) जैसी स्ट्रिंग्किक भाषाओं को उपयुक्त प्रतिनिधित्व के लिए 256 से अधिक वर्णों (8-बिट बाइट प्रति-वर्ण संकेतीकरण की सीमा) की आवश्यकता होती है। सामान्य समाधान में एएससीआईआई के लिए एकल-बाइट प्रस्तुतियों को सम्मिलित करना और सीजेके [[विचारधारा|विचारधाराओं]] के लिए दो-बाइट प्रस्तुतियों का उपयोग करना सम्मिलित होता है। सम्मिलित कोड के साथ इनका उपयोग करने से स्ट्रिंग्स के अनुरूप और विभिन्न समस्याएँ उत्पन्न होती है जिसकी गंभीरता इस विषय पर निर्भर करती है कि वर्ण संकेतीकरण को कैसे डिज़ाइन किया गाया है। ईयूसी समूह जैसे कुछ संकेतीकरण दायित्व करते हैं कि एएससीआईआई श्रेणी में एक बाइट मान केवल उस एएससीआईआई वर्ण का प्रतिनिधित्व करता है जो उन वर्णों को क्षेत्र विभाजक के रूप में उपयोग करने वाले सिस्टम के लिए संकेतीकरण को सुरक्षित बनाता है। अन्य संकेतीकरण जैसे [[ISO-2022|आईएसओ-2022]] और शिफ्ट-जेआईएस का दायित्व नहीं करते हैं जिससे बाइट कोड असुरक्षित हो जाता है। ये संकेतीकरण "तुल्यकालन संकेत" भी होते है जिससे एक स्ट्रिंग को प्रारम्भिक बैकअप प्राप्त करने के लिए वर्ण सीमाओं का पता लगाने की आवश्यकता होती है और दो स्ट्रिंग्स को एक साथ संबद्ध दूसरी स्ट्रिंग का दुरूपयोग हो सकता है। [[यूनीकोड]] ने छवि को कुछ प्रकार तक सरल बना दिया है। जिससे अधिकांश प्रोग्रामिंग भाषाओं में अब यूनिकोड स्ट्रिंग्स के लिए एक डेटाटाइप होता है। यूनिकोड का अपेक्षाकृत बाइट स्ट्रीम प्रारूप [[UTF-8|यूटीएफ-8]] पुराने मल्टीबाइट संकेतीकरण के लिए ऊपर वर्णित समस्याओं से बचने के लिए डिज़ाइन किया गया है। यूटीएफ-8, यूटीएफ-16 और [[UTF-32|यूटीएफ-32]] के लिए प्रोग्रामर को यह जानने की आवश्यकता होती है कि निश्चित आकार की कोड इकाइयाँ "वर्णों" से भिन्न होती हैं वर्तमान में मुख्य समस्या गलत तरीके से डिज़ाइन किए गए एपीआई के कारण हैं जो यूटीएफ-32 का उपयोग करते हैं यूटीएफ-32 निश्चित आकार के कोड बिंदु बनाता है लेकिन ये कोड लिखने के कारण "अक्षर" नहीं होते हैं
 
[[यूनीकोड]] ने तस्वीर को कुछ हद तक सरल बना दिया है। अधिकांश प्रोग्रामिंग भाषाओं में अब यूनिकोड स्ट्रिंग्स के लिए एक डेटाटाइप है। यूनिकोड का पसंदीदा बाइट स्ट्रीम प्रारूप [[UTF-8|यूटीएफ-8]] पुराने मल्टीबाइट एनकोडिंग के लिए ऊपर वर्णित समस्याओं से बचने के लिए डिज़ाइन किया गया है। यूटीएफ-8, यूटीएफ-16 और [[UTF-32|यूटीएफ-32]] के लिए प्रोग्रामर को यह जानने की आवश्यकता होती है कि निश्चित आकार की कोड इकाइयाँ "वर्णों" से भिन्न हैं, वर्तमान में मुख्य कठिनाई गलत तरीके से डिज़ाइन किए गए API हैं जो इस अंतर को छिपाने का प्रयास करते हैं (यूटीएफ-32 करता है) कोड बिंदुओं को निश्चित आकार दें, लेकिन ये कोड लिखने के कारण "अक्षर" नहीं हैं।


=== कार्यान्वयन ===
=== कार्यान्वयन ===
{{anchor|String Buffers}}
कुछ प्रोग्रामिंग भाषाएं, जैसे कि सी ++, [[पर्ल]] और [[रूबी (प्रोग्रामिंग भाषा)|रूबी]] सामान्यतः एक स्ट्रिंग डेटा को परिवर्तित करने के बाद भी इसे परिवर्तन की स्वीकृति देते हैं प्रायः इन्हें उत्परिवर्तित स्ट्रिंग कहा जाता है। अन्य भाषाओं में, जैसे कि [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[जावास्क्रिप्ट]], [[लुआ (प्रोग्रामिंग भाषा)]], [[पायथन (प्रोग्रामिंग भाषा)]] और [[गो (प्रोग्रामिंग भाषा)]] के लिए स्ट्रिंग डेटा को निर्धारित किया गया है और यदि कोई परिवर्तन होता है तो इन्हें अपरिवर्तनीय स्ट्रिंग कहा जाता है। अपरिवर्तनीय स्ट्रिंग वाली इन भाषाओं में से कुछ अन्य प्रकार के स्ट्रिंग डेटा होते हैं जो कि उत्परिवर्तनीय होते है जैसे कि जावा और डाट नेट फ्रेमवर्क, स्ट्रिंग जावा {{Javadoc:SE|java/lang|स्ट्रिंग-बफर}} और [[कोको (एपीआई)]] <code>NSMutableString</code> दोनों स्ट्रिंग डेटा के लिए अपरिवर्तनीय होते हैं हालांकि अपरिवर्तनीय स्ट्रिंग डेटा को अक्षम रूप से कई प्रतियों का निर्माण करने की आवश्यकता हो सकती है वे सरल और पूर्ण रूप से थ्रेड सुरक्षा का प्रयोग करते हैं। स्ट्रिंग्स को सामान्यतः बाइट्स, वर्ण या कोड यूनिट्स की सरणियों के रूप में प्रयुक्त किया जाता है, ताकि अलग-अलग यूनिट्स या सबस्ट्रिंग्स तक शीघ्रता से अभिगम्य की स्वीकृति दी जा सके और जिसमें एक निश्चित लंबाई होने पर वर्ण भी सम्मिलित होते हैं। इसके अतिरिक्त [[हास्केल (प्रोग्रामिंग भाषा)]] जैसी कुछ भाषाएं उन्हें निश्चित सूचियों के रूप में प्रयुक्त करती हैं।  
 
कुछ भाषाएं, जैसे कि C ++, [[पर्ल]] और [[रूबी (प्रोग्रामिंग भाषा)]], सामान्यतः एक स्ट्रिंग की सामग्री को बदलने के बाद इसे बदलने की अनुमति देते हैं;इन्हें उत्परिवर्तित तार कहा जाता है।अन्य भाषाओं में, जैसे कि [[जावा (प्रोग्रामिंग भाषा)]], [[जावास्क्रिप्ट]], [[लुआ (प्रोग्रामिंग भाषा)]], [[पायथन (प्रोग्रामिंग भाषा)]], और [[गो (प्रोग्रामिंग भाषा)]], मूल्य तय किया गया है और यदि कोई परिवर्तन होना हैनिर्मित;इन्हें अपरिवर्तनीय तार कहा जाता है।अपरिवर्तनीय तार वाली इन भाषाओं में से कुछ भी एक और प्रकार प्रदान करते हैं जो कि उत्परिवर्तनीय है, जैसे कि जावा और .NET फ्रेमवर्क | {{Javadoc:SE|java/lang|StringBuilder}}, धागा-सुरक्षित जावा {{Javadoc:SE|java/lang|StringBuffer}}, और [[कोको (एपीआई)]] <code>NSMutableString</code>।दोनों फायदे और नुकसान दोनों के लिए अपरिवर्तनीयता हैं: हालांकि अपरिवर्तनीय तार को अक्षम रूप से कई प्रतियों का निर्माण करने की आवश्यकता हो सकती है, वे सरल और पूरी तरह से थ्रेड सुरक्षा हैं। थ्रेड-सुरक्षित।
 
स्ट्रिंग्स को सामान्यतः बाइट्स, कैरेक्टर्स या कोड यूनिट्स की सरणियों के रूप में लागू किया जाता है, ताकि अलग-अलग यूनिट्स या सबस्ट्रिंग्स तक तेजी से पहुंच की अनुमति दी जा सके - जिसमें एक निश्चित लंबाई होने पर कैरेक्टर भी सम्मिलित हैं। इसके अतिरिक्त [[हास्केल (प्रोग्रामिंग भाषा)]] जैसी कुछ भाषाएं उन्हें लिंक्ड सूचियों के रूप में लागू करती हैं।
 
कुछ भाषाएँ, जैसे कि [[प्रचुरता|प्रोलॉग]] और [[एर्लंग (प्रोग्रामिंग भाषा)]] एक समर्पित स्ट्रिंग डेटाटाइप को लागू करने से बचती हैं, इसके अतिरिक्त चरित्र कोड की सूची के रूप में स्ट्रिंग्स का प्रतिनिधित्व करने के सम्मेलन को अपनाती हैं।


=== अभ्यावेदन ===
कुछ भाषाएँ, जैसे कि [[प्रचुरता|प्रोलॉग]] और [[एर्लंग (प्रोग्रामिंग भाषा)]] एक समर्पित स्ट्रिंग डेटाटाइप को प्रयुक्त करने से सुरक्षित होती हैं इसके अतिरिक्त वर्ण कोड की सूची के रूप में स्ट्रिंग्स का प्रतिनिधित्व करने के लिए स्ट्रिंग डेटा को स्वीकृत करती हैं।
स्ट्रिंग्स का निरूपण चरित्र प्रदर्शनों की सूची और वर्ण एन्कोडिंग की विधि पर बहुत अधिक निर्भर करता है। पुराने स्ट्रिंग कार्यान्वयन को एएससीआईआई द्वारा परिभाषित प्रदर्शनों की सूची और एन्कोडिंग, या [[आईएसओ 8859]] श्रृंखला जैसे अधिक हालिया एक्सटेंशन के साथ काम करने के लिए डिज़ाइन किया गया था। आधुनिक कार्यान्वयन अक्सर यूटीएफ -8 और यूटीएफ -16 जैसे विभिन्न जटिल एन्कोडिंग के साथ यूनिकोड द्वारा परिभाषित व्यापक प्रदर्शन का उपयोग करते हैं।


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


अधिकांश स्ट्रिंग कार्यान्वयन चर-लंबाई सरणियों के समान हैं, जिसमें संबंधित वर्णों के [[वर्ण कोड]] को संग्रहीत करने वाली प्रविष्टियाँ हैं। मुख्य अंतर यह है कि, कुछ एनकोडिंग के साथ, एक तार्किक वर्ण सरणी में एक से अधिक प्रविष्टियां ले सकता है। यह उदाहरण के लिए यूटीएफ-8 के साथ होता है, जहां एकल कोड (UCS कोड बिंदु) एक से चार बाइट तक कहीं भी ले जा सकते हैं, और एकल वर्ण कोड की मनमानी संख्या ले सकते हैं। इन मामलों में, स्ट्रिंग की तार्किक लंबाई (वर्णों की संख्या) सरणी की भौतिक लंबाई (उपयोग में बाइट्स की संख्या) से भिन्न होती है। यूटीएफ-32 समस्या के पहले भाग से बचता है।
शब्द बाइट स्ट्रिंग सामान्यतः केवल (टेक्स्ट) वर्णों, बिट्स के स्ट्रिंग या इस प्रकार के स्ट्रिंगों के अतिरिक्त बाइट्स की एक सामान्य-उद्देश्य स्ट्रिंग को इंगित करता है। जिस बाइट स्ट्रिंग्स का अर्थ प्रायः यह होता है कि बाइट का कोई भी मान ले सकते हैं और किसी भी डेटा को यथा-रूप में संग्रहीत किया जा सकता है जिसका अर्थ है कि अंतिम मान के रूप में कोई मान नहीं समझा जाना चाहिए। अधिकांश स्ट्रिंग कार्यान्वयन चर-लंबाई सरणियों के समान होती हैं जिसमें संबंधित वर्णों के [[वर्ण कोड]] को संग्रहीत करने वाली विभिन्न प्रविष्टियाँ होती हैं। मुख्य अंतर यह है कि कुछ संकेतीकरण के साथ एक स्ट्रिंग्किक वर्ण सरणी में एक से अधिक प्रविष्टियां हो सकती है। उदाहरण के लिए यह यूटीएफ-8 के साथ होता है जहां एकल कोड (यूसीएस कोड बिंदु) एक से चार बाइट तक स्ट्रिंग डेटा को कहीं भी ले जा सकते हैं और एकल वर्ण कोड की अपेक्षाकृत संख्या परिवर्तित कर सकते हैं। इन स्थितियों में, स्ट्रिंग की स्ट्रिंग्किक लंबाई (वर्णों की संख्या) सरणी की भौतिक लंबाई (उपयोग में बाइट्स की संख्या) से भिन्न होती है। जो यूटीएफ-32 समस्या के पहले भाग से सुरक्षित करता है।


==== NULL- टर्मिनेटेड ====
==== रिक्त टर्मिनेट ====
{{Main|अशक्त-समाप्त स्ट्रिंग}}
{{Main|रिक्त टर्मिनेट स्ट्रिंग}}


एक विशेष समाप्ति वर्ण का उपयोग करके एक स्ट्रिंग की लंबाई को निहित रूप से संग्रहीत किया जा सकता है; अक्सर यह शून्य वर्ण (एनयूएल) होता है, जिसमें सभी बिट्स शून्य होते हैं, लोकप्रिय [[सी (प्रोग्रामिंग भाषा)]] द्वारा उपयोग की जाने वाली एक प्रथा और इसे कायम रखा जाता है।<ref>
एक विशेष टर्मिनेट वर्ण का उपयोग करके एक स्ट्रिंग की लंबाई को निहित रूप से संग्रहीत किया जा सकता है प्रायः यह रिक्त वर्ण (एनयूएल) होता है जिसमें सभी बिट्स शून्य होते हैं [[सी (प्रोग्रामिंग भाषा)]] द्वारा उपयोग की जाने वाली एक स्ट्रिंग होती है।<ref>
{{Citation
{{Citation
  |last1        = Bryant
  |last1        = Bryant
Line 69: Line 61:
  |archive-date = 2007-08-06
  |archive-date = 2007-08-06
}}
}}
</ref> इसलिए, इस प्रतिनिधित्व को सामान्यतः सी स्ट्रिंग के रूप में जाना जाता है। ''n ''-वर्ण स्ट्रिंग का यह प्रतिनिधित्व ''n'' + 1 स्पेस (टर्मिनेटर के लिए 1) लेता है, और इस प्रकार एक अंतर्निहित डेटा संरचना है।
</ref> इसलिए, इस प्रतिनिधित्व को सामान्यतः सी स्ट्रिंग के रूप में जाना जाता है ''n ''-वर्ण स्ट्रिंग का यह प्रतिनिधित्व ''n'' + 1 स्पेस टर्मिनेटर के लिए 1 को स्वीकृत करता है और इस प्रकार एक अंतर्निहित डेटा संरचना होती है। टर्मिनेटेड स्ट्रिंग्स में, टर्मिनेटिंग कोड किसी भी स्ट्रिंग में स्वीकार्य वर्ण नहीं है। लंबाई क्षेत्र वाले स्ट्रिंग्स में यह सीमा नहीं होती है और यह अपेक्षाकृत बाइनरी डेटा भी संग्रहीत कर सकती है।


टर्मिनेटेड स्ट्रिंग्स में, टर्मिनेटिंग कोड किसी भी स्ट्रिंग में स्वीकार्य वर्ण नहीं है। लंबाई क्षेत्र वाले स्ट्रिंग्स में यह सीमा नहीं होती है और यह मनमाना बाइनरी डेटा भी संग्रहीत कर सकता है।
10-बाइट बफर (कंप्यूटर विज्ञान) में संग्रहीत एक रिक्त-टर्मिनेटेड स्ट्रिंग का एक उदाहरण, इसके एएससीआईआई या अधिक आधुनिक यूटीएफ-8 के प्रतिनिधित्व के साथ 8-बिट [[हेक्साडेसिमल संख्या]] होती है'':''
 
10-बाइट बफर (कंप्यूटर विज्ञान) में संग्रहीत एक ''नल-टर्मिनेटेड स्ट्रिंग 'का एक उदाहरण, इसके एएससीआईआई (या अधिक आधुनिक यूटीएफ-8) प्रतिनिधित्व के साथ 8-बिट [[हेक्साडेसिमल संख्या]] है:''


{| class="wikitable" style="margin-left: auto; margin-right:auto"
{| class="wikitable" style="margin-left: auto; margin-right:auto"
Line 91: Line 81:
  | style="background: #DDD" | 77<sub>16</sub>
  | style="background: #DDD" | 77<sub>16</sub>
  |}
  |}
उपरोक्त उदाहरण में स्ट्रिंग की लंबाई,<code>FRANK</code>, 5 वर्ण हैं, लेकिन यह 6 बाइट्स पर कब्जा कर लेता है। टर्मिनेटर के बाद वर्ण प्रतिनिधित्व का हिस्सा नहीं बनाते हैं;वे या तो अन्य डेटा का हिस्सा हो सकते हैं या सिर्फ कचरा।(इस रूप के स्ट्रिंग्स को कभी -कभी एस्किज़ स्ट्रिंग्स कहा जाता है, मूल विधानसभा भाषा निर्देश के बाद उन्हें घोषित करने के लिए उपयोग किया जाता है।)
उपरोक्त उदाहरण में स्ट्रिंग की लंबाई <code>FRANK</code> 5 वर्ण हैं, लेकिन यह 6 बाइट्स तक विस्तृत होता है। टर्मिनेटर के बाद के वर्ण प्रतिनिधित्व के भाग नहीं बनते हैं वे या तो अन्य डेटा का भाग हो सकते हैं या केवल अशपष्ट हो सकते हैं। इस प्रकार के स्ट्रिंग्स को कभी-कभी एएससीआईजेड स्ट्रिंग्स कहा जाता है, मूल असेंबली भाषा दिशासूचक के बाद उन्हें घोषित करने के लिए उपयोग किया जाता है।


==== बाइट- और बिट-टर्मिनेटेड ====
==== बाइट और बिट-टर्मिनेट ====
स्ट्रिंग्स को समाप्त करने के लिए नल के अलावा एक विशेष बाइट का उपयोग करना ऐतिहासिक रूप से हार्डवेयर और सॉफ्टवेयर दोनों में दिखाई दिया है, हालांकि कभी -कभी एक मूल्य के साथ जो एक मुद्रण चरित्र भी था। <code>$</code> कई असेंबलर सिस्टम द्वारा उपयोग किया गया था, <code>:</code> नियंत्रण डेटा कॉरपोरेशन सिस्टम द्वारा उपयोग किया जाता है (इस वर्ण का मूल्य शून्य था), और [[ZX80]] का उपयोग किया <code>"</code><ref name=asm>{{cite web|last1=Wearmouth |first1=Geoff |title=An Assembly Listing of the ROM of the Sinclair ZX80 |url=http://www.wearmouth.demon.co.uk/zx80.htm |url-status=unfit |archive-url=https://web.archive.org/web/20150815035611/http://www.wearmouth.demon.co.uk/zx80.htm |archive-date=August 15, 2015 }}</ref> चूंकि यह अपनी मूल भाषा में स्ट्रिंग सीमांकक था।
स्ट्रिंग्स को समाप्त करने के लिए रिक्त के अतिरिक्त एक विशेष बाइट का उपयोग करना ऐतिहासिक रूप से हार्डवेयर और सॉफ्टवेयर दोनों में प्रयुक्त किया जाता है, हालांकि कभी-कभी एक मान के साथ जो एक स्थित वर्ण था। <code>$</code> का उपयोग कई असेंबलर सिस्टम द्वारा किया गया था और <code>:</code>का सीडीसी सिस्टम द्वारा उपयोग किया गया था इस वर्ण का मान शून्य था और [[ZX80|जेडएक्स80]] ने<code>"</code> का उपयोग किया<ref name="asm">{{cite web|last1=Wearmouth |first1=Geoff |title=An Assembly Listing of the ROM of the Sinclair ZX80 |url=http://www.wearmouth.demon.co.uk/zx80.htm |url-status=unfit |archive-url=https://web.archive.org/web/20150815035611/http://www.wearmouth.demon.co.uk/zx80.htm |archive-date=August 15, 2015 }}</ref> क्योंकि यह अपनी बेसिक भाषा में स्ट्रिंग सीमांकक था।


कुछ समान, [[आईबीएम 1401]] जैसी "डेटा प्रोसेसिंग" मशीनें बाईं ओर स्ट्रिंग्स को परिसीमित करने के लिए एक विशेष शब्द चिह्न बिट का उपयोग करती हैं, जहां ऑपरेशन दाईं ओर से प्रारम्भ होगा। इस बिट को स्ट्रिंग के अन्य सभी भागों में स्पष्ट होना चाहिए। इसका मतलब यह था कि, जबकि आईबीएम 1401 में सात-बिट शब्द था, लगभग किसी ने कभी भी इसे एक विशेषता के रूप में उपयोग करने के बारे में नहीं सोचा था, और एएससीआईआई कोड को संभालने के लिए (उदाहरण के लिए) सातवें बिट के असाइनमेंट को ओवरराइड कर दिया था।
कुछ समान, [[आईबीएम 1401]] जैसी "डेटा प्रसंस्करण" मशीनें बाईं ओर स्ट्रिंग्स को परिसीमित करने के लिए एक विशेष शब्द चिह्न बिट का उपयोग करती हैं, जहां संचालन दाईं ओर से प्रारम्भ होता है इस बिट को स्ट्रिंग के अन्य सभी भागों में स्पष्ट होना चाहिए। इसका अर्थ यह था कि, जबकि आईबीएम 1401 में सात-बिट शब्द था लगभग किसी ने कभी भी इसे एक विशेषता के रूप में उपयोग करने के विषय में नहीं सोचा था और एएससीआईआई कोड को सुरक्षित करने के लिए सातवें बिट के असाइनमेंट को ओवरराइड कर दिया था।


प्रारंभिक माइक्रो कंप्यूटर सॉफ़्टवेयर ने इस तथ्य पर भरोसा किया कि एएससीआईआई कोड उच्च-क्रम बिट का उपयोग नहीं करते हैं, और इसे एक स्ट्रिंग के अंत को इंगित करने के लिए सेट करते हैं।इसे आउटपुट से पहले 0 पर रीसेट किया जाना चाहिए।<ref>{{cite web |last1=Allison |first1=Dennis |title=Design Notes for Tiny BASIC |url=http://www.ittybittycomputers.com/IttyBitty/TinyBasic/DDJ1/Design.html |url-status=live |archive-url=https://web.archive.org/web/20170410220759/http://www.ittybittycomputers.com/IttyBitty/TinyBasic/DDJ1/Design.html |archive-date=2017-04-10 }}</ref>
प्रारंभिक माइक्रो कंप्यूटर सॉफ़्टवेयर ने इस तथ्य पर विश्वास किया कि एएससीआईआई कोड उच्च-क्रम बिट का उपयोग नहीं करते हैं और इसे एक स्ट्रिंग के अंत को इंगित करने के लिए प्रयुक्त करते हैं। इसे आउटपुट से पहले 0 पर रीसेट किया जाना आवश्यक होता है।<ref>{{cite web |last1=Allison |first1=Dennis |title=Design Notes for Tiny BASIC |url=http://www.ittybittycomputers.com/IttyBitty/TinyBasic/DDJ1/Design.html |url-status=live |archive-url=https://web.archive.org/web/20170410220759/http://www.ittybittycomputers.com/IttyBitty/TinyBasic/DDJ1/Design.html |archive-date=2017-04-10 }}</ref>
==== लंबाई-पूर्व-निर्धारित ====
==== लंबाई-पूर्व-निर्धारित ====
एक स्ट्रिंग की लंबाई भी स्पष्ट रूप से संग्रहीत की जा सकती है, उदाहरण के लिए स्ट्रिंग को बाइट मान के रूप में लंबाई के साथ उपसर्ग करके। इस परिपाटी का प्रयोग कई [[पास्कल (प्रोग्रामिंग भाषा)]] में किया जाता है; परिणामस्वरूप, कुछ लोग ऐसी स्ट्रिंग को पास्कल स्ट्रिंग या पी-स्ट्रिंग कहते हैं। स्ट्रिंग लंबाई को बाइट के रूप में संग्रहीत करने से अधिकतम स्ट्रिंग लंबाई 255 तक सीमित हो जाती है। ऐसी सीमाओं से बचने के लिए, पी-स्ट्रिंग्स के बेहतर कार्यान्वयन स्ट्रिंग लंबाई को स्टोर करने के लिए 16-, 32-, या 64-बिट शब्दों का उपयोग करते हैं। जब लंबाई क्षेत्र पता स्थान को कवर करता है, तो तार केवल उपलब्ध मेमोरी द्वारा सीमित होते हैं।
एक स्ट्रिंग की लंबाई भी स्पष्ट रूप से संग्रहीत की जा सकती है, उदाहरण के लिए स्ट्रिंग को बाइट मान के रूप में लंबाई के साथ निर्धारित करके इस अधिवेशन का प्रयोग कई [[पास्कल (प्रोग्रामिंग भाषा)]] में किया जाता है जिसके परिणामस्वरूप, कुछ लोग ऐसी स्ट्रिंग को पास्कल स्ट्रिंग या पी-स्ट्रिंग कहते हैं। स्ट्रिंग लंबाई को बाइट के रूप में संग्रहीत करने से अधिकतम स्ट्रिंग लंबाई 255 तक सीमित हो जाती है। ऐसी सीमाओं से बचने के लिए, पी-स्ट्रिंग्स के अपेक्षाकृत कार्यान्वयन स्ट्रिंग लंबाई के भंडारण करने के लिए 16-बिट, 32-बिट या 64-बिट शब्दों का उपयोग करते हैं। जब लंबाई क्षेत्र एड्रेस को नियंत्रित करता है, तब स्ट्रिंग केवल उपलब्ध भंडारण द्वारा सीमित होते हैं।


यदि लंबाई बंधी हुई है, तो इसे निरंतर स्थान में एन्कोड किया जा सकता है, सामान्यतः एक मशीन शब्द, इस प्रकार n + k स्थान लेते हुए एक अंतर्निहित डेटा संरचना की ओर जाता है, जहाँ k एक शब्द में वर्णों की संख्या है (8-बिट के लिए 8) 64-बिट मशीन पर एएससीआईआई, 32-बिट मशीन पर 32-बिट यूटीएफ-32/UCS-4 के लिए 1, आदि)। यदि लंबाई बाध्य नहीं है, तो लंबाई एन एन्कोडिंग लॉग (एन) स्थान लेती है (निश्चित-लंबाई कोड देखें), इसलिए लंबाई-उपसर्ग स्ट्रिंग एक संक्षिप्त डेटा संरचना है जो लॉग (एन) + एन स्पेस में लंबाई एन की स्ट्रिंग को एन्कोड करती है।
यदि लंबाई सीमित होती है, तो इसे निरंतर स्थान में एन्कोड किया जा सकता है सामान्यतः एक मशीन शब्द को इस प्रकार n + k स्थान के रूप मे प्राप्त करती है और एक अंतर्निहित डेटा संरचना की ओर प्रेरित करती है, जहाँ k एक शब्द में वर्णों की संख्या है 8-बिट के लिए 8 और 64-बिट मशीन पर एएससीआईआई, 32-बिट मशीन पर 32-बिट यूटीएफ-32/यूसीएस-4 के लिए 1 होती है यदि लंबाई सीमित नहीं होती है, तो लंबाई n संकेतीकरण log(''n'') + ''n'') स्थान ग्रहण करती है (निश्चित-लंबाई कोड देखें), इसलिए लंबाई-निर्धारण स्ट्रिंग एक संक्षिप्त डेटा संरचना है जो log(''n'') + ''n'') क्षेत्र में लंबाई ''n'' की स्ट्रिंग को एन्कोड करती है। बाद की स्थिति में, लंबाई-निर्धारण क्षेत्र में निश्चित लंबाई नहीं होती है, इसलिए स्ट्रिंग बढ़ने पर वास्तविक स्ट्रिंग डेटा को स्थानांतरित करने की आवश्यकता होती है, जिससे लंबाई क्षेत्र को विस्तृत की आवश्यकता होती है।<!---commented out: "bad" is not an issue in a technical encyclopedic article---This in itself is not that bad since the number of bytes is just logarithmic on the length of string,---><!---commented out: while NULL-terminated string allow for pointers to proper substrings, length-prefixed strings do not; a pointer to a length-prefixed string has to point to the length field, which remains at the same location after growing--- but the downside is that any direct pointers to the string data get invalidated (they should move by one).--->


बाद के मामले में, लंबाई-उपसर्ग क्षेत्र में निश्चित लंबाई नहीं होती है, इसलिए स्ट्रिंग बढ़ने पर वास्तविक स्ट्रिंग डेटा को स्थानांतरित करने की आवश्यकता होती है, जिससे लंबाई क्षेत्र को बढ़ाने की आवश्यकता होती है।<!---commented out: "bad" is not an issue in a technical encyclopedic article---This in itself is not that bad since the number of bytes is just logarithmic on the length of string,---><!---commented out: while NULL-terminated string allow for pointers to proper substrings, length-prefixed strings do not; a pointer to a length-prefixed string has to point to the length field, which remains at the same location after growing--- but the downside is that any direct pointers to the string data get invalidated (they should move by one).--->
यहां पास्कल स्ट्रिंग को 10-बाइट बफर में एएससीआईआई/यूटीएफ-8 प्रतिनिधित्व के साथ संग्रहीत किया गया है:
 
यहाँ एक पास्कल स्ट्रिंग है जो 10-बाइट बफर में संग्रहीत है, साथ ही इसके एएससीआईआई / यूटीएफ-8 प्रतिनिधित्व के साथ:


{| class="wikitable" style="margin-left: auto; margin-right:auto"
{| class="wikitable" style="margin-left: auto; margin-right:auto"
Line 124: Line 112:
  | style="background: #DDD" | 77<sub>16</sub>
  | style="background: #DDD" | 77<sub>16</sub>
  |}
  |}
==== तार रिकॉर्ड के रूप में ====
==== स्ट्रिंग रिकॉर्ड ====
ऑब्जेक्ट-ओरिएंटेड सहित कई भाषाएं, आंतरिक संरचना वाले रिकॉर्ड के रूप में स्ट्रिंग्स को लागू करती हैं जैसे:
वस्तु उन्मुख प्रोग्रामिंग सहित कई भाषाएं, आंतरिक संरचना वाले रिकॉर्ड के रूप में स्ट्रिंग्स को प्रयुक्त करती हैं जैसे:
  class string {
  class string {
   size_t length;
   size_t length;
   char *text;
   char *text;
  };
  };
हालाँकि, चूंकि कार्यान्वयन सामान्यतः छिपा हुआ है, स्ट्रिंग को सदस्य कार्यों के माध्यम से एक्सेस और संशोधित किया जाना चाहिए। टेक्स्ट गतिशील रूप से आवंटित स्मृति क्षेत्र के लिए एक सूचक है, जिसे आवश्यकतानुसार विस्तारित किया जा सकता है। स्ट्रिंग (सी ++) भी देखें।
हालाँकि, कार्यान्वयन सामान्यतः छिपा हुआ है, स्ट्रिंग के सदस्य कार्यों के माध्यम से एक्सेस और संशोधित किया जाता है टेक्स्ट गतिशील रूप से आवंटित भंडारण क्षेत्र के लिए एक सूचक है जिसे आवश्यकतानुसार विस्स्ट्रिंगित किया जा सकता है। जिसके लिए स्ट्रिंग (सी ++) देखें।
 
==== अन्य अभ्यावेदन ====
दोनों वर्ण समाप्ति और लंबाई कोड स्ट्रिंग्स को सीमित करते हैं: उदाहरण के लिए, सी वर्ण सरणियाँ जिनमें अशक्त (एनयूएल) वर्ण होते हैं, [[सी स्ट्रिंग]] लाइब्रेरी फ़ंक्शंस द्वारा सीधे संभाला नहीं जा सकता है: लंबाई कोड का उपयोग करने वाले तार लंबाई कोड के अधिकतम मूल्य तक सीमित हैं।
 
इन दोनों सीमाओं को चतुर प्रोग्रामिंग द्वारा दूर किया जा सकता है।


डेटा संरचनाओं और कार्यों को बनाना संभव है जो उन्हें हेरफेर करते हैं जिनमें वर्ण समाप्ति से जुड़ी समस्याएं नहीं हैं और सिद्धांत रूप में लंबाई कोड सीमा को पार कर सकते हैं। [[रन-लंबाई एन्कोडिंग]] (चरित्र मान और लंबाई द्वारा दोहराए गए वर्णों को बदलना) और [[हैमिंग कोडिंग]]{{clarify | date = June 2015 | reason = did you mean Huffman compression? Or do we need a few more words about error correction coding here? I don't see how either one helps us find out how long the string is. }} से तकनीकों का उपयोग करके प्रस्तुत स्ट्रिंग को अनुकूलित करना भी संभव है।
==== अन्य अभिवेदन ====
वर्ण समाप्ति और लंबाई कोड दोनों ही स्ट्रिंग्स को सीमित करते हैं उदाहरण के लिए, सी वर्ण सूची जिनमें रिक्त (एनयूएल) वर्ण होते हैं, [[सी स्ट्रिंग]] लाइब्रेरी कारक द्वारा प्रत्यक्ष रूप से प्रयुक्त नहीं जा सकता है लंबाई कोड का उपयोग करने वाले स्ट्रिंग लंबाई कोड के अधिकतम मान तक सीमित होते हैं। क्लेवर प्रोग्रामिंग द्वारा इन दोनों सीमाओं को दूर किया जा सकता है।


जबकि ये अभ्यावेदन सामान्य हैं, अन्य संभव हैं। रस्सियों का उपयोग कुछ स्ट्रिंग ऑपरेशन, जैसे सम्मिलन, विलोपन और संघटन को अधिक कुशल बनाता है।
डेटा संरचनाओं और कार्यों को बनाना संभव है जो उन्हें संरक्षित करते हैं जिनमें वर्ण समाप्ति से जुड़ी समस्याएं नहीं होती हैं और सिद्धांतिक रूप में लंबाई कोड सीमा को निर्धारित कर सकते हैं। [[रन-लंबाई एन्कोडिंग|संकलन-लंबाई संकेतीकरण]] (वर्ण मान और लंबाई द्वारा दोहराए गए वर्णों का परिवर्तन) और [[हैमिंग कोडिंग]]{{clarify | date = June 2015 | reason = did you mean Huffman compression? Or do we need a few more words about error correction coding here? I don't see how either one helps us find out how long the string is. }} से तकनीकों का उपयोग करके प्रस्तुत स्ट्रिंग को अनुकूलित करना भी संभव होता है। जबकि ये अभिवेदन सामान्य हैं या अन्य संभव हैं। रोप्स का उपयोग कुछ स्ट्रिंग संचालन, जैसे कारक, विलोपन और संघटन को अधिक कुशल बनाता है।


[[पाठ संपादक]] में मूल डेटा संरचना वह है जो स्ट्रिंग (वर्णों के अनुक्रम) का प्रबंधन करती है जो संपादित की जा रही फ़ाइल की वर्तमान स्थिति का प्रतिनिधित्व करती है। जबकि उस अवस्था को वर्णों की एक लंबी लगातार सरणी में संग्रहीत किया जा सकता है, इसके अतिरिक्त एक विशिष्ट पाठ संपादक इसके अनुक्रम डेटा संरचना के रूप में एक वैकल्पिक प्रतिनिधित्व का उपयोग करता है - एक अंतर बफर, लाइनों की एक लिंक्ड सूची, एक [[टुकड़ा]] तालिका, या एक रस्सी - जो बनाती है कुछ स्ट्रिंग ऑपरेशन, जैसे सम्मिलन, विलोपन, और पिछले संपादनों को पूर्ववत करना, अधिक कुशल।<ref>
[[पाठ संपादक|टेक्स्ट संपादक]] में मूल डेटा संरचना वह है जो स्ट्रिंग (वर्णों के अनुक्रम) का प्रबंधन करती है जो संपादित की जा रही फ़ाइल की वर्तमान स्थिति का प्रतिनिधित्व करती है। जबकि उस स्थिति को वर्णों की एक लंबी निरंतर सरणी में संग्रहीत किया जा सकता है इसके अतिरिक्त एक विशिष्ट टेक्स्ट संपादक इसके अनुक्रम डेटा संरचना के रूप में एक वैकल्पिक प्रतिनिधित्व का उपयोग करता है एक अंतर बफर लाइनों की एक संबद्ध सूची, एक भाग तालिका या एक रोप्स बनाती है कुछ स्ट्रिंग संचालन, जैसे कारक, विलोपन और पिछले संपादनों को पूर्ववत अधिक कुशल बनती है।<ref>
Charles Crowley.
Charles Crowley.
[http://www.cs.unm.edu/~crowley/papers/sds.pdf "Data Structures for Text Sequences"] {{webarchive|url=https://web.archive.org/web/20160304042917/https://www.cs.unm.edu/~crowley/papers/sds.pdf |date=2016-03-04 }}.
[http://www.cs.unm.edu/~crowley/papers/sds.pdf "Data Structures for Text Sequences"] {{webarchive|url=https://web.archive.org/web/20160304042917/https://www.cs.unm.edu/~crowley/papers/sds.pdf |date=2016-03-04 }}.
Line 147: Line 131:
[http://www.cs.unm.edu/~crowley/papers/sds/node1.html "Introduction"] {{webarchive|url=https://web.archive.org/web/20160404020539/http://www.cs.unm.edu/~crowley/papers/sds/node1.html |date=2016-04-04 }}.
[http://www.cs.unm.edu/~crowley/papers/sds/node1.html "Introduction"] {{webarchive|url=https://web.archive.org/web/20160404020539/http://www.cs.unm.edu/~crowley/papers/sds/node1.html |date=2016-04-04 }}.
</ref>
</ref>
=== सुरक्षा चिंताएं ===
=== सुरक्षा संबंध ===
अलग-अलग मेमोरी लेआउट और स्ट्रिंग्स की स्टोरेज आवश्यकताएं स्ट्रिंग डेटा तक पहुंचने वाले प्रोग्राम की सुरक्षा को प्रभावित कर सकती हैं। एक समाप्ति चरित्र की आवश्यकता वाले स्ट्रिंग अभ्यावेदन सामान्यतः [[बफ़र अधिकता|बफ़र]] अतिप्रवाह समस्याओं के लिए अतिसंवेदनशील होते हैं यदि समाप्ति चरित्र सम्मिलित नहीं है, जो एक कोडिंग त्रुटि या एक हमलावर द्वारा जानबूझकर डेटा को बदलने के कारण होता है। यदि लंबाई में हेरफेर किया जा सकता है तो एक अलग लंबाई क्षेत्र को अपनाने वाले स्ट्रिंग अभ्यावेदन भी अतिसंवेदनशील होते हैं। ऐसे मामलों में, स्ट्रिंग डेटा तक पहुँचने वाले प्रोग्राम कोड को यह सुनिश्चित करने के लिए [[सीमा जाँच]] की आवश्यकता होती है कि यह स्ट्रिंग मेमोरी सीमा के बाहर डेटा को अनजाने में एक्सेस या परिवर्तित नहीं करता है।
अलग-अलग मेमोरी लेआउट और स्ट्रिंग्स के भंडारण की आवश्यकताएं स्ट्रिंग डेटा तक अभिगम्य वाले प्रोग्राम की सुरक्षा को प्रभावित कर सकती हैं। एक अंतिम वर्ण की आवश्यकता वाले स्ट्रिंग अभिवेदन सामान्यतः [[बफ़र अधिकता|बफ़र]] अति प्रसारण समस्याओं के लिए संवेदनशील होते हैं यदि समाप्ति वर्ण सम्मिलित नहीं होते है जो एक कोडिंग त्रुटि या एक आक्रमण द्वारा निर्धारित डेटा परिवर्तन का कारण होता है। यदि लंबाई में परिवर्तन किया जा सकता है तो एक अलग लंबाई क्षेत्र को अपनाने वाले स्ट्रिंग अभिवेदन भी अतिसंवेदनशील होते हैं। ऐसी स्थितियों में, स्ट्रिंग डेटा तक अभिगम्य वाले प्रोग्राम कोड को यह सुनिश्चित करने के लिए [[सीमा जाँच|सीमा परीक्षण]] की आवश्यकता होती है कि यह स्ट्रिंग मेमोरी सीमा के बाहर डेटा का कोई भी नियंत्रण या परिवर्तित नहीं करता है।


उपयोगकर्ता इनपुट से प्रोग्राम में स्ट्रिंग डेटा अक्सर प्राप्त किया जाता है। जैसे, यह सुनिश्चित करने के लिए स्ट्रिंग को मान्य करने के लिए कार्यक्रम की जिम्मेदारी है कि यह अपेक्षित प्रारूप का प्रतिनिधित्व करता है। उपयोगकर्ता इनपुट का सीमित या कोई [[अनुचित इनपुट सत्यापन|सत्यापन]] नहीं करने से प्रोग्राम [[कोड इंजेक्शन]] हमलों के प्रति संवेदनशील हो सकता है।
उपयोगकर्ता के इनपुट से प्रोग्राम में स्ट्रिंग डेटा प्रायः प्राप्त किया जाता है। जैसे यह सुनिश्चित करने के लिए स्ट्रिंग को स्वीकृत करने के लिए एक कार्यक्रम उत्तरदायी होता है जो इस अपेक्षित प्रारूप का प्रतिनिधित्व करता है। उपयोगकर्ता इनपुट का सीमित या कोई [[अनुचित इनपुट सत्यापन|सत्यापन]] नहीं करने से प्रोग्राम [[कोड इंजेक्शन|कोड अंतःक्षेपण]] आक्रमण के प्रति संवेदनशील हो सकता है।


== शाब्दिक तार ==
== शाब्दिक स्ट्रिंग्स ==
{{Main|शाब्दिक स्ट्रिंग}}
{{Main|शाब्दिक स्ट्रिंग}}


कभी-कभी, स्ट्रिंग्स को एक टेक्स्ट फ़ाइल के अंदर एम्बेड करने की आवश्यकता होती है जो मानव-पठनीय और मशीन द्वारा खपत के लिए अभिप्रेत है। उदाहरण के लिए, प्रोग्रामिंग भाषाओं के स्रोत कोड या कॉन्फ़िगरेशन फ़ाइलों में इसकी आवश्यकता होती है। इस मामले में, एनयूएल चरित्र टर्मिनेटर के रूप में अच्छी तरह से काम नहीं करता है क्योंकि यह सामान्य रूप से अदृश्य (गैर-प्रिंट करने योग्य) होता है और कीबोर्ड के माध्यम से इनपुट करना मुश्किल होता है। स्ट्रिंग की लंबाई को संग्रहीत करना भी असुविधाजनक होगा क्योंकि मैन्युअल गणना और लंबाई की ट्रैकिंग थकाऊ और त्रुटि-प्रवण है।
कभी-कभी, स्ट्रिंग्स को एक टेक्स्ट फ़ाइल के अंदर अंतर्निहित करने की आवश्यकता होती है जो मानव-टेक्स्ट और मशीन द्वारा व्यय के लिए घोषित है। उदाहरण के लिए, प्रोग्रामिंग भाषाओं के स्रोत कोड या कॉन्फ़िगरेशन फ़ाइलों में इसकी आवश्यकता होती है। इस स्थिति में, एनयूएल वर्ण टर्मिनेटर के रूप में अपेक्षाकृत रूप से कार्य नहीं करता है क्योंकि यह सामान्य रूप से अदृश्य या गैर-प्रिंट करने योग्य होता है और कीबोर्ड के माध्यम से इनपुट करना जटिल होता है। स्ट्रिंग की लंबाई को संग्रहीत करना भी असुविधाजनक होता है क्योंकि मैन्युअल गणना लंबाई की नियंत्रण और त्रुटि-प्रवण होती है।
 
दो सामान्य अभ्यावेदन हैं:
* अधिकांश प्रोग्रामिंग भाषाओं द्वारा उपयोग किए जाने वाले उद्धरण चिह्नों (एएससीआईआई 0x22 दोहरे उद्धरण <code>"str"</code> ​​या एएससीआईआई 0x27 एकल उद्धरण <code>'str'</code> से घिरा हुआ है। विशेष वर्णों को सम्मिलित करने में सक्षम होने के लिए जैसे उद्धरण चिह्न स्वयं, न्यूलाइन वर्ण, या गैर-प्रिंट करने योग्य वर्ण, बचने के क्रम अक्सर उपलब्ध होते हैं, सामान्यतः [[बैकस्लैश]] वर्ण (एएससीआईआई 0x5C) के साथ प्रीफ़िक्स किया जाता है।
* विंडोज INI फ़ाइलों में उदाहरण के लिए, एक Newline अनुक्रम द्वारा समाप्त किया गया।


== गैर-पाठ तार ==
इसके दो सामान्य अभिवेदन होते हैं:
जबकि कैरेक्टर स्ट्रिंग्स स्ट्रिंग्स के बहुत सामान्य उपयोग हैं, कंप्यूटर विज्ञान में एक स्ट्रिंग समान रूप से टाइप किए गए डेटा के किसी भी अनुक्रम को सामान्य रूप से संदर्भित कर सकती है। एक [[बिट स्ट्रिंग]] या [[बाइट स्ट्रिंग]], उदाहरण के लिए, संचार माध्यम से प्राप्त गैर-पाठ्य बाइनरी डेटा का प्रतिनिधित्व करने के लिए उपयोग किया जा सकता है। यह डेटा स्ट्रिंग-विशिष्ट डेटाटाइप द्वारा प्रस्तुत किया जा सकता है या नहीं, यह एप्लिकेशन की ज़रूरतों, प्रोग्रामर की इच्छा और प्रोग्रामिंग भाषा की क्षमताओं के आधार पर उपयोग किया जा रहा है। यदि प्रोग्रामिंग भाषा का स्ट्रिंग कार्यान्वयन [[8-बिट साफ]] नहीं है, तो डेटा दूषित हो सकता है।
* अधिकांश प्रोग्रामिंग भाषाओं द्वारा उपयोग किए जाने वाले सांकेतिक चिह्नों (एएससीआईआई 0x22 दोहरे संकेत <code>"str"</code> ​​या एएससीआईआई 0x27 एकल संकेत <code>'str'</code> से घिरा हुआ होता है। विशेष वर्णों को सम्मिलित करने में सक्षम होने के लिए जैसे सांकेतिक चिह्न स्वयं, न्यूलाइन वर्ण या गैर-प्रिंट करने योग्य वर्ण, बचने के क्रम प्रायः उपलब्ध होते हैं, सामान्यतः [[बैकस्लैश]] वर्ण (एएससीआईआई 0x5C) के साथ पूर्व निर्धारित किया जाता है।
*विंडोज आईएनआई फ़ाइलों में उदाहरण के लिए, एक 'न्यूलाइन' अनुक्रम द्वारा समाप्त किया जाता है।


सी प्रोग्रामर एक "स्ट्रिंग", उर्फ ​​"वर्णों की स्ट्रिंग" के बीच एक तेज अंतर बनाते हैं, जो परिभाषा के अनुसार हमेशा शून्य समाप्त होता है, बनाम एक "बाइट स्ट्रिंग" या "छद्म स्ट्रिंग" जो एक ही सरणी में संग्रहीत हो सकता है लेकिन है अक्सर शून्य समाप्त नहीं होता। ऐसे "बाइट स्ट्रिंग" पर [[सी स्ट्रिंग हैंडलिंग]] फ़ंक्शंस का उपयोग करना अक्सर काम करता प्रतीत होता है, लेकिन बाद में सुरक्षा समस्याओं का कारण बनता है<ref>
== गैर-टेक्स्ट स्ट्रिंग्स ==
वर्ण स्ट्रिंग्स के बहुत सामान्य उपयोग होते हैं कंप्यूटर विज्ञान में एक स्ट्रिंग समान रूप से टाइप किए गए डेटा के किसी भी अनुक्रम को सामान्य रूप से संदर्भित कर सकती है। एक [[बिट स्ट्रिंग]] या [[बाइट स्ट्रिंग]] उदाहरण के लिए, संचार माध्यम से प्राप्त गैर-टेक्स्ट बाइनरी डेटा का प्रतिनिधित्व करने के लिए उपयोग किया जा सकता है। यह डेटा स्ट्रिंग-विशिष्ट डेटाटाइप द्वारा प्रस्तुत किया जा सकता है तब यह एप्लिकेशन की आवश्यक, प्रोग्रामर की इच्छा और प्रोग्रामिंग भाषा की क्षमताओं के आधार पर उपयोग किया जा सकते है। यदि प्रोग्रामिंग भाषा का स्ट्रिंग कार्यान्वयन [[8-बिट साफ|8-बिट]] नहीं होता है तब डेटा को नष्ट हो सकता है। सी प्रोग्रामर एक "स्ट्रिंग" या ​​"वर्णों की स्ट्रिंग" के बीच शीघ्र अंतर उत्पन्न करते हैं जो परिभाषा के अनुसार सदैव रिक्त होता है एक "बाइट स्ट्रिंग" या "छद्म स्ट्रिंग" जो एक ही सरणी में संग्रहीत हो सकती है लेकिन प्रायः रिक्त होती है ऐसी "बाइट स्ट्रिंग" पर [[सी स्ट्रिंग हैंडलिंग]] कारक का उपयोग करना प्रायः कार्यरत प्रतीत होता है, लेकिन बाद में यही सुरक्षा समस्याओं का कारण उत्पन्न करते है।<ref>
[https://www.sudo.ws/todd/papers/strlcpy.html "strlcpy and strlcat - consistent, safe, string copy and concatenation."] {{webarchive|url=https://web.archive.org/web/20160313163321/https://www.sudo.ws/todd/papers/strlcpy.html |date=2016-03-13 }}
[https://www.sudo.ws/todd/papers/strlcpy.html "strlcpy and strlcat - consistent, safe, string copy and concatenation."] {{webarchive|url=https://web.archive.org/web/20160313163321/https://www.sudo.ws/todd/papers/strlcpy.html |date=2016-03-13 }}
</ref><ref>
</ref><ref>
Line 173: Line 155:
2012.
2012.
</ref>
</ref>
== स्ट्रिंग प्रोसेसिंग एल्गोरिदम ==
== स्ट्रिंग प्रसंस्करण एल्गोरिदम ==
{{redirect|स्ट्रिंगोलॉजी|भौतिक सिद्धांत|स्ट्रिंग सिद्धांत}}
{{redirect|स्ट्रिंगोलॉजी|भौतिक सिद्धांत|स्ट्रिंग सिद्धांत}}


स्ट्रिंग्स को संसाधित करने के लिए कई [[एल्गोरिदम का विश्लेषण|एल्गोरिदम]] हैं, जिनमें से प्रत्येक में विभिन्न ट्रेड-ऑफ हैं। प्रतिस्पर्धी [[एल्गोरिदम का विश्लेषण]] रन टाइम, स्टोरेज आवश्यकताओं आदि के संबंध में किया जा सकता है। स्ट्रिंग प्रोसेसिंग के लिए उपयोग किए जाने वाले एल्गोरिदम और डेटा संरचनाओं के सिद्धांत के लिए कंप्यूटर वैज्ञानिक ज़्वी गैलिल द्वारा 1984 में स्ट्रिंगोलॉजी नाम दिया गया था।<ref>{{cite web|url=http://www.stringology.org/|title=The Prague Stringology Club|work=stringology.org|access-date=23 May 2015|url-status=live|archive-url=https://web.archive.org/web/20150601001757/http://www.stringology.org/|archive-date=1 June 2015}}</ref><ref>{{cite web |last1=Evarts |first1=Holly |title=Former Dean Zvi Galil Named a Top 10 Most Influential Computer Scientist in the Past Decade |url=https://www.engineering.columbia.edu/news/zvi-galil-top-10-computer-scientist |website=Columbia Engineering |language=en |date=18 March 2021 |quote=He invented the terms 'stringology,' which is a subfield of string algorithms,}}</ref><ref>{{cite book |last1=Crochemore |first1=Maxime |title=Jewels of stringology |date=2002 |location=Singapore |isbn=981-02-4782-6 |page=v |quote=The term stringology is a popular nickname for string algorithms as well as for text algorithms.}}</ref>
स्ट्रिंग्स को संसाधित करने के लिए कई [[एल्गोरिदम का विश्लेषण|एल्गोरिदम]] होते हैं जिनमें से प्रत्येक में विभिन्न समन्वयन होते हैं। प्रतियोगी [[एल्गोरिदम का विश्लेषण]] संकलन समय, भंडारण आवश्यकताओं आदि के संबंध में किया जा सकता है। स्ट्रिंग प्रसंस्करण के लिए उपयोग किए जाने वाले एल्गोरिदम और डेटा संरचनाओं के सिद्धांत के लिए कंप्यूटर वैज्ञानिक ज़्वी गैलिल द्वारा 1984 में स्ट्रिंगोलॉजी नाम दिया गया था।<ref>{{cite web|url=http://www.stringology.org/|title=The Prague Stringology Club|work=stringology.org|access-date=23 May 2015|url-status=live|archive-url=https://web.archive.org/web/20150601001757/http://www.stringology.org/|archive-date=1 June 2015}}</ref><ref>{{cite web |last1=Evarts |first1=Holly |title=Former Dean Zvi Galil Named a Top 10 Most Influential Computer Scientist in the Past Decade |url=https://www.engineering.columbia.edu/news/zvi-galil-top-10-computer-scientist |website=Columbia Engineering |language=en |date=18 March 2021 |quote=He invented the terms 'stringology,' which is a subfield of string algorithms,}}</ref><ref>{{cite book |last1=Crochemore |first1=Maxime |title=Jewels of stringology |date=2002 |location=Singapore |isbn=981-02-4782-6 |page=v |quote=The term stringology is a popular nickname for string algorithms as well as for text algorithms.}}</ref>


एल्गोरिदम की कुछ श्रेणियों में सम्मिलित हैं:
जो एल्गोरिदम की कुछ श्रेणियों में सम्मिलित हैं:
* किसी दिए गए सबस्ट्रिंग या पैटर्न को खोजने के लिए [[स्ट्रिंग खोज एल्गोरिथ्म]]
* किसी दिए गए सबस्ट्रिंग या तरीके को खोजने के लिए [[स्ट्रिंग खोज एल्गोरिथ्म|स्ट्रिंग संशोधन एल्गोरिथ्म]]
* स्ट्रिंग हेरफेर एल्गोरिदम
*स्ट्रिंग संचालन एल्गोरिदम
* [[छँटाई एल्गोरिथ्म]]
* [[छँटाई एल्गोरिथ्म|वर्गीकरण एल्गोरिथ्म]]
* [[नियमित अभिव्यक्ति]] एल्गोरिदम
* [[नियमित अभिव्यक्ति]] एल्गोरिदम
* [[पार्सर]] एक स्ट्रिंग
* [[पार्सर|पार्सिंग]] स्ट्रिंग
* [[अनुक्रम खनन]]
* [[अनुक्रम खनन]]


उन्नत स्ट्रिंग एल्गोरिदम अक्सर जटिल तंत्र और डेटा संरचनाओं को नियोजित करते हैं, उनमें से [[प्रत्यय पेड़]] और परिमित-राज्य मशीनों।
स्ट्रिंग एल्गोरिदम प्रायः जटिल क्रियाविधि और डेटा संरचनाओं को नियोजित करते हैं जिनमें प्रत्यय ट्री और सीमित रूप मे अन्य उपकरण होते हैं।


== वर्ण स्ट्रिंग-उन्मुख भाषाएँ और उपयोगिताएँ ==
== वर्ण स्ट्रिंग-उन्मुख भाषाएँ और उपयोगिताएँ ==
कैरेक्टर स्ट्रिंग्स एक ऐसा उपयोगी डेटाटाइप है जिसे स्ट्रिंग प्रोसेसिंग एप्लिकेशन को लिखने में आसान बनाने के लिए कई भाषाओं को डिज़ाइन किया गया है। उदाहरणों में निम्नलिखित भाषाएँ सम्मिलित हैं:
वर्ण स्ट्रिंग्स एक ऐसा उपयोगी डेटाटाइप है जिसे स्ट्रिंग प्रसंस्करण एप्लिकेशन को लिखने में साधारण बनाने के लिए कई भाषाओं को डिज़ाइन किया गया है। उदाहरणों में निम्नलिखित भाषाएँ सम्मिलित हैं:
* [[AWK (प्रोग्रामिंग भाषा)]]
* [[AWK (प्रोग्रामिंग भाषा)|ऑक प्रोग्रामिंग भाषा]]
* [[आइकन (प्रोग्रामिंग भाषा)]]
* [[आइकन (प्रोग्रामिंग भाषा)|आइकन प्रोग्रामिंग भाषा]]
* कण्ठमाला
* मम्प्स प्रोग्रामिंग भाषा
* पर्ल
* पर्ल प्रोग्रामिंग भाषा
* REXX
* रेक्स प्रोग्रामिंग भाषा
* रूबी (प्रोग्रामिंग भाषा)
* रूबी प्रोग्रामिंग भाषा
* सेड
* सेड प्रोग्रामिंग भाषा
* स्नोबोल
* स्नोबोल प्रोग्रामिंग भाषा
* [[आविष्कार]]
* [[आविष्कार|टीसीएल प्रोग्रामिंग भाषा]]
* [[टीटीएम (प्रोग्रामिंग भाषा)]]
* [[टीटीएम (प्रोग्रामिंग भाषा)|टीटीएम प्रोग्रामिंग भाषा]]


कई यूनिक्स उपयोगिताओं सरल स्ट्रिंग जोड़तोड़ करती हैं और कुछ शक्तिशाली स्ट्रिंग प्रोसेसिंग एल्गोरिदम को आसानी से प्रोग्राम करने के लिए इस्तेमाल किया जा सकता है। फ़ाइलें और परिमित धाराएँ तार के रूप में देखी जा सकती हैं।
कई यूनिक्स उपयोगिताओं को एक सामान्य स्ट्रिंग परिचालित करती हैं और कुछ उच्च स्ट्रिंग प्रसंस्करण एल्गोरिदम को आसानी से प्रोग्राम करने के लिए प्रयोग किया जा सकता है। फ़ाइलें और परिमित धाराएँ स्ट्रिंग के रूप में देखी जा सकती हैं। कुछ [[अप्लिकेशन प्रोग्रामिंग अंतरफलक|एप्लीकेशन प्रोग्रामिंग इंटरफेस]] जैसे [[मल्टीमीडिया नियंत्रण इंटरफ़ेस]], [[एम्बेडेड SQL|एम्बेडेड एसक्यूएल]] या [[printf|<code>printf;</code>]]का उपयोग करें जो कमांड के लिए स्ट्रिंग्स का उपयोग करते हैं।


कुछ [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] जैसे [[मल्टीमीडिया नियंत्रण इंटरफ़ेस]], [[एम्बेडेड SQL]] या [[printf]]फ का उपयोग करें जो कमांड को पकड़ने के लिए स्ट्रिंग्स का उपयोग करते हैं।
पर्ल, पायथन, रूबी और टीसीएल (प्रोग्रामिंग भाषा) सहित कई [[पिस्त्री प्रोग्रामिंग भाषा|स्क्रिप्टिंग प्रोग्रामिंग भाषा]] टेक्स्ट संचालन को सुविधाजनक बनाने के लिए नियमित अभिव्यक्तियों को नियुक्त करती हैं। विशेष रूप से इसकी नियमित अभिव्यक्ति के उपयोग के लिए पर्ल प्रोग्रामिंग को निर्धारित किया जाता है<ref>{{cite web|url=http://cslibrary.stanford.edu/108/EssentialPerl.html#re|title=Essential Perl|quote=Perl's most famous strength is in string manipulation with regular expressions.|url-status=live|archive-url=https://web.archive.org/web/20120421014328/http://cslibrary.stanford.edu/108/EssentialPerl.html#re|archive-date=2012-04-21}}</ref> कई अन्य भाषाएं और अनुप्रयोग पेर्ल संगत नियमित अभिव्यक्तियों को प्रयुक्त करती हैं।


पर्ल, पायथन (प्रोग्रामिंग भाषा), रूबी और टीसीएल सहित कई [[पिस्त्री प्रोग्रामिंग भाषा]] पाठ संचालन को सुविधाजनक बनाने के लिए नियमित अभिव्यक्तियों को नियुक्त करती हैं। पर्ल विशेष रूप से इसकी नियमित अभिव्यक्ति के उपयोग के लिए नोट किया जाता है,<ref>{{cite web|url=http://cslibrary.stanford.edu/108/EssentialPerl.html#re|title=Essential Perl|quote=Perl's most famous strength is in string manipulation with regular expressions.|url-status=live|archive-url=https://web.archive.org/web/20120421014328/http://cslibrary.stanford.edu/108/EssentialPerl.html#re|archive-date=2012-04-21}}</ref> और कई अन्य भाषाएं और अनुप्रयोग पेर्ल संगत नियमित अभिव्यक्तियों को लागू करते हैं।
पर्ल और रूबी जैसी कुछ भाषाएं [[स्ट्रिंग इंटरपोलेशन]] का समर्थन करती हैं, जो अपेक्षाकृत मानों का मूल्यांकन करने और स्ट्रिंग शाब्दिक में सम्मिलित करने की स्वीकृति प्रदान करते है।


पर्ल और रूबी जैसी कुछ भाषाएं [[स्ट्रिंग इंटरपोलेशन]] का समर्थन करती हैं, जो मनमाना भावों का मूल्यांकन करने और स्ट्रिंग शाब्दिक में सम्मिलित करने की अनुमति देता है।
== वर्ण स्ट्रिंग कारक ==
{{See also|प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग कारक)}}


== वर्ण स्ट्रिंग फ़ंक्शंस ==
स्ट्रिंग कारक का उपयोग स्ट्रिंग्स बनाने या म्यूटेबल स्ट्रिंग की डेटा को परिवर्तित करने के लिए किया जाता है। उनका उपयोग स्ट्रिंग के विषय में जानकारी पूछने के लिए भी किया जाता है। कंप्यूटर प्रोग्रामिंग भाषा के आधार पर कार्यों के समूह और उनके नाम भिन्न होते हैं।
{{See also|प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग फ़ंक्शंस)}}


स्ट्रिंग फ़ंक्शंस का उपयोग स्ट्रिंग्स बनाने या म्यूटेबल स्ट्रिंग की सामग्री को बदलने के लिए किया जाता है। उनका उपयोग स्ट्रिंग के बारे में जानकारी पूछने के लिए भी किया जाता है। कंप्यूटर प्रोग्रामिंग भाषा के आधार पर कार्यों का सेट और उनके नाम भिन्न होते हैं।
[[स्ट्रिंग फ़ंक्शन|स्ट्रिंग कारक]] का सबसे मूल उदाहरण [[स्ट्रिंग लंबाई]] कारक होता है जो स्ट्रिंग की लंबाई वापस करता है किसी भी टर्मिनेटर वर्ण या स्ट्रिंग की आंतरिक संरचनात्मक जानकारी की गणना नहीं करता है और स्ट्रिंग को संशोधित नहीं करता है। इस कारक को प्रायः <code>[[comparison of programming languages (string functions)#length |length]]</code> या <code>len</code> नाम दिया जाता है। उदाहरण के लिए, <code>length("hello world")</code> मे 11 वापस आता है। एक अन्य सामान्य कार्य संयोजन है जहां दो स्ट्रिंगों को जोड़कर एक नई स्ट्रिंग बनाई जाती है प्रायः यह <code>+</code> के अतिरिक्त ऑपरेटर होता है। कुछ [[माइक्रोप्रोसेसर]] के निर्देश समूह संरचना में स्ट्रिंग संचालन के लिए [[इंटेल x86|इंटेल एक्स86एम]] <code>आरईपीएनजेड एमओवीएसबी</code> मे प्रत्यक्ष समर्थन होता है।<ref>{{cite web|url=https://docs.oracle.com/cd/E19120-01/open.solaris/817-5477/eoizn/index.html|title=x86 string instructions|url-status=live|archive-url=https://web.archive.org/web/20150327220944/http://docs.oracle.com/cd/E19120-01/open.solaris/817-5477/eoizn/index.html|archive-date=2015-03-27}}</ref>
 
[[स्ट्रिंग फ़ंक्शन]] का सबसे बुनियादी उदाहरण [[स्ट्रिंग लंबाई]] फ़ंक्शन है - फ़ंक्शन जो स्ट्रिंग की लंबाई लौटाता है (किसी भी टर्मिनेटर वर्ण या स्ट्रिंग की आंतरिक संरचनात्मक जानकारी की गणना नहीं करता है) और स्ट्रिंग को संशोधित नहीं करता है। इस फ़ंक्शन को अक्सर <code>[[comparison of programming languages (string functions)#length |length]]</code> या <code>len</code> नाम दिया जाता है। उदाहरण के लिए, <code>length("hello world")</code> 11 वापस आ जाएगी। एक अन्य सामान्य कार्य संयोजन है, जहां दो तारों को जोड़कर एक नई स्ट्रिंग बनाई जाती है, अक्सर यह + अतिरिक्त ऑपरेटर होता है।
 
कुछ [[माइक्रोप्रोसेसर]] के निर्देश सेट आर्किटेक्चर में स्ट्रिंग ऑपरेशंस के लिए प्रत्यक्ष समर्थन होता है, जैसे ब्लॉक कॉपी (उदाहरण के लिए [[इंटेल x86]]m <code>REPNZ MOVSB</code>) ​​में)।<ref>{{cite web|url=https://docs.oracle.com/cd/E19120-01/open.solaris/817-5477/eoizn/index.html|title=x86 string instructions|url-status=live|archive-url=https://web.archive.org/web/20150327220944/http://docs.oracle.com/cd/E19120-01/open.solaris/817-5477/eoizn/index.html|archive-date=2015-03-27}}</ref>
== औपचारिक सिद्धांत ==
== औपचारिक सिद्धांत ==
{{See also|टपल}}
{{See also|टपल}}
चलो σ प्रतीकों का एक [[परिमित सेट]] (वैकल्पिक रूप से वर्ण कहा जाता है), जिसे [[वर्णमाला]] (औपचारिक भाषाएं) कहा जाता है।प्रतीकों की प्रकृति के बारे में कोई धारणा नहीं की जाती है। Σ से अधिक एक स्ट्रिंग (या शब्द) σ से प्रतीकों का कोई परिमित अनुक्रम है।<ref name="partee">{{cite book |author1=Barbara H. Partee |author2=Alice ter Meulen|author2-link=Alice ter Meulen |author3=Robert E. Wall |title=Mathematical Methods in Linguistics |publisher=Kluwer |year=1990}}</ref> उदाहरण के लिए, यदि σ = {0, & nbsp; 1}, तो 01011 σ पर एक स्ट्रिंग है।
माना कि σ प्रतीकों का एक [[परिमित सेट|परिमित समुच्चय]] है जिसे औपचारिक रूप से वर्ण या [[वर्णमाला]] कहा जाता है। प्रतीकों की प्रकृति के विषय में कोई धारणा नहीं की जाती है। Σ से अधिक एक स्ट्रिंग या शब्द σ से प्रतीकों का कोई परिमित अनुक्रम होता है।<ref name="partee">{{cite book |author1=Barbara H. Partee |author2=Alice ter Meulen|author2-link=Alice ter Meulen |author3=Robert E. Wall |title=Mathematical Methods in Linguistics |publisher=Kluwer |year=1990}}</ref> उदाहरण के लिए, यदि σ = {0, & nbsp; 1}, तो 01011 σ पर एक स्ट्रिंग होती है।
 
एक स्ट्रिंग s की [[लंबाई]] s में प्रतीकों की संख्या (अनुक्रम की लंबाई) है और कोई भी [[गैर-नकारात्मक पूर्णांक|गैर-ऋणात्मक पूर्णांक]] हो सकता है इसे प्रायः |s| के रूप में दर्शाया जाता है। [[खाली स्ट्रिंग|रिक्त स्ट्रिंग]] लंबाई 0 के σ पर अद्वितीय स्ट्रिंग होती है, और इसे ε या λ से प्रदर्शित किया जाता है।<ref name="partee"/><ref>{{cite book| author=John E. Hopcroft, Jeffrey D. Ullman| title=Introduction to Automata Theory, Languages, and Computation| year=1979| publisher=Addison-Wesley| isbn=0-201-02988-X| url-access=registration| url=https://archive.org/details/introductiontoau00hopc}} Here: sect.1.1, p.1</ref>


एक स्ट्रिंग एस की [[लंबाई]] एस (अनुक्रम की लंबाई) में प्रतीकों की संख्या है और कोई भी [[गैर-नकारात्मक पूर्णांक]] हो सकता है;यह अक्सर के रूप में निरूपित किया जाता है | s |[[खाली स्ट्रिंग]] लंबाई 0 के σ पर अद्वितीय स्ट्रिंग है, और इसे ε या λ को दर्शाया गया है।<ref name="partee"/><ref>{{cite book| author=John E. Hopcroft, Jeffrey D. Ullman| title=Introduction to Automata Theory, Languages, and Computation| year=1979| publisher=Addison-Wesley| isbn=0-201-02988-X| url-access=registration| url=https://archive.org/details/introductiontoau00hopc}} Here: sect.1.1, p.1</ref>
लंबाई n के Σ पर सभी स्ट्रिंग्स के समुच्चय को Σ<sup>n</sup> चिह्नित किया जाता है। उदाहरण के लिए, यदि Σ = {0, 1}, तो Σ<sup>2</sup> = {00, 01, 10, 11} तब ध्यान दें कि किसी भी अक्षर Σ के लिए Σ<sup>0</sup> = {ε} होता है।
लंबाई n के σ पर सभी तार का सेट σ को दर्शाया गया है<sup>n </sup>।उदाहरण के लिए, यदि σ = {0, 1}, तो σ<sup>2</sup> = {00, 01, 10, 11}।ध्यान दें कि σ<sup>किसी भी वर्णमाला के लिए 0</sup> = {}}।


किसी भी लंबाई के σ पर सभी तार का सेट σ का [[क्लेन स्टार]] है और इसे दर्शाया गया है<sup>*</sup>।के संदर्भ में<sup>n </do>,
किसी भी लम्बाई के Σ पर सभी स्ट्रिंग्स का समुच्चय Σ का विवृत होता है और इसे Σ<sup>*</sup> के रूप में दर्शाया जाता है। Σn के संदर्भ में,
:<math>\Sigma^{*} = \bigcup_{n \in \mathbb{N} \cup \{0\}} \Sigma^{n}</math>
:<math>\Sigma^{*} = \bigcup_{n \in \mathbb{N} \cup \{0\}} \Sigma^{n}</math>
उदाहरण के लिए, यदि σ = {0, 1}, तो σ<sup>*</sup> = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, ...}।हालांकि सेट σ<sup>*</sup> अपने आप में अनौपचारिक रूप से अनंत है, σ का प्रत्येक तत्व<sup>*</sup> परिमित लंबाई का एक स्ट्रिंग है।
उदाहरण के लिए, यदि σ = {0, 1}, तो σ<sup>*</sup> = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, ...} हालांकि समुच्चय σ<sup>*</sup> अपने आप में अनौपचारिक रूप से अपरिमित होता है तब Σ* के प्रत्येक अवयव की परिमित लंबाई एक स्ट्रिंग होती है। Σ पर स्ट्रिंग्स के समुच्चय (अर्थात् Σ* के किसी भी उपसमुच्चय) को Σ पर एक औपचारिक भाषा कहा जाता है। उदाहरण के लिए, यदि Σ = {0, 1}, शून्य की सम संख्या वाले स्ट्रिंग्स का समुच्चय {ε, 1, 00, 11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001, 1010, 1100, 1111, ...}, Σ पर एक औपचारिक भाषा है।
 
Σ पर स्ट्रिंग्स का एक सेट (यानी किसी भी [[सबसेट]] का σ<sup>*</sup>) को σ पर एक औपचारिक भाषा कहा जाता है।उदाहरण के लिए, यदि σ = {0, 1}, एक समान संख्या में शून्य, {,, 1, 00, 11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001 के साथ स्ट्रिंग्स का सेट।1010, 1100, 1111, ...}, σ पर एक औपचारिक भाषा है।


=== कॉन्टेनेशन और सबस्ट्रिंग ===
=== संयोजन और सबस्ट्रिंग ===
Concatenation एक महत्वपूर्ण द्विआधारी ऑपरेशन है।<sup>*</sup>।किसी भी दो तार के लिए s और t in में<sup>*</sup>, उनके संघनन को टी में वर्णों के अनुक्रम के बाद प्रतीकों के अनुक्रम के रूप में परिभाषित किया गया है, और इसे दर्शाया गया है।उदाहरण के लिए, यदि σ = {a, b, ..., z}, s & nbsp; = & nbsp;{{code|bear}}, और t & nbsp; = & nbsp;{{code|hug}}, तब st & nbsp; = & nbsp;{{code|bearhug}} और ts & nbsp; = & nbsp;{{code|hugbear}}।
संयोजन Σ* पर एक महत्वपूर्ण बाइनरी संचालन है। Σ* में किन्हीं दो स्ट्रिंग्स s और t के लिए, उनके संघटन को s में प्रतीकों के अनुक्रम के बाद t में वर्णों के अनुक्रम के रूप में परिभाषित किया गया है और इसे st के रूप में दर्शाया गया है। उदाहरण के लिए, यदि Σ = {a, b, ..., z}, ''s'' = <code>bear</code>, and ''t'' = <code>hug</code>, then ''st'' = <code>bearhug</code> and ''ts'' = <code>hugbear</code>होता है।


स्ट्रिंग कंसैटेनेशन एक साहचर्य, लेकिन गैर-[[विनिमेय]] ऑपरेशन है।खाली स्ट्रिंग ε [[पहचान तत्व]] के रूप में कार्य करता है;किसी भी स्ट्रिंग के लिए, εs = sε = s।इसलिए, सेट σ<sup>*</sup> और Concatenation ऑपरेशन एक मोनॉयड बनाते हैं, σ द्वारा उत्पन्न मुक्त [[मोनोइड]]।इसके अलावा, लंबाई फ़ंक्शन σ से एक [[मोनोइड समरूपता]] को परिभाषित करता है<sup>*</sup> गैर-नकारात्मक पूर्णांक (यानी, एक फ़ंक्शन <math>L: \Sigma^{*} \mapsto \mathbb{N} \cup \{0\}</math>, ऐसा है कि <math>L(st)=L(s)+L(t)\quad \forall s,t\in\Sigma^*</math>)
स्ट्रिंग संयोजन संबद्ध होता है लेकिन गैर-[[विनिमेय]] संचालन है। रिक्त स्ट्रिंग ε पहचान अवयव के रूप में कार्य करता है किसी भी स्ट्रिंग s के लिए, εs = sε = s समुच्चय σ<sup>*</sup> और विनिमेय संचालन एक मोनॉयड बनाते हैं, σ द्वारा उत्पन्न मुक्त [[मोनोइड]] इसके अतिरिक्त, लंबाई कारक σ से एक [[मोनोइड समरूपता|मोनोइड की समरूपता]] को परिभाषित करता है [[गैर-नकारात्मक पूर्णांक|गैर-ऋणात्मक पूर्णांक]] (अर्थात, एक कारक <math>L: \Sigma^{*} \mapsto \mathbb{N} \cup \{0\}</math>, ऐसा है कि <math>L(st)=L(s)+L(t)\quad \forall s,t\in\Sigma^*</math>) एक स्ट्रिंग s को t का सबस्ट्रिंग या कारक कहा जाता है यदि वहाँ संभवतः रिक्त स्ट्रिंग्स सम्मिलित है तो Σ* पर आंशिक क्रम को परिभाषित करता है जिसमें से कम से कम रिक्त स्ट्रिंग होती है।
 
एक स्ट्रिंग एस को कहा जाता है कि अगर वहाँ सम्मिलित है (संभवतः खाली) स्ट्रिंग्स यू और वी जैसे कि टी = यूएसवी।[[द्विआधारी संबंध]] σ पर एक [[आंशिक आदेश]] को परिभाषित करता है का एक [[सबस्ट्रिंग]] है<sup>*</sup>, जिसका [[सबसे कम तत्व]] खाली स्ट्रिंग है।


=== उपसर्ग और प्रत्यय ===
=== उपसर्ग और प्रत्यय ===
एक स्ट्रिंग s को t का एक सबस्ट्रिंग#उपसर्ग कहा जाता है यदि वहाँ एक स्ट्रिंग u सम्मिलित है जैसे कि t = su।यदि आप गैर -रिक्त हैं, तो एस को टी का एक उचित उपसर्ग कहा जाता है।सममित रूप से, एक स्ट्रिंग s को कहा जाता है कि अगर एक स्ट्रिंग यू सम्मिलित है तो टी का एक सबस्ट्रिंग#प्रत्यय है जैसे कि टी = हमें।यदि आप गैर -रिक्त हैं, तो एस को टी का एक उचित प्रत्यय कहा जाता है।प्रत्यय और उपसर्ग टी के सबस्ट्रिंग हैं।दोनों संबंधों का एक उपसर्ग है और इसका एक प्रत्यय है जो [[उपसर्ग आदेश]] हैं।
एक स्ट्रिंग s को t का उपसर्ग कहा जाता है यदि कोई स्ट्रिंग u सम्मिलित है जैसे कि t = su यदि u रिक्त नहीं है, तो s को t का उपयुक्त उपसर्ग कहा जाता है। सममित रूप से, एक स्ट्रिंग s को t का प्रत्यय कहा जाता है यदि कोई स्ट्रिंग u सम्मिलित है जैसे कि t = us यदि u रिक्त नहीं है तो s को t का उपयुक्त प्रत्यय कहा जाता है। प्रत्यय और उपसर्ग t के सबस्ट्रिंग हैं। दोनों संबंधों का एक उपसर्ग है और इसका एक प्रत्यय है जो [[उपसर्ग आदेश|उपसर्ग अनुक्रम]] हैं।


=== उलट ===
=== व्युत्क्रमण ===
एक स्ट्रिंग का रिवर्स एक ही प्रतीकों के साथ एक स्ट्रिंग है लेकिन रिवर्स ऑर्डर में।उदाहरण के लिए, यदि S = ABC (जहां A, B, और C वर्णमाला के प्रतीक हैं), तो S का उल्टा CBA है।एक स्ट्रिंग जो स्वयं का रिवर्स है (जैसे, एस = मैडम) को एक पैलिंड्रोम#कम्प्यूटेशन थ्योरी कहा जाता है, जिसमें खाली स्ट्रिंग और लंबाई 1 के सभी तार भी सम्मिलित हैं।
एक स्ट्रिंग का व्युत्क्रम समान प्रतीकों वाला एक स्ट्रिंग है लेकिन विपरीत अनुक्रम में है। उदाहरण के लिए, यदि S = ABC (जहां A, B, और C वर्णमाला के प्रतीक हैं), तो S का व्युत्क्रम CBA होता है। एक स्ट्रिंग जो स्वयं का व्युत्क्रम है जिसको पैलिंड्रोम सिद्धान्त कहा जाता है जिसमें रिक्त स्ट्रिंग और लंबाई 1 के सभी स्ट्रिंग भी सम्मिलित होते हैं।


=== रोटेशन ===
=== घूर्णन ===
एक स्ट्रिंग s = uv को t = vu के रोटेशन के रूप में कहा जाता है।उदाहरण के लिए, यदि σ = {0, 1} स्ट्रिंग 0011001 0100110 का एक रोटेशन है, जहां U = 00110 और V = 01. एक अन्य उदाहरण के रूप में, स्ट्रिंग ABC में तीन अलग -अलग घुमाव हैं, अर्थात।एबीसी स्वयं (यू = एबीसी, वी = ε), बीसीए (यू = बीसी, वी = के साथ), और कैब (यू = सी, वी = एबी के साथ) के साथ।
एक स्ट्रिंग s = uv को t = vu होने पर t का घूर्णन कहा जाता है। उदाहरण के लिए, यदि Σ = {0, 1} स्ट्रिंग 0011001 0100110 का रोटेशन है, जहां u = 00110 और v = 01 है। एक अन्य उदाहरण के रूप में, स्ट्रिंग ABC में तीन अलग -अलग घूर्णन होते हैं, अर्थात ABC स्वयं (''u''=abc, ''v''=ε), bca (''u''=bc, ''v''=a के साथ) और cab (''u''=c, ''v''=ab) के रूप मे सम्मिलित होते है।


=== लेक्सोग्राफिक ऑर्डरिंग ===
=== लेक्सोग्राफिक अनुक्रम ===
यह अक्सर स्ट्रिंग्स के एक सेट पर एक [[आदेश सिद्धांत]] को परिभाषित करना उपयोगी होता है।यदि वर्णमाला σ में [[कुल आदेश]] है (cf. [[वर्णमाला क्रम]]) कोई व्यक्ति σ पर कुल आदेश को परिभाषित कर सकता है<sup>*</sup> [[लेक्सिकोग्राफिकल ऑर्डर]] कहा जाता है।उदाहरण के लिए, यदि σ = {0, 1} और 0 <1, तो σ पर लेक्सिकोग्राफिक ऑर्डर<sup>*</sup> में रिश्ते सम्मिलित हैं ε <0 <00 <000 <000 <... <0001 <001 <01 <010 <011 <0110 <011111 <1 <10 <100 <101 <111 <1111 <111111यदि वर्णमाला आदेश है, तो लेक्सिकोग्राफिक ऑर्डर कुल क्रम है, लेकिन किसी भी गैर-वर्णमाला के लिए अच्छी तरह से स्थापित नहीं है, भले ही वर्णमाला क्रम हो।
स्ट्रिंग्स के समुच्चय पर अनुक्रम को परिभाषित करना प्रायः उपयोगी होता है। यदि वर्णमाला Σ का कुल क्रम (वर्णानुक्रमिक क्रम) है तो कोई Σ<sup>*</sup> पर कुल अनुक्रम को परिभाषित कर सकता है जिसे [[लेक्सिकोग्राफिकल ऑर्डर|लेक्सिकोग्राफिकल]] अनुक्रम कहा जाता है। उदाहरण के लिए, यदि Σ = {0, 1} और 0 <1, तो Σ* पर शब्दकोष क्रम में ε < 0 < 00 < 000 < ... < 0001 < 001 < 01 < 010 < 011 < 0110 < 01111 <1 <10 <100 <101 <111 <1111 <11111 ...लेक्सिकोग्राफिक अनुक्रम सम्मिलित है तो लेक्सोग्राफिक अनुक्रम कुल क्रम है लेकिन किसी भी गैर-वर्णमाला के लिए अपेक्षाकृत रूप से स्थापित नहीं होते है, एक वैकल्पिक स्ट्रिंग अनुक्रम के लिए [[शॉर्टलेक्स]] देखें जो अपेक्षाकृत रूप से स्थापितता को संरक्षित करता है।
 
एक वैकल्पिक स्ट्रिंग ऑर्डर के लिए [[शॉर्टलेक्स]] देखें जो अच्छी तरह से स्थापितता को संरक्षित करता है।


=== [[स्ट्रिंग संचालन]] ===
=== [[स्ट्रिंग संचालन]] ===
स्ट्रिंग्स पर कई अतिरिक्त संचालन सामान्यतः औपचारिक सिद्धांत में होते हैं।ये स्ट्रिंग ऑपरेशंस पर लेख में दिए गए हैं।
स्ट्रिंग्स पर कई अतिरिक्त संचालन सामान्यतः औपचारिक सिद्धांत में होते हैं। ये स्ट्रिंग संचालन पर लेख में दिए गए हैं।


=== टोपोलॉजी ===
=== टोपोलॉजी ===
[[File:Hamming distance 3 bit binary.svg|thumb|150px|(हाइपर) लंबाई 3 के बाइनरी स्ट्रिंग्स का घन]]स्ट्रिंग्स एक ग्राफ पर नोड्स के रूप में निम्नलिखित व्याख्या को स्वीकार करते हैं, जहां k σ में प्रतीकों की संख्या है:
[[File:Hamming distance 3 bit binary.svg|thumb|150px|उच्च लंबाई 3 के बाइनरी स्ट्रिंग्स का घन]]स्ट्रिंग्स एक आरेख पर नोड्स के रूप में निम्नलिखित व्याख्या को स्वीकृत करते हैं, जहां k σ में प्रतीकों की संख्या है:
* लंबाई एन की निश्चित-लंबाई वाले तार को एन-डायमेंशनल [[अतिविम]] में पूर्णांक स्थानों के रूप में देखा जा सकता है, जिसमें लंबाई K-1 के किनारों के साथ देखा जा सकता है।
* लंबाई n की निश्चित-लंबाई वाली स्ट्रिंग्स को लंबाई k-1 की भुजाओं वाले n-आयामी अतिविम में पूर्णांक स्थानों के रूप में देखा जा सकता है।
* चर-लंबाई वाले स्ट्रिंग्स (परिमित लंबाई के) को K-are ट्री पर नोड्स के रूप में देखा जा सकता है। परफेक्ट K-are ट्री।
* चर-लंबाई स्ट्रिंग्स (परिमित लंबाई) को एक पूर्ण k-ary ट्री पर नोड्स के रूप में देखा जा सकता है।
* [[अनंत तार]] (अन्यथा यहां नहीं माना जाता है) को K-Node [[पूर्ण ग्राफ]] पर अनंत पथ के रूप में देखा जा सकता है।
* अपरिमित स्ट्रिंग (अन्यथा यहां नहीं माना जाता है) को k-नोड [[पूर्ण ग्राफ|पूर्ण]] आरेख पर अपरिमित एड्रेस के रूप में देखा जा सकता है।


फिक्स्ड-लेंथ स्ट्रिंग्स या वेरिएबल-लेंथ स्ट्रिंग्स के सेट पर प्राकृतिक टोपोलॉजी असतत टोपोलॉजी है, लेकिन अनंत स्ट्रिंग्स के सेट पर प्राकृतिक टोपोलॉजी [[सीमित टोपोलॉजी]] है, अनंत स्ट्रिंग्स के सेट को सेट की व्युत्क्रम सीमा के रूप में देखते हुए परिमित तार। यह पी-एडिक नंबरों और [[कैंटर सेट]] के कुछ निर्माणों के लिए उपयोग किया जाने वाला निर्माण है, और समान टोपोलॉजी उत्पन्न करता है।
स्थित लंबाई स्ट्रिंग्स या चर-लंबाई स्ट्रिंग्स के समुच्चय पर प्राकृतिक टोपोलॉजी असतत टोपोलॉजी होती है लेकिन अपरिमित स्ट्रिंग्स के समुच्चय पर प्राकृतिक टोपोलॉजी [[सीमित टोपोलॉजी]] होती है अपरिमित स्ट्रिंग्स के समुच्चय को समुच्चय की व्युत्क्रम सीमा के रूप में देखते हुए परिमित स्ट्रिंग या पी-एडिक संख्याओ और [[कैंटर सेट|कैंटर]] समुच्चय के कुछ निर्माणों के लिए उपयोग किया जाने वाला निर्माण है जो समान टोपोलॉजी उत्पन्न करता है।


टोपोलॉजी के स्ट्रिंग अभ्यावेदन के बीच [[समाकृतिकता]] लेक्सोग्राफिक रूप से न्यूनतम स्ट्रिंग रोटेशन के अनुसार सामान्यीकरण करके पाया जा सकता है।
टोपोलॉजी के स्ट्रिंग अभिवेदन के बीच [[समाकृतिकता|समरूपता]] लेक्सोग्राफिक अनुक्रम रूप से न्यूनतम स्ट्रिंग घूर्णन के अनुसार सामान्यीकरण करके प्राप्त की जा सकती है।


== यह भी देखें ==
== यह भी देखें ==
* [[बाइनरी-सेफ|बाइनरी सेफ]]- स्ट्रिंग मैनिपुलेटिंग फ़ंक्शंस की एक संपत्ति उनके इनपुट को कच्चे डेटा स्ट्रीम के रूप में मानती है
* [[बाइनरी-सेफ|बाइनरी हल]]- स्ट्रिंग कारक के गुण उनके इनपुट के प्राकृतिक डेटा स्ट्रीम के रूप में होते है।
* [[बिट सरणी]] - बाइनरी अंकों की एक स्ट्रिंग
* [[बिट सरणी|बिट ऐरे]] - बाइनरी अंकों की एक स्ट्रिंग
* [[सी ++ स्ट्रिंग हैंडलिंग]] - सी स्ट्रिंग हैंडलिंग का अवलोकन
* [[सी ++ स्ट्रिंग हैंडलिंग|सी++ स्ट्रिंग हैंडलिंग]] - सी स्ट्रिंग हैंडलिंग का समीक्षा
* C ++ स्ट्रिंग हैंडलिंग - C ++ स्ट्रिंग हैंडलिंग का अवलोकन
* सी++ स्ट्रिंग हैंडलिंग- सी++ स्ट्रिंग हैंडलिंग का समीक्षा
* [[प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग फ़ंक्शन)]]
* [[प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग फ़ंक्शन)|प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग कारक)]]
* [[कनेक्शन स्ट्रिंग]] - एक कनेक्शन प्रारम्भ करने के लिए एक ड्राइवर को पास किया गया (जैसे, एक डेटाबेस के लिए)
* [[कनेक्शन स्ट्रिंग|संबंध स्ट्रिंग]] - एक संबंध प्रारम्भ करने के लिए एक चालक (जैसे, एक डेटाबेस) को पास किया जाता है।
* खाली स्ट्रिंग - इसके गुण और प्रोग्रामिंग भाषाओं में प्रतिनिधित्व
* रिक्त स्ट्रिंग - इसके गुण और प्रोग्रामिंग भाषाओं में प्रतिनिधित्व
* [[असंगत स्ट्रिंग]] - एक स्ट्रिंग जिसे किसी भी एल्गोरिथ्म द्वारा संपीड़ित नहीं किया जा सकता है
* [[असंगत स्ट्रिंग]] - एक स्ट्रिंग जिसे किसी भी एल्गोरिथ्म द्वारा संपीड़ित नहीं किया जा सकता है।
* रस्सी (डेटा संरचना) - लंबे तार में हेरफेर करने के लिए एक डेटा संरचना
* रोप्स (डेटा संरचना) - लंबे स्ट्रिंग में संशोधन करने के लिए एक डेटा संरचना
* [[स्ट्रिंग मीट्रिक]] - तार के बीच समानता की धारणा
* [[स्ट्रिंग मीट्रिक]] - स्ट्रिंग के बीच समानता की धारणा


== संदर्भ ==
== संदर्भ ==
Line 283: Line 256:
{{Data types}}
{{Data types}}
{{Formal languages and grammars |state=collapsed}}
{{Formal languages and grammars |state=collapsed}}
[[Category: स्ट्रिंग (कंप्यूटर विज्ञान) | स्ट्रिंग (कंप्यूटर विज्ञान) ]] [[Category: अक्षरों को सांकेतिक अक्षरों में बदलना]] [[Category: डेटा के प्रकार]] [[Category: औपचारिक भाषाएँ]] [[Category: शब्दों पर कॉम्बिनेटरिक्स]] [[Category: आदिम प्रकार]] [[Category: वाक्यविन्यास संस्थाएं]] [[Category: तार पर एल्गोरिदम]]


[[Category: Machine Translated Page]]
[[Category:All articles needing additional references]]
[[Category:Articles needing additional references from March 2015]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:CS1 English-language sources (en)]]
[[Category:CS1 maint]]
[[Category:Collapse templates]]
[[Category:Commons category link is locally defined]]
[[Category:Created On 13/02/2023]]
[[Category:Created On 13/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Missing redirects]]
[[Category:Navigational boxes| ]]
[[Category:Navigational boxes without horizontal lists]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Sidebars with styles needing conversion]]
[[Category:Template documentation pages|Documentation/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates generating microformats]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that are not mobile friendly]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:Webarchive template wayback links]]
[[Category:Wikipedia articles needing clarification from June 2015]]
[[Category:Wikipedia metatemplates]]
[[Category:अक्षरों को सांकेतिक अक्षरों में बदलना]]
[[Category:आदिम प्रकार]]
[[Category:औपचारिक भाषाएँ]]
[[Category:डेटा के प्रकार]]
[[Category:तार पर एल्गोरिदम]]
[[Category:वाक्यविन्यास संस्थाएं]]
[[Category:शब्दों पर कॉम्बिनेटरिक्स]]
[[Category:स्ट्रिंग (कंप्यूटर विज्ञान)| स्ट्रिंग (कंप्यूटर विज्ञान) ]]

Latest revision as of 11:18, 23 February 2023

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

प्रोग्रामिंग भाषा और अपेक्षाकृत डेटा प्रकार के आधार पर एक स्ट्रिंग के रूप में घोषित चर का उपयोग या तो मेमोरी में भंडारण की पूर्व निर्धारित अधिकतम लंबाई के लिए स्थिर रूप से आवंटित किया जा सकता है या गतिशील भंडारण को नियोजित करने के लिए इसे डेटा की एक चर संख्या निर्धारित करने के लिए स्वीकृत किया जा सकता है।

जब एक स्ट्रिंग शाब्दिक रूप से स्रोत कोड में प्रदर्शित होती है, तो इसे एक स्ट्रिंग शाब्दिक या अस्पष्ट स्ट्रिंग के रूप में जाना जाता है।[1] औपचारिक भाषाओ में जिनका उपयोग गणितीय तर्क और सैद्धांतिक कंप्यूटर विज्ञान में किया जाता है वह स्ट्रिंग प्रतीकों का एक परिमित अनुक्रम होता है जिसे वर्णमाला नामक एक समुच्चय से चयनित किया जाता है।

Diagram of String data in computing।वाक्य यह एक स्ट्रिंग है!एक अलग बॉक्स में प्रत्येक पत्र के साथ।शब्द स्ट्रिंग ऊपर है, पूरे वाक्य का जिक्र है।लेबल चरित्र नीचे है और व्यक्तिगत बक्से की ओर इशारा करता है। अंगूठे

इतिहास

"स्ट्रिंग" शब्द का प्रयोग "एक निश्चित अनुक्रम में प्रतीकों या भाषा के डेटा का एक अनुक्रम" गणितय प्रतीकात्मक तर्क और भाषा सिद्धांत से विकसित हुआ है जो प्रतीकात्मक प्रणालियों के औपचारिक सिद्धान्त का अनुसरण करता है और प्रतीकों के अर्थ को अलग करता है।[2]

उदाहरण के लिए, तर्कशास्त्री सी. आई. लुईस ने 1918 में लिखा था[3] कि एक गणितीय प्रणाली पहचानने योग्य चिह्नों के स्ट्रिंग का कोई समूह है जिसमें कुछ स्ट्रिंग को प्रारंभ में लिया जाता है और शेष इन नियमों के अनुसार किए गए संचालन से प्राप्त होते हैं जो अंकों को निर्दिष्ट किसी भी अर्थ से स्वतंत्र होते हैं। ध्वनि के अतिरिक्त एक प्रणाली में 'संकेत चिह्न' होता है।

जीन ई. सैममेट के अनुसार, कंप्यूटर के लिए "पहली यथार्थवादी स्ट्रिंग प्रबंधन और प्रतिदर्श अनुरूप भाषा" 1950 के दशक में कॉमिट भाषा थी जिसके बाद 1960 के दशक के प्रारम्भ में स्नोबॉल भाषा थी।[4]

स्ट्रिंग डेटाटाइप

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

स्ट्रिंग लंबाई

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

वर्ण संकेतीकरण

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

चीनी भाषा, जापानी भाषा (सामूहिक रूप से सीजेके वर्ण के रूप में जाना जाता है) जैसी स्ट्रिंग्किक भाषाओं को उपयुक्त प्रतिनिधित्व के लिए 256 से अधिक वर्णों (8-बिट बाइट प्रति-वर्ण संकेतीकरण की सीमा) की आवश्यकता होती है। सामान्य समाधान में एएससीआईआई के लिए एकल-बाइट प्रस्तुतियों को सम्मिलित करना और सीजेके विचारधाराओं के लिए दो-बाइट प्रस्तुतियों का उपयोग करना सम्मिलित होता है। सम्मिलित कोड के साथ इनका उपयोग करने से स्ट्रिंग्स के अनुरूप और विभिन्न समस्याएँ उत्पन्न होती है जिसकी गंभीरता इस विषय पर निर्भर करती है कि वर्ण संकेतीकरण को कैसे डिज़ाइन किया गाया है। ईयूसी समूह जैसे कुछ संकेतीकरण दायित्व करते हैं कि एएससीआईआई श्रेणी में एक बाइट मान केवल उस एएससीआईआई वर्ण का प्रतिनिधित्व करता है जो उन वर्णों को क्षेत्र विभाजक के रूप में उपयोग करने वाले सिस्टम के लिए संकेतीकरण को सुरक्षित बनाता है। अन्य संकेतीकरण जैसे आईएसओ-2022 और शिफ्ट-जेआईएस का दायित्व नहीं करते हैं जिससे बाइट कोड असुरक्षित हो जाता है। ये संकेतीकरण "तुल्यकालन संकेत" भी होते है जिससे एक स्ट्रिंग को प्रारम्भिक बैकअप प्राप्त करने के लिए वर्ण सीमाओं का पता लगाने की आवश्यकता होती है और दो स्ट्रिंग्स को एक साथ संबद्ध दूसरी स्ट्रिंग का दुरूपयोग हो सकता है। यूनीकोड ने छवि को कुछ प्रकार तक सरल बना दिया है। जिससे अधिकांश प्रोग्रामिंग भाषाओं में अब यूनिकोड स्ट्रिंग्स के लिए एक डेटाटाइप होता है। यूनिकोड का अपेक्षाकृत बाइट स्ट्रीम प्रारूप यूटीएफ-8 पुराने मल्टीबाइट संकेतीकरण के लिए ऊपर वर्णित समस्याओं से बचने के लिए डिज़ाइन किया गया है। यूटीएफ-8, यूटीएफ-16 और यूटीएफ-32 के लिए प्रोग्रामर को यह जानने की आवश्यकता होती है कि निश्चित आकार की कोड इकाइयाँ "वर्णों" से भिन्न होती हैं वर्तमान में मुख्य समस्या गलत तरीके से डिज़ाइन किए गए एपीआई के कारण हैं जो यूटीएफ-32 का उपयोग करते हैं यूटीएफ-32 निश्चित आकार के कोड बिंदु बनाता है लेकिन ये कोड लिखने के कारण "अक्षर" नहीं होते हैं

कार्यान्वयन

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

कुछ भाषाएँ, जैसे कि प्रोलॉग और एर्लंग (प्रोग्रामिंग भाषा) एक समर्पित स्ट्रिंग डेटाटाइप को प्रयुक्त करने से सुरक्षित होती हैं इसके अतिरिक्त वर्ण कोड की सूची के रूप में स्ट्रिंग्स का प्रतिनिधित्व करने के लिए स्ट्रिंग डेटा को स्वीकृत करती हैं।

अभिवेदन

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

शब्द बाइट स्ट्रिंग सामान्यतः केवल (टेक्स्ट) वर्णों, बिट्स के स्ट्रिंग या इस प्रकार के स्ट्रिंगों के अतिरिक्त बाइट्स की एक सामान्य-उद्देश्य स्ट्रिंग को इंगित करता है। जिस बाइट स्ट्रिंग्स का अर्थ प्रायः यह होता है कि बाइट का कोई भी मान ले सकते हैं और किसी भी डेटा को यथा-रूप में संग्रहीत किया जा सकता है जिसका अर्थ है कि अंतिम मान के रूप में कोई मान नहीं समझा जाना चाहिए। अधिकांश स्ट्रिंग कार्यान्वयन चर-लंबाई सरणियों के समान होती हैं जिसमें संबंधित वर्णों के वर्ण कोड को संग्रहीत करने वाली विभिन्न प्रविष्टियाँ होती हैं। मुख्य अंतर यह है कि कुछ संकेतीकरण के साथ एक स्ट्रिंग्किक वर्ण सरणी में एक से अधिक प्रविष्टियां हो सकती है। उदाहरण के लिए यह यूटीएफ-8 के साथ होता है जहां एकल कोड (यूसीएस कोड बिंदु) एक से चार बाइट तक स्ट्रिंग डेटा को कहीं भी ले जा सकते हैं और एकल वर्ण कोड की अपेक्षाकृत संख्या परिवर्तित कर सकते हैं। इन स्थितियों में, स्ट्रिंग की स्ट्रिंग्किक लंबाई (वर्णों की संख्या) सरणी की भौतिक लंबाई (उपयोग में बाइट्स की संख्या) से भिन्न होती है। जो यूटीएफ-32 समस्या के पहले भाग से सुरक्षित करता है।

रिक्त टर्मिनेट

एक विशेष टर्मिनेट वर्ण का उपयोग करके एक स्ट्रिंग की लंबाई को निहित रूप से संग्रहीत किया जा सकता है प्रायः यह रिक्त वर्ण (एनयूएल) होता है जिसमें सभी बिट्स शून्य होते हैं सी (प्रोग्रामिंग भाषा) द्वारा उपयोग की जाने वाली एक स्ट्रिंग होती है।[5] इसलिए, इस प्रतिनिधित्व को सामान्यतः सी स्ट्रिंग के रूप में जाना जाता है n -वर्ण स्ट्रिंग का यह प्रतिनिधित्व n + 1 स्पेस टर्मिनेटर के लिए 1 को स्वीकृत करता है और इस प्रकार एक अंतर्निहित डेटा संरचना होती है। टर्मिनेटेड स्ट्रिंग्स में, टर्मिनेटिंग कोड किसी भी स्ट्रिंग में स्वीकार्य वर्ण नहीं है। लंबाई क्षेत्र वाले स्ट्रिंग्स में यह सीमा नहीं होती है और यह अपेक्षाकृत बाइनरी डेटा भी संग्रहीत कर सकती है।

10-बाइट बफर (कंप्यूटर विज्ञान) में संग्रहीत एक रिक्त-टर्मिनेटेड स्ट्रिंग का एक उदाहरण, इसके एएससीआईआई या अधिक आधुनिक यूटीएफ-8 के प्रतिनिधित्व के साथ 8-बिट हेक्साडेसिमल संख्या होती है:

F R A N K NUL k e f w
4616 5216 4116 4E16 4B16 0016 6B16 6516 6616 7716

उपरोक्त उदाहरण में स्ट्रिंग की लंबाई FRANK 5 वर्ण हैं, लेकिन यह 6 बाइट्स तक विस्तृत होता है। टर्मिनेटर के बाद के वर्ण प्रतिनिधित्व के भाग नहीं बनते हैं वे या तो अन्य डेटा का भाग हो सकते हैं या केवल अशपष्ट हो सकते हैं। इस प्रकार के स्ट्रिंग्स को कभी-कभी एएससीआईजेड स्ट्रिंग्स कहा जाता है, मूल असेंबली भाषा दिशासूचक के बाद उन्हें घोषित करने के लिए उपयोग किया जाता है।

बाइट और बिट-टर्मिनेट

स्ट्रिंग्स को समाप्त करने के लिए रिक्त के अतिरिक्त एक विशेष बाइट का उपयोग करना ऐतिहासिक रूप से हार्डवेयर और सॉफ्टवेयर दोनों में प्रयुक्त किया जाता है, हालांकि कभी-कभी एक मान के साथ जो एक स्थित वर्ण था। $ का उपयोग कई असेंबलर सिस्टम द्वारा किया गया था और :का सीडीसी सिस्टम द्वारा उपयोग किया गया था इस वर्ण का मान शून्य था और जेडएक्स80 ने" का उपयोग किया[6] क्योंकि यह अपनी बेसिक भाषा में स्ट्रिंग सीमांकक था।

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

प्रारंभिक माइक्रो कंप्यूटर सॉफ़्टवेयर ने इस तथ्य पर विश्वास किया कि एएससीआईआई कोड उच्च-क्रम बिट का उपयोग नहीं करते हैं और इसे एक स्ट्रिंग के अंत को इंगित करने के लिए प्रयुक्त करते हैं। इसे आउटपुट से पहले 0 पर रीसेट किया जाना आवश्यक होता है।[7]

लंबाई-पूर्व-निर्धारित

एक स्ट्रिंग की लंबाई भी स्पष्ट रूप से संग्रहीत की जा सकती है, उदाहरण के लिए स्ट्रिंग को बाइट मान के रूप में लंबाई के साथ निर्धारित करके इस अधिवेशन का प्रयोग कई पास्कल (प्रोग्रामिंग भाषा) में किया जाता है जिसके परिणामस्वरूप, कुछ लोग ऐसी स्ट्रिंग को पास्कल स्ट्रिंग या पी-स्ट्रिंग कहते हैं। स्ट्रिंग लंबाई को बाइट के रूप में संग्रहीत करने से अधिकतम स्ट्रिंग लंबाई 255 तक सीमित हो जाती है। ऐसी सीमाओं से बचने के लिए, पी-स्ट्रिंग्स के अपेक्षाकृत कार्यान्वयन स्ट्रिंग लंबाई के भंडारण करने के लिए 16-बिट, 32-बिट या 64-बिट शब्दों का उपयोग करते हैं। जब लंबाई क्षेत्र एड्रेस को नियंत्रित करता है, तब स्ट्रिंग केवल उपलब्ध भंडारण द्वारा सीमित होते हैं।

यदि लंबाई सीमित होती है, तो इसे निरंतर स्थान में एन्कोड किया जा सकता है सामान्यतः एक मशीन शब्द को इस प्रकार n + k स्थान के रूप मे प्राप्त करती है और एक अंतर्निहित डेटा संरचना की ओर प्रेरित करती है, जहाँ k एक शब्द में वर्णों की संख्या है 8-बिट के लिए 8 और 64-बिट मशीन पर एएससीआईआई, 32-बिट मशीन पर 32-बिट यूटीएफ-32/यूसीएस-4 के लिए 1 होती है यदि लंबाई सीमित नहीं होती है, तो लंबाई n संकेतीकरण log(n) + n) स्थान ग्रहण करती है (निश्चित-लंबाई कोड देखें), इसलिए लंबाई-निर्धारण स्ट्रिंग एक संक्षिप्त डेटा संरचना है जो log(n) + n) क्षेत्र में लंबाई n की स्ट्रिंग को एन्कोड करती है। बाद की स्थिति में, लंबाई-निर्धारण क्षेत्र में निश्चित लंबाई नहीं होती है, इसलिए स्ट्रिंग बढ़ने पर वास्तविक स्ट्रिंग डेटा को स्थानांतरित करने की आवश्यकता होती है, जिससे लंबाई क्षेत्र को विस्तृत की आवश्यकता होती है।

यहां पास्कल स्ट्रिंग को 10-बाइट बफर में एएससीआईआई/यूटीएफ-8 प्रतिनिधित्व के साथ संग्रहीत किया गया है:

length F R A N K k e f w
0516 4616 5216 4116 4E16 4B16 6B16 6516 6616 7716

स्ट्रिंग रिकॉर्ड

वस्तु उन्मुख प्रोग्रामिंग सहित कई भाषाएं, आंतरिक संरचना वाले रिकॉर्ड के रूप में स्ट्रिंग्स को प्रयुक्त करती हैं जैसे:

class string {
 size_t length;
 char *text;
};

हालाँकि, कार्यान्वयन सामान्यतः छिपा हुआ है, स्ट्रिंग के सदस्य कार्यों के माध्यम से एक्सेस और संशोधित किया जाता है टेक्स्ट गतिशील रूप से आवंटित भंडारण क्षेत्र के लिए एक सूचक है जिसे आवश्यकतानुसार विस्स्ट्रिंगित किया जा सकता है। जिसके लिए स्ट्रिंग (सी ++) देखें।

अन्य अभिवेदन

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

डेटा संरचनाओं और कार्यों को बनाना संभव है जो उन्हें संरक्षित करते हैं जिनमें वर्ण समाप्ति से जुड़ी समस्याएं नहीं होती हैं और सिद्धांतिक रूप में लंबाई कोड सीमा को निर्धारित कर सकते हैं। संकलन-लंबाई संकेतीकरण (वर्ण मान और लंबाई द्वारा दोहराए गए वर्णों का परिवर्तन) और हैमिंग कोडिंग[clarification needed] से तकनीकों का उपयोग करके प्रस्तुत स्ट्रिंग को अनुकूलित करना भी संभव होता है। जबकि ये अभिवेदन सामान्य हैं या अन्य संभव हैं। रोप्स का उपयोग कुछ स्ट्रिंग संचालन, जैसे कारक, विलोपन और संघटन को अधिक कुशल बनाता है।

टेक्स्ट संपादक में मूल डेटा संरचना वह है जो स्ट्रिंग (वर्णों के अनुक्रम) का प्रबंधन करती है जो संपादित की जा रही फ़ाइल की वर्तमान स्थिति का प्रतिनिधित्व करती है। जबकि उस स्थिति को वर्णों की एक लंबी निरंतर सरणी में संग्रहीत किया जा सकता है इसके अतिरिक्त एक विशिष्ट टेक्स्ट संपादक इसके अनुक्रम डेटा संरचना के रूप में एक वैकल्पिक प्रतिनिधित्व का उपयोग करता है एक अंतर बफर लाइनों की एक संबद्ध सूची, एक भाग तालिका या एक रोप्स बनाती है कुछ स्ट्रिंग संचालन, जैसे कारक, विलोपन और पिछले संपादनों को पूर्ववत अधिक कुशल बनती है।[8]

सुरक्षा संबंध

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

उपयोगकर्ता के इनपुट से प्रोग्राम में स्ट्रिंग डेटा प्रायः प्राप्त किया जाता है। जैसे यह सुनिश्चित करने के लिए स्ट्रिंग को स्वीकृत करने के लिए एक कार्यक्रम उत्तरदायी होता है जो इस अपेक्षित प्रारूप का प्रतिनिधित्व करता है। उपयोगकर्ता इनपुट का सीमित या कोई सत्यापन नहीं करने से प्रोग्राम कोड अंतःक्षेपण आक्रमण के प्रति संवेदनशील हो सकता है।

शाब्दिक स्ट्रिंग्स

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

इसके दो सामान्य अभिवेदन होते हैं:

  • अधिकांश प्रोग्रामिंग भाषाओं द्वारा उपयोग किए जाने वाले सांकेतिक चिह्नों (एएससीआईआई 0x22 दोहरे संकेत "str" ​​या एएससीआईआई 0x27 एकल संकेत 'str' से घिरा हुआ होता है। विशेष वर्णों को सम्मिलित करने में सक्षम होने के लिए जैसे सांकेतिक चिह्न स्वयं, न्यूलाइन वर्ण या गैर-प्रिंट करने योग्य वर्ण, बचने के क्रम प्रायः उपलब्ध होते हैं, सामान्यतः बैकस्लैश वर्ण (एएससीआईआई 0x5C) के साथ पूर्व निर्धारित किया जाता है।
  • विंडोज आईएनआई फ़ाइलों में उदाहरण के लिए, एक 'न्यूलाइन' अनुक्रम द्वारा समाप्त किया जाता है।

गैर-टेक्स्ट स्ट्रिंग्स

वर्ण स्ट्रिंग्स के बहुत सामान्य उपयोग होते हैं कंप्यूटर विज्ञान में एक स्ट्रिंग समान रूप से टाइप किए गए डेटा के किसी भी अनुक्रम को सामान्य रूप से संदर्भित कर सकती है। एक बिट स्ट्रिंग या बाइट स्ट्रिंग उदाहरण के लिए, संचार माध्यम से प्राप्त गैर-टेक्स्ट बाइनरी डेटा का प्रतिनिधित्व करने के लिए उपयोग किया जा सकता है। यह डेटा स्ट्रिंग-विशिष्ट डेटाटाइप द्वारा प्रस्तुत किया जा सकता है तब यह एप्लिकेशन की आवश्यक, प्रोग्रामर की इच्छा और प्रोग्रामिंग भाषा की क्षमताओं के आधार पर उपयोग किया जा सकते है। यदि प्रोग्रामिंग भाषा का स्ट्रिंग कार्यान्वयन 8-बिट नहीं होता है तब डेटा को नष्ट हो सकता है। सी प्रोग्रामर एक "स्ट्रिंग" या ​​"वर्णों की स्ट्रिंग" के बीच शीघ्र अंतर उत्पन्न करते हैं जो परिभाषा के अनुसार सदैव रिक्त होता है एक "बाइट स्ट्रिंग" या "छद्म स्ट्रिंग" जो एक ही सरणी में संग्रहीत हो सकती है लेकिन प्रायः रिक्त होती है ऐसी "बाइट स्ट्रिंग" पर सी स्ट्रिंग हैंडलिंग कारक का उपयोग करना प्रायः कार्यरत प्रतीत होता है, लेकिन बाद में यही सुरक्षा समस्याओं का कारण उत्पन्न करते है।[9][10][11]

स्ट्रिंग प्रसंस्करण एल्गोरिदम

स्ट्रिंग्स को संसाधित करने के लिए कई एल्गोरिदम होते हैं जिनमें से प्रत्येक में विभिन्न समन्वयन होते हैं। प्रतियोगी एल्गोरिदम का विश्लेषण संकलन समय, भंडारण आवश्यकताओं आदि के संबंध में किया जा सकता है। स्ट्रिंग प्रसंस्करण के लिए उपयोग किए जाने वाले एल्गोरिदम और डेटा संरचनाओं के सिद्धांत के लिए कंप्यूटर वैज्ञानिक ज़्वी गैलिल द्वारा 1984 में स्ट्रिंगोलॉजी नाम दिया गया था।[12][13][14]

जो एल्गोरिदम की कुछ श्रेणियों में सम्मिलित हैं:

स्ट्रिंग एल्गोरिदम प्रायः जटिल क्रियाविधि और डेटा संरचनाओं को नियोजित करते हैं जिनमें प्रत्यय ट्री और सीमित रूप मे अन्य उपकरण होते हैं।

वर्ण स्ट्रिंग-उन्मुख भाषाएँ और उपयोगिताएँ

वर्ण स्ट्रिंग्स एक ऐसा उपयोगी डेटाटाइप है जिसे स्ट्रिंग प्रसंस्करण एप्लिकेशन को लिखने में साधारण बनाने के लिए कई भाषाओं को डिज़ाइन किया गया है। उदाहरणों में निम्नलिखित भाषाएँ सम्मिलित हैं:

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

पर्ल, पायथन, रूबी और टीसीएल (प्रोग्रामिंग भाषा) सहित कई स्क्रिप्टिंग प्रोग्रामिंग भाषा टेक्स्ट संचालन को सुविधाजनक बनाने के लिए नियमित अभिव्यक्तियों को नियुक्त करती हैं। विशेष रूप से इसकी नियमित अभिव्यक्ति के उपयोग के लिए पर्ल प्रोग्रामिंग को निर्धारित किया जाता है[15] कई अन्य भाषाएं और अनुप्रयोग पेर्ल संगत नियमित अभिव्यक्तियों को प्रयुक्त करती हैं।

पर्ल और रूबी जैसी कुछ भाषाएं स्ट्रिंग इंटरपोलेशन का समर्थन करती हैं, जो अपेक्षाकृत मानों का मूल्यांकन करने और स्ट्रिंग शाब्दिक में सम्मिलित करने की स्वीकृति प्रदान करते है।

वर्ण स्ट्रिंग कारक

स्ट्रिंग कारक का उपयोग स्ट्रिंग्स बनाने या म्यूटेबल स्ट्रिंग की डेटा को परिवर्तित करने के लिए किया जाता है। उनका उपयोग स्ट्रिंग के विषय में जानकारी पूछने के लिए भी किया जाता है। कंप्यूटर प्रोग्रामिंग भाषा के आधार पर कार्यों के समूह और उनके नाम भिन्न होते हैं।

स्ट्रिंग कारक का सबसे मूल उदाहरण स्ट्रिंग लंबाई कारक होता है जो स्ट्रिंग की लंबाई वापस करता है किसी भी टर्मिनेटर वर्ण या स्ट्रिंग की आंतरिक संरचनात्मक जानकारी की गणना नहीं करता है और स्ट्रिंग को संशोधित नहीं करता है। इस कारक को प्रायः length या len नाम दिया जाता है। उदाहरण के लिए, length("hello world") मे 11 वापस आता है। एक अन्य सामान्य कार्य संयोजन है जहां दो स्ट्रिंगों को जोड़कर एक नई स्ट्रिंग बनाई जाती है प्रायः यह + के अतिरिक्त ऑपरेटर होता है। कुछ माइक्रोप्रोसेसर के निर्देश समूह संरचना में स्ट्रिंग संचालन के लिए इंटेल एक्स86एम आरईपीएनजेड एमओवीएसबी मे प्रत्यक्ष समर्थन होता है।[16]

औपचारिक सिद्धांत

माना कि σ प्रतीकों का एक परिमित समुच्चय है जिसे औपचारिक रूप से वर्ण या वर्णमाला कहा जाता है। प्रतीकों की प्रकृति के विषय में कोई धारणा नहीं की जाती है। Σ से अधिक एक स्ट्रिंग या शब्द σ से प्रतीकों का कोई परिमित अनुक्रम होता है।[17] उदाहरण के लिए, यदि σ = {0, & nbsp; 1}, तो 01011 σ पर एक स्ट्रिंग होती है।

एक स्ट्रिंग s की लंबाई s में प्रतीकों की संख्या (अनुक्रम की लंबाई) है और कोई भी गैर-ऋणात्मक पूर्णांक हो सकता है इसे प्रायः |s| के रूप में दर्शाया जाता है। रिक्त स्ट्रिंग लंबाई 0 के σ पर अद्वितीय स्ट्रिंग होती है, और इसे ε या λ से प्रदर्शित किया जाता है।[17][18]

लंबाई n के Σ पर सभी स्ट्रिंग्स के समुच्चय को Σn चिह्नित किया जाता है। उदाहरण के लिए, यदि Σ = {0, 1}, तो Σ2 = {00, 01, 10, 11} तब ध्यान दें कि किसी भी अक्षर Σ के लिए Σ0 = {ε} होता है।

किसी भी लम्बाई के Σ पर सभी स्ट्रिंग्स का समुच्चय Σ का विवृत होता है और इसे Σ* के रूप में दर्शाया जाता है। Σn के संदर्भ में,

उदाहरण के लिए, यदि σ = {0, 1}, तो σ* = {ε, 0, 1, 00, 01, 10, 11, 000, 001, 010, 011, ...} हालांकि समुच्चय σ* अपने आप में अनौपचारिक रूप से अपरिमित होता है तब Σ* के प्रत्येक अवयव की परिमित लंबाई एक स्ट्रिंग होती है। Σ पर स्ट्रिंग्स के समुच्चय (अर्थात् Σ* के किसी भी उपसमुच्चय) को Σ पर एक औपचारिक भाषा कहा जाता है। उदाहरण के लिए, यदि Σ = {0, 1}, शून्य की सम संख्या वाले स्ट्रिंग्स का समुच्चय {ε, 1, 00, 11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001, 1010, 1100, 1111, ...}, Σ पर एक औपचारिक भाषा है।

संयोजन और सबस्ट्रिंग

संयोजन Σ* पर एक महत्वपूर्ण बाइनरी संचालन है। Σ* में किन्हीं दो स्ट्रिंग्स s और t के लिए, उनके संघटन को s में प्रतीकों के अनुक्रम के बाद t में वर्णों के अनुक्रम के रूप में परिभाषित किया गया है और इसे st के रूप में दर्शाया गया है। उदाहरण के लिए, यदि Σ = {a, b, ..., z}, s = bear, and t = hug, then st = bearhug and ts = hugbearहोता है।

स्ट्रिंग संयोजन संबद्ध होता है लेकिन गैर-विनिमेय संचालन है। रिक्त स्ट्रिंग ε पहचान अवयव के रूप में कार्य करता है किसी भी स्ट्रिंग s के लिए, εs = sε = s समुच्चय σ* और विनिमेय संचालन एक मोनॉयड बनाते हैं, σ द्वारा उत्पन्न मुक्त मोनोइड इसके अतिरिक्त, लंबाई कारक σ से एक मोनोइड की समरूपता को परिभाषित करता है गैर-ऋणात्मक पूर्णांक (अर्थात, एक कारक , ऐसा है कि ) एक स्ट्रिंग s को t का सबस्ट्रिंग या कारक कहा जाता है यदि वहाँ संभवतः रिक्त स्ट्रिंग्स सम्मिलित है तो Σ* पर आंशिक क्रम को परिभाषित करता है जिसमें से कम से कम रिक्त स्ट्रिंग होती है।

उपसर्ग और प्रत्यय

एक स्ट्रिंग s को t का उपसर्ग कहा जाता है यदि कोई स्ट्रिंग u सम्मिलित है जैसे कि t = su यदि u रिक्त नहीं है, तो s को t का उपयुक्त उपसर्ग कहा जाता है। सममित रूप से, एक स्ट्रिंग s को t का प्रत्यय कहा जाता है यदि कोई स्ट्रिंग u सम्मिलित है जैसे कि t = us यदि u रिक्त नहीं है तो s को t का उपयुक्त प्रत्यय कहा जाता है। प्रत्यय और उपसर्ग t के सबस्ट्रिंग हैं। दोनों संबंधों का एक उपसर्ग है और इसका एक प्रत्यय है जो उपसर्ग अनुक्रम हैं।

व्युत्क्रमण

एक स्ट्रिंग का व्युत्क्रम समान प्रतीकों वाला एक स्ट्रिंग है लेकिन विपरीत अनुक्रम में है। उदाहरण के लिए, यदि S = ABC (जहां A, B, और C वर्णमाला के प्रतीक हैं), तो S का व्युत्क्रम CBA होता है। एक स्ट्रिंग जो स्वयं का व्युत्क्रम है जिसको पैलिंड्रोम सिद्धान्त कहा जाता है जिसमें रिक्त स्ट्रिंग और लंबाई 1 के सभी स्ट्रिंग भी सम्मिलित होते हैं।

घूर्णन

एक स्ट्रिंग s = uv को t = vu होने पर t का घूर्णन कहा जाता है। उदाहरण के लिए, यदि Σ = {0, 1} स्ट्रिंग 0011001 0100110 का रोटेशन है, जहां u = 00110 और v = 01 है। एक अन्य उदाहरण के रूप में, स्ट्रिंग ABC में तीन अलग -अलग घूर्णन होते हैं, अर्थात ABC स्वयं (u=abc, v=ε), bca (u=bc, v=a के साथ) और cab (u=c, v=ab) के रूप मे सम्मिलित होते है।

लेक्सोग्राफिक अनुक्रम

स्ट्रिंग्स के समुच्चय पर अनुक्रम को परिभाषित करना प्रायः उपयोगी होता है। यदि वर्णमाला Σ का कुल क्रम (वर्णानुक्रमिक क्रम) है तो कोई Σ* पर कुल अनुक्रम को परिभाषित कर सकता है जिसे लेक्सिकोग्राफिकल अनुक्रम कहा जाता है। उदाहरण के लिए, यदि Σ = {0, 1} और 0 <1, तो Σ* पर शब्दकोष क्रम में ε < 0 < 00 < 000 < ... < 0001 < 001 < 01 < 010 < 011 < 0110 < 01111 <1 <10 <100 <101 <111 <1111 <11111 ...लेक्सिकोग्राफिक अनुक्रम सम्मिलित है तो लेक्सोग्राफिक अनुक्रम कुल क्रम है लेकिन किसी भी गैर-वर्णमाला के लिए अपेक्षाकृत रूप से स्थापित नहीं होते है, एक वैकल्पिक स्ट्रिंग अनुक्रम के लिए शॉर्टलेक्स देखें जो अपेक्षाकृत रूप से स्थापितता को संरक्षित करता है।

स्ट्रिंग संचालन

स्ट्रिंग्स पर कई अतिरिक्त संचालन सामान्यतः औपचारिक सिद्धांत में होते हैं। ये स्ट्रिंग संचालन पर लेख में दिए गए हैं।

टोपोलॉजी

उच्च लंबाई 3 के बाइनरी स्ट्रिंग्स का घन

स्ट्रिंग्स एक आरेख पर नोड्स के रूप में निम्नलिखित व्याख्या को स्वीकृत करते हैं, जहां k σ में प्रतीकों की संख्या है:

  • लंबाई n की निश्चित-लंबाई वाली स्ट्रिंग्स को लंबाई k-1 की भुजाओं वाले n-आयामी अतिविम में पूर्णांक स्थानों के रूप में देखा जा सकता है।
  • चर-लंबाई स्ट्रिंग्स (परिमित लंबाई) को एक पूर्ण k-ary ट्री पर नोड्स के रूप में देखा जा सकता है।
  • अपरिमित स्ट्रिंग (अन्यथा यहां नहीं माना जाता है) को k-नोड पूर्ण आरेख पर अपरिमित एड्रेस के रूप में देखा जा सकता है।

स्थित लंबाई स्ट्रिंग्स या चर-लंबाई स्ट्रिंग्स के समुच्चय पर प्राकृतिक टोपोलॉजी असतत टोपोलॉजी होती है लेकिन अपरिमित स्ट्रिंग्स के समुच्चय पर प्राकृतिक टोपोलॉजी सीमित टोपोलॉजी होती है अपरिमित स्ट्रिंग्स के समुच्चय को समुच्चय की व्युत्क्रम सीमा के रूप में देखते हुए परिमित स्ट्रिंग या पी-एडिक संख्याओ और कैंटर समुच्चय के कुछ निर्माणों के लिए उपयोग किया जाने वाला निर्माण है जो समान टोपोलॉजी उत्पन्न करता है।

टोपोलॉजी के स्ट्रिंग अभिवेदन के बीच समरूपता लेक्सोग्राफिक अनुक्रम रूप से न्यूनतम स्ट्रिंग घूर्णन के अनुसार सामान्यीकरण करके प्राप्त की जा सकती है।

यह भी देखें

संदर्भ

  1. "Introduction To Java - MFC 158 G". Archived from the original on 2016-03-03. String literals (or constants) are called 'anonymous strings'
  2. Burchfield, R.W. (1986). "string". A Supplement to the Oxford English Dictionary. Oxford at the Clarendon Press.
  3. Lewis, C.I. (1918). A survey of symbolic logic. Berkeley: University of California Press. p. 355.
  4. Sammet, Jean E. (July 1972). "Programming Languages: History and Future" (PDF). Communications of the ACM. 15 (7).
  5. Bryant, Randal E.; David, O'Hallaron (2003), Computer Systems: A Programmer's Perspective (2003 ed.), Upper Saddle River, NJ: Pearson Education, p. 40, ISBN 0-13-034074-X, archived from the original on 2007-08-06
  6. Wearmouth, Geoff. "An Assembly Listing of the ROM of the Sinclair ZX80". Archived from the original on August 15, 2015.{{cite web}}: CS1 maint: unfit URL (link)
  7. Allison, Dennis. "Design Notes for Tiny BASIC". Archived from the original on 2017-04-10.
  8. Charles Crowley. "Data Structures for Text Sequences" Archived 2016-03-04 at the Wayback Machine. Section "Introduction" Archived 2016-04-04 at the Wayback Machine.
  9. "strlcpy and strlcat - consistent, safe, string copy and concatenation." Archived 2016-03-13 at the Wayback Machine
  10. "A rant about strcpy, strncpy and strlcpy." Archived 2016-02-29 at the Wayback Machine
  11. Keith Thompson. "No, strncpy() is not a "safer" strcpy()". 2012.
  12. "The Prague Stringology Club". stringology.org. Archived from the original on 1 June 2015. Retrieved 23 May 2015.
  13. Evarts, Holly (18 March 2021). "Former Dean Zvi Galil Named a Top 10 Most Influential Computer Scientist in the Past Decade". Columbia Engineering (in English). He invented the terms 'stringology,' which is a subfield of string algorithms,
  14. Crochemore, Maxime (2002). Jewels of stringology. Singapore. p. v. ISBN 981-02-4782-6. The term stringology is a popular nickname for string algorithms as well as for text algorithms.{{cite book}}: CS1 maint: location missing publisher (link)
  15. "Essential Perl". Archived from the original on 2012-04-21. Perl's most famous strength is in string manipulation with regular expressions.
  16. "x86 string instructions". Archived from the original on 2015-03-27.
  17. 17.0 17.1 Barbara H. Partee; Alice ter Meulen; Robert E. Wall (1990). Mathematical Methods in Linguistics. Kluwer.
  18. John E. Hopcroft, Jeffrey D. Ullman (1979). Introduction to Automata Theory, Languages, and Computation. Addison-Wesley. ISBN 0-201-02988-X. Here: sect.1.1, p.1