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

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

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

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



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

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

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

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

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

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

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

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

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

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

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

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

टर्मिनेटेड स्ट्रिंग्स में, टर्मिनेटिंग कोड किसी भी स्ट्रिंग में स्वीकार्य वर्ण नहीं है। लंबाई क्षेत्र वाले स्ट्रिंग्स में यह सीमा नहीं होती है और यह मनमाना बाइनरी डेटा भी संग्रहीत कर सकता है।

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

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

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

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

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

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

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

बाद के मामले में, लंबाई-उपसर्ग क्षेत्र में निश्चित लंबाई नहीं होती है, इसलिए स्ट्रिंग बढ़ने पर वास्तविक स्ट्रिंग डेटा को स्थानांतरित करने की आवश्यकता होती है, जिससे लंबाई क्षेत्र को बढ़ाने की आवश्यकता होती है।

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

तार रिकॉर्ड के रूप में
ऑब्जेक्ट-ओरिएंटेड सहित कई भाषाएं, आंतरिक संरचना वाले रिकॉर्ड के रूप में स्ट्रिंग्स को लागू करती हैं जैसे: class string { size_t length; char *text; }; हालाँकि, चूंकि कार्यान्वयन सामान्यतः छिपा हुआ है, स्ट्रिंग को सदस्य कार्यों के माध्यम से एक्सेस और संशोधित किया जाना चाहिए। टेक्स्ट गतिशील रूप से आवंटित स्मृति क्षेत्र के लिए एक सूचक है, जिसे आवश्यकतानुसार विस्तारित किया जा सकता है। स्ट्रिंग (सी ++) भी देखें।

अन्य अभ्यावेदन
दोनों वर्ण समाप्ति और लंबाई कोड स्ट्रिंग्स को सीमित करते हैं: उदाहरण के लिए, सी वर्ण सरणियाँ जिनमें अशक्त (एनयूएल) वर्ण होते हैं, सी स्ट्रिंग लाइब्रेरी फ़ंक्शंस द्वारा सीधे संभाला नहीं जा सकता है: लंबाई कोड का उपयोग करने वाले स्ट्रिंग लंबाई कोड के अधिकतम मूल्य तक सीमित हैं।

इन दोनों सीमाओं को चतुर प्रोग्रामिंग द्वारा दूर किया जा सकता है।

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

जबकि ये अभ्यावेदन सामान्य हैं, अन्य संभव हैं। रस्सियों का उपयोग कुछ स्ट्रिंग ऑपरेशन, जैसे सम्मिलन, विलोपन और संघटन को अधिक कुशल बनाता है।

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

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

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

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

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

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

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

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

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

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

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

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

कुछ अप्लिकेशन प्रोग्रामिंग अंतरफलक जैसे मल्टीमीडिया नियंत्रण इंटरफ़ेस, एम्बेडेड SQL या printfफ का उपयोग करें जो कमांड को पकड़ने के लिए स्ट्रिंग्स का उपयोग करते हैं।

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

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

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

स्ट्रिंग फ़ंक्शन का सबसे बुनियादी उदाहरण स्ट्रिंग लंबाई फ़ंक्शन है - फ़ंक्शन जो स्ट्रिंग की लंबाई लौटाता है (किसी भी टर्मिनेटर वर्ण या स्ट्रिंग की आंतरिक संरचनात्मक जानकारी की गणना नहीं करता है) और स्ट्रिंग को संशोधित नहीं करता है। इस फ़ंक्शन को प्रायः  या   नाम दिया जाता है। उदाहरण के लिए,   11 वापस आ जाएगी। एक अन्य सामान्य कार्य संयोजन है, जहां दो स्ट्रिंगों को जोड़कर एक नई स्ट्रिंग बनाई जाती है, प्रायः यह + अतिरिक्त ऑपरेटर होता है।

कुछ माइक्रोप्रोसेसर के निर्देश सेट आर्किटेक्चर में स्ट्रिंग ऑपरेशंस के लिए प्रत्यक्ष समर्थन होता है, जैसे ब्लॉक कॉपी (उदाहरण के लिए इंटेल x86m ) ​​में)।

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

एक स्ट्रिंग एस की लंबाई एस (अनुक्रम की लंबाई) में प्रतीकों की संख्या है और कोई भी गैर-नकारात्मक पूर्णांक हो सकता है;यह प्रायः के रूप में निरूपित किया जाता है | s |खाली स्ट्रिंग लंबाई 0 के σ पर अद्वितीय स्ट्रिंग है, और इसे ε या λ को दर्शाया गया है। लंबाई n के σ पर सभी स्ट्रिंग का सेट σ को दर्शाया गया हैn।उदाहरण के लिए, यदि σ = {0, 1}, तो σ2 = {00, 01, 10, 11}।ध्यान दें कि σकिसी भी वर्णमाला के लिए 0 = {}}।

किसी भी लंबाई के σ पर सभी स्ट्रिंग का सेट σ का क्लेन स्टार है और इसे दर्शाया गया है*।के संदर्भ में n ,
 * $$\Sigma^{*} = \bigcup_{n \in \mathbb{N} \cup \{0\}} \Sigma^{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, ...}, σ पर एक औपचारिक भाषा है।

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

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

एक स्ट्रिंग एस को कहा जाता है कि अगर वहाँ सम्मिलित है (संभवतः खाली) स्ट्रिंग्स यू और वी जैसे कि टी = यूएसवी।द्विआधारी संबंध σ पर एक आंशिक आदेश को परिभाषित करता है का एक सबस्ट्रिंग है*, जिसका सबसे कम तत्व खाली स्ट्रिंग है।

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

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

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

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

एक वैकल्पिक स्ट्रिंग ऑर्डर के लिए शॉर्टलेक्स देखें जो अच्छी तरह से स्थापितता को संरक्षित करता है।

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

टोपोलॉजी
स्ट्रिंग्स एक ग्राफ पर नोड्स के रूप में निम्नलिखित व्याख्या को स्वीकार करते हैं, जहां k σ में प्रतीकों की संख्या है:
 * लंबाई एन की निश्चित-लंबाई वाले स्ट्रिंग को एन-डायमेंशनल अतिविम में पूर्णांक स्थानों के रूप में देखा जा सकता है, जिसमें लंबाई K-1 के किनारों के साथ देखा जा सकता है।
 * चर-लंबाई वाले स्ट्रिंग्स (परिमित लंबाई के) को K-are ट्री पर नोड्स के रूप में देखा जा सकता है। परफेक्ट K-are ट्री।
 * अनंत स्ट्रिंग (अन्यथा यहां नहीं माना जाता है) को K-Node पूर्ण ग्राफ पर अनंत पथ के रूप में देखा जा सकता है।

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

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

यह भी देखें

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