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

From Vigyanwiki

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

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

जब एक स्ट्रिंग शाब्दिक रूप से स्रोत कोड में प्रदर्शित होती है, तो इसे एक स्ट्रिंग शाब्दिक या अस्पष्ट स्ट्रिंग के रूप में जाना जाता है।[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