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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

बाद के मामले में, लंबाई-प्रीफिक्स फ़ील्ड में स्वयं निश्चित लंबाई नहीं होती है, इसलिए वास्तविक स्ट्रिंग डेटा को स्थानांतरित करने की आवश्यकता होती है जब स्ट्रिंग इस तरह से बढ़ता है कि लंबाई क्षेत्र को बढ़ाने की आवश्यकता होती है। यहाँ एक पास्कल स्ट्रिंग है जो 10-बाइट बफर में संग्रहीत है, साथ ही इसके ASCII / UTF-8 प्रतिनिधित्व के साथ:

तार रिकॉर्ड के रूप में
ऑब्जेक्ट-ओरिएंटेड वाले सहित कई भाषाएं, एक आंतरिक संरचना के साथ रिकॉर्ड (कंप्यूटर विज्ञान) के रूप में तार को लागू करती हैं: जैसे:

 क्लास स्ट्रिंग { size_t लंबाई; चार *पाठ; };

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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