सी में एस्केप सीक्वेंस

From Vigyanwiki

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

C में, सभी एस्केप सीक्वेंस में दो या दो से अधिक वर्ण होते हैं, जिनमें से पहला बैकस्लैश \ (जिसे एस्केप कैरेक्टर कहा जाता है) है, शेष वर्ण एस्केप कैरेक्टर की व्याख्या निर्धारित करते हैं। उदाहरण के लिए, \n एस्केप सीक्वेंस है जो नई पंक्ति स्वरूप को दर्शाता है।

प्रेरणा

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

#include <stdio.h>
int main() {
    printf("Hello,
world!");
}

यह C में मान्य नहीं है, क्योंकि स्ट्रिंग शाब्दिक कई तार्किक स्रोत पंक्तियों को फैला नहीं सकता है। इसके संख्यात्मक मान ( एएससीआईआई में 0x0A) का उपयोग करके न्यूलाइन वर्ण को प्रिंट करके इसके आसपास काम किया जा सकता है,

#include <stdio.h>
int main() {
    printf("Hello,%cworld!", 0x0A);
}

यह प्रोग्राम Hello, को प्रिंट करने का निर्देश देता है, उसके बाद बाइट जिसका संख्यात्मक मान 0x0A, है, जिसके बाद world! है। जबकि यह वास्तविक में तब काम करेगा जब मशीन ASCII एन्कोडिंग का उपयोग करती है, यह उन सिस्टम पर काम नहीं करेगी जो अन्य एन्कोडिंग का उपयोग करते हैं, जिनके पास न्यूलाइन कैरेक्टर के लिए अलग संख्यात्मक मान है। यह अच्छा समाधान भी नहीं है क्योंकि यह अभी भी शाब्दिक के अंदर न्यूलाइन वर्ण का प्रतिनिधित्व करने की अनुमति नहीं देता है, और इसके बजाय प्रिंटफ के शब्दार्थ का लाभ उठाता है। इन समस्याओं को हल करने और सिस्टम के बीच अधिकतम पोर्टेबिलिटी सुनिश्चित करने के लिए, सी एक शाब्दिक के अंदर \n को न्यूलाइन वर्ण के रूप में व्याख्या करता है, जो कुछ भी लक्ष्य प्रणाली पर हो सकता है:

#include <stdio.h>
int main() {
    printf("Hello,\nworld!");
}

इस कोड में, एस्केप सीक्वेंस \n अक्षर n के बाद बैकस्लैश के लिए खड़ा नहीं होता है, क्योंकि बैकस्लैश सामान्य तरीके से "एस्केप" का कारण बनता है, जिसकी व्याख्या कंपाइलर द्वारा की जाती है। बैकस्लैश को देखने के बाद, कंपाइलर किसी अन्य चरित्र से एस्केप सीक्वेंस को पूरा करने की अपेक्षा करता है, और फिर एस्केप सीक्वेंस को बाइट्स में ट्रांसलेट करता है, जिसका प्रतिनिधित्व करने का इरादा है। इस प्रकार, ""Hello,\nworld!" एक एम्बेडेड न्यूलाइन के साथ एक स्ट्रिंग का प्रतिनिधित्व करता है, भले ही इसका उपयोग printf के अंदर या कहीं और किया गया हो।

यह इस मुद्दे को उठाता है कि शाब्दिक के अंदर वास्तविकिक बैकस्लैश का प्रतिनिधित्व कैसे किया जाए। यह एस्केप सीक्वेंस \\ का उपयोग करके किया जाता है , जैसा कि अगले भाग में देखा गया है।

कुछ भाषाओं में एस्केप सीक्वेंस नहीं होते हैं, उदाहरण के लिए पास्कल (प्रोग्रामिंग भाषा)। इसके बजाय नई पंक्ति सहित कमांड का उपयोग किया जाएगा (writeln नई पंक्ति शामिल है, write इसे बाहर करता है)।

writeln('Hello');
write('world!');

एस्केप के क्रम की तालिका

निम्नलिखित एस्केप सीक्वेंस को मानक सी में परिभाषित किया गया है। यह तालिका उन मानों को भी दिखाती है जिन्हें वे ASCII में मैप करते हैं। हालाँकि, इन एस्केप सीक्वेंस का उपयोग C कंपाइलर के साथ किसी भी सिस्टम पर किया जा सकता है, और यदि सिस्टम ASCII पर आधारित वर्ण एन्कोडिंग का उपयोग नहीं करता है, तो यह विभिन्न मानों पर मैप कर सकता है।

एस्केप का क्रम ASCII में हेक्स मान वर्ण का प्रतिनिधित्व किया
\a 07 अलर्ट (बीप, बेल) (C89 में जोड़ा गया)[1]
\b 08 बैकस्पेस
\enote 1 1B एस्केप कैरेक्टर
\f 0C फॉर्मफीड पेज ब्रेक
\n 0A न्यूलाइन (लाइन फीड); नीचे नोट्स देखें
\r 0D Carriage Return
\t 09 क्षैतिज टैब
\v 0B लंबवत टैब
\\ 5C बैकस्लैश
\' 27 एपोस्ट्रोफी या एकल उद्धरण चिह्न
\" 22 दोहरा उद्धरण चिह्न
\? 3F प्रश्न चिह्न ( ट्रिग्राफ से बचने के लिए प्रयुक्त)
\nnnnote 2 कोई वह बाइट जिसका संख्यात्मक मान nnn द्वारा दिया जाता है, एक ऑक्टल संख्या के रूप में व्याख्या की जाती है
\xhh… कोई वह बाइट जिसका संख्यात्मक मान hh… द्वारा दिया जाता है, एक हेक्साडेसिमल संख्या के रूप में व्याख्या की जाती है
\uhhhhnote 3 कोई नहीं 10000 हेक्साडेसिमल से नीचे यूनिकोड कोड बिंदु (C99 में जोड़ा गया) [1]: 26 
\Uhhhhhhhhnote 4 कोई नहीं यूनिकोड कोड बिंदु जहाँ h एक हेक्साडेसिमल अंक है
नोट 1।^ सामान्य अमानक कोड; नीचे नोट्स अनुभाग देखें।
नोट 2।^ एक, दो, या तीन अष्टक अंक मौजूद हो सकते हैं; नीचे नोट्स अनुभाग देखें।
नोट 3।^ \u 4 हेक्साडेसिमल अंक h लेता है; नीचे नोट्स अनुभाग देखें।
नोट 4।^ \U में 8 हेक्साडेसिमल अंक h; नीचे नोट्स अनुभाग देखें।

टिप्पणियाँ

\n एक बाइट उत्पन्न करता है, इस तथ्य के बावजूद कि प्लेटफॉर्म एक नई पंक्ति को इंगित करने के लिए एक से अधिक बाइट का उपयोग कर सकता है, जैसे कि डॉस/विंडोज सीआरएलएफ अनुक्रम, 0x0D 0x0A। डॉस और विंडोज पर 0x0A से 0x0D 0x0A में अनुवाद तब होता है जब बाइट को फ़ाइल या कंसोल पर लिखा जाता है, और पाठ फ़ाइलों को पढ़ने पर उलटा अनुवाद किया जाता है।

एक हेक्स एस्केप सीक्वेंस में \x के बाद कम से कम एक हेक्स अंक होना चाहिए, जिसमें कोई ऊपरी सीमा नहीं है; यह उतने ही हेक्स अंकों के लिए जारी है जितने कि हैं। इस प्रकार, उदाहरण के लिए, \xABCDEFG संख्यात्मक मान ABCDEF16 के साथ बाइट को दर्शाता है, उसके बाद अक्षर G आता है, जो एक हेक्स अंक नहीं है। हालाँकि, यदि परिणामी पूर्णांक मान एक बाइट में फ़िट होने के लिए बहुत बड़ा है, तो असाइन किया गया वास्तविकिक संख्यात्मक मान कार्यान्वयन-परिभाषित है। अधिकांश प्लेटफार्मों में 8-बिट चार प्रकार होते हैं, जो एक उपयोगी हेक्स एस्केप अनुक्रम को दो हेक्स अंकों तक सीमित करता है। हालाँकि, दो हेक्स अंकों से अधिक लंबे हेक्स एस्केप सीक्वेंस एक विस्तृत वर्ण या विस्तृत स्ट्रिंग शाब्दिक (एल के साथ उपसर्ग) के अंदर उपयोगी हो सकते हैं:

char s1[] = "\x12";       // single char with value 0x12 (18 in decimal)
char s1[] = "\x1234";     // single char with implementation-defined value, unless char is long enough
wchar_t s2[] = L"\x1234"; // single wchar_t with value 0x1234, provided wchar_t is long enough (16 bits suffices)

एक ऑक्टल एस्केप सीक्वेंस में \के बाद एक, दो या तीन ऑक्टल अंक होते हैं। ऑक्टल एस्केप सीक्वेंस तब समाप्त होता है जब इसमें पहले से ही तीन ऑक्टल अंक होते हैं, या अगला वर्ण ऑक्टल अंक नहीं होता है। उदाहरण के लिए, \11 एक सिंगल ऑक्टल एस्केप सीक्वेंस है, जो संख्यात्मक मान 9 (ऑक्टल में 11) के साथ एक बाइट को दर्शाता है, न कि एस्केप सीक्वेंस \1 के बाद अंक 1 बाद। हालांकि, \1111 ऑक्टल एस्केप सीक्वेंस \111 के बाद अंक 1 आता है। । संख्यात्मक मान 1 के साथ बाइट को दर्शाने के लिए, अंक 1 के बाद, कोई "\1""1" का उपयोग कर सकता है, क्योंकि C स्वचालित रूप से आसन्न स्ट्रिंग अक्षर को जोड़ता है। ध्यान दें कि कुछ तीन-अंकीय ऑक्टल एस्केप अनुक्रम एक बाइट में फ़िट होने के लिए बहुत बड़े हो सकते हैं; इसका परिणाम वास्तविक में उत्पादित बाइट के लिए कार्यान्वयन-परिभाषित मूल्य में होता है। एस्केप सीक्वेंस \0 एक आमतौर पर इस्तेमाल किया जाने वाला ऑक्टल एस्केप सीक्वेंस है, जो शून्य वर्ण के साथ, शून्य वर्ण को दर्शाता है।

गैर-मानक पलायन अनुक्रम

क्रम जैसे \z सी मानक के अनुसार वैध एस्केप सीक्वेंस नहीं है क्योंकि यह उपरोक्त तालिका में नहीं पाया जाता है। सी मानक को निदान के लिए ऐसे अमान्य एस्केप सीक्वेंस की आवश्यकता होती है (यानी, कंपाइलर को त्रुटि संदेश प्रिंट करना होगा)। इस तथ्य के बावजूद, कुछ संकलक कार्यान्वयन-परिभाषित शब्दार्थ के साथ अतिरिक्त एस्केप सीक्वेंस को परिभाषित कर सकते हैं। उदाहरण है \e एस्केप सीक्वेंस, जिसका ASCII में हेक्साडेसिमल मान के रूप में 1B है, जो एस्केप कैरेक्टर का प्रतिनिधित्व करता है, और जीएनयू संकलक संग्रह,[2] बजना और टिनी सी कंपाइलर में समर्थित है। हालाँकि इसे C मानक प्रदर्शनों की सूची में नहीं जोड़ा गया था, क्योंकि कुछ वर्ण सेटों (जैसे EBCDIC) में इसका कोई सार्थक समकक्ष नहीं है।[1]


सार्वभौमिक चरित्र नाम

C99 मानक से, C ने एस्केप सीक्वेंस का भी समर्थन किया है जो स्ट्रिंग शाब्दिक में यूनिकोड कोड बिंदुओं को दर्शाता है। इस तरह के एस्केप सीक्वेंस को यूनिवर्सल कैरेक्टर नेम कहा जाता है और इनका फॉर्म होता है \uhhhh या \Uhhhhhhhh, कहाँ h हेक्स अंक के लिए खड़ा है। माना जाने वाले अन्य पलायन अनुक्रमों के विपरीत, सार्वभौमिक वर्ण नाम से अधिक कोड इकाई में विस्तारित हो सकता है।

क्रम \uhhhh कोड बिंदु को दर्शाता है hhhh, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। क्रम \Uhhhhhhhh कोड बिंदु को दर्शाता है hhhhhhhh, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। (इसलिए, U+10000 या उच्चतर पर स्थित कोड बिंदुओं को इसके साथ चिह्नित किया जाना चाहिए \U सिंटैक्स, जबकि निम्न कोड बिंदु उपयोग कर सकते हैं \u या \U।) लक्ष्य प्रणाली पर गंतव्य प्रकार के एन्कोडिंग में कोड बिंदु को कोड इकाइयों के अनुक्रम में परिवर्तित किया जाता है। उदाहरण के लिए (जहां एन्कोडिंग UTF-8 है, और UTF-16 के लिए wchar_t):

char s1[] = "\xC0"; // A single byte with the value 0xC0, not valid UTF-8
char s2[] = "\u00C0"; // Two bytes with values 0xC3, 0x80, the UTF-8 encoding of U+00C0
wchar_t s3[] = L"\xC0"; // A single wchar_t with the value 0x00C0
wchar_t s4[] = L"\u00C0"; // A single wchar_t with the value 0x00C0

से बड़ा मान \U0000FFFF द्वारा प्रतिनिधित्व किया जा सकता है wchar_t यदि UTF-32 एन्कोडिंग का उपयोग किया जाता है, या दो यदि UTF-16 का उपयोग किया जाता है।

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

यह भी देखें

संदर्भ

  1. 1.0 1.1 1.2 "Rationale for International Standard - Programming Languages - C" (PDF). 5.10. April 2003. Archived (PDF) from the original on 2016-06-06. Retrieved 2010-10-17.
  2. "6.35 The Character <ESC> in Constants". GCC 4.8.2 Manual. Archived from the original on 2019-05-12. Retrieved 2014-03-08.


अग्रिम पठन