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

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

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

जब एक स्ट्रिंग शाब्दिक रूप से स्रोत कोड में दिखाई देती है, तो इसे एक स्ट्रिंग शाब्दिक या अनाम स्ट्रिंग के रूप में जाना जाता है।

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



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

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

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

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

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

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

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

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

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

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

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

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

अधिकांश स्ट्रिंग कार्यान्वयन चर-लंबाई सरणियों के समान हैं, जिसमें संबंधित वर्णों के वर्ण कोड को संग्रहीत करने वाली प्रविष्टियाँ हैं। मुख्य अंतर यह है कि, कुछ एनकोडिंग के साथ, एक तार्किक वर्ण सरणी में एक से अधिक प्रविष्टियां ले सकता है। यह उदाहरण के लिए यूटीएफ-8 के साथ होता है, जहां एकल कोड (UCS कोड बिंदु) एक से चार बाइट तक कहीं भी ले जा सकते हैं, और एकल वर्ण कोड की मनमानी संख्या ले सकते हैं। इन मामलों में, स्ट्रिंग की तार्किक लंबाई (वर्णों की संख्या) सरणी की भौतिक लंबाई (उपयोग में बाइट्स की संख्या) से भिन्न होती है। यूटीएफ-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 ++ स्ट्रिंग हैंडलिंग का अवलोकन
 * प्रोग्रामिंग भाषाओं की तुलना (स्ट्रिंग फ़ंक्शन)
 * कनेक्शन स्ट्रिंग - एक कनेक्शन प्रारम्भ करने के लिए एक ड्राइवर को पास किया गया (जैसे, एक डेटाबेस के लिए)
 * खाली स्ट्रिंग - इसके गुण और प्रोग्रामिंग भाषाओं में प्रतिनिधित्व
 * असंगत स्ट्रिंग - एक स्ट्रिंग जिसे किसी भी एल्गोरिथ्म द्वारा संपीड़ित नहीं किया जा सकता है
 * रस्सी (डेटा संरचना) - लंबे तार में हेरफेर करने के लिए एक डेटा संरचना
 * स्ट्रिंग मीट्रिक - तार के बीच समानता की धारणा