सी में एस्केप सीक्वेंस
एस्केप सीक्वेंस का उपयोग प्रोग्रामिंग लैंग्वेज सी (प्रोग्रामिंग भाषा) और सी ++ में किया जाता है, और उनके डिजाइन को कई अन्य भाषाओं जैसे जावा (प्रोग्रामिंग भाषा), पीएचपी, सी शार्प (प्रोग्रामिंग लैंग्वेज), आदि में कॉपी किया गया था। एस्केप सीक्वेंस वर्णों का एक क्रम है जो किसी वर्ण या स्ट्रिंग शाब्दिक के अंदर उपयोग किए जाने पर स्वयं का प्रतिनिधित्व नहीं करता है, लेकिन किसी अन्य वर्ण या वर्णों के अनुक्रम में अनुवाद किया जाता है जो सीधे प्रतिनिधित्व करना मुश्किल या असंभव हो सकता है।
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 में अनुवाद तब होता है जब बाइट को फ़ाइल या कंसोल पर लिखा जाता है, और पाठ फ़ाइलों को पढ़ने पर उलटा अनुवाद किया जाता है।
A hex escape sequence must have at least one hex digit following \x, with no upper bound; it continues for as many hex digits as there are. Thus, for example, \xABCDEFG denotes the byte with the numerical value ABCDEF16, followed by the letter G, which is not a hex digit. However, if the resulting integer value is too large to fit in a single byte, the actual numerical value assigned is implementation-defined. Most platforms have 8-bit char types, which limits a useful hex escape sequence to two hex digits. However, hex escape sequences longer than two hex digits might be useful inside a wide character or wide string literal(prefixed with L):
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)
An octal escape sequence consists of \ followed by one, two, or three octal digits. The octal escape sequence ends when it either contains three octal digits already, or the next character is not an octal digit. For example, \11 is a single octal escape sequence denoting a byte with numerical value 9 (11 in octal), rather than the escape sequence \1 followed by the digit 1. However, \1111 is the octal escape sequence \111 followed by the digit 1. In order to denote the byte with numerical value 1, followed by the digit 1, one could use "\1""1", since C automatically concatenates adjacent string literals. Note that some three-digit octal escape sequences may be too large to fit in a single byte; this results in an implementation-defined value for the byte actually produced. The escape sequence \0 is a commonly used octal escape sequence, which denotes the null character, with value zero.
गैर-मानक पलायन अनुक्रम
क्रम जैसे \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): <वाक्यविन्यास प्रकाश लैंग = सी> चार एस 1 [] = \ xC0; // 0xC0 मान वाला बाइट, वैध UTF-8 नहीं चार s2 [] = \ u00C0; // मान 0xC3, 0x80 के साथ दो बाइट, U+00C0 की UTF-8 एन्कोडिंग wchar_t s3 [] = एल xC0; // 0x00C0 मान के साथ एकल wchar_t wchar_t s4[] = एल \u00C0; // 0x00C0 मान के साथ एकल wchar_t </वाक्यविन्यास हाइलाइट>
से बड़ा मान \U0000FFFF द्वारा प्रतिनिधित्व किया जा सकता है wchar_t यदि UTF-32 एन्कोडिंग का उपयोग किया जाता है, या दो यदि UTF-16 का उपयोग किया जाता है।
महत्वपूर्ण रूप से, सार्वभौमिक चरित्र नाम \u00C0 हमेशा वर्ण À को इंगित करता है, भले ही यह किस प्रकार के स्ट्रिंग शाब्दिक में उपयोग किया जाता है, या उपयोग में एन्कोडिंग। एन्कोडिंग के बावजूद, ऑक्टल और हेक्स एस्केप अनुक्रम हमेशा संख्यात्मक मानों के कुछ अनुक्रमों को इंगित करते हैं। इसलिए, सार्वभौमिक चरित्र नाम ऑक्टल और हेक्स एस्केप सीक्वेंस के पूरक हैं; जबकि ऑक्टल और हेक्स एस्केप अनुक्रम कोड इकाइयों का प्रतिनिधित्व करते हैं, सार्वभौमिक वर्ण नाम कोड बिंदुओं का प्रतिनिधित्व करते हैं, जिन्हें तार्किक वर्णों के रूप में माना जा सकता है।
यह भी देखें
- एस्केप का क्रम
- डिग्राफ (कंप्यूटिंग)
संदर्भ
- ↑ 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.
- ↑ "6.35 The Character <ESC> in Constants". GCC 4.8.2 Manual. Archived from the original on 2019-05-12. Retrieved 2014-03-08.
अग्रिम पठन
- ISO/IEC 9899:1999, Programming languages — C
- Kernighan, Brian W.; Ritchie, Dennis M. (2003) [1988]. The C Programming Language (2 ed.). Prentice Hall. ISBN 978-0-13308621-8.
- Lafore, Robert (2001). Object-Oriented Programming in Turbo C++ (1 ed.). Galgotia Publications. ISBN 978-8-18562322-1.