स्कैनफ़ प्रारूप स्ट्रिंग: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 1: Line 1:
{{Short description|Control parameter used in programming languages}}
{{Short description|Control parameter used in programming languages}}
एक स्कैनएफ प्रारूप स्ट्रिंग (''स्कैन एफ''ऑर्मेटेड) एक इनपुट [[स्ट्रिंग (कंप्यूटर विज्ञान)]] के लेआउट को निर्दिष्ट करने के लिए विभिन्न [[फ़ंक्शन (कंप्यूटर विज्ञान)]] में उपयोग किया जाने वाला एक नियंत्रण पैरामीटर है। फ़ंक्शंस तब स्ट्रिंग को विभाजित कर सकते हैं और उचित [[डेटा प्रकार]]ों के मानों में अनुवाद कर सकते हैं। स्ट्रिंग स्कैनिंग फ़ंक्शंस अक्सर मानक [[ पुस्तकालय (कंप्यूटिंग) |पुस्तकालय (कंप्यूटिंग)]] में प्रदान किए जाते हैं। स्कैनफ़ एक फ़ंक्शन है जो मानक इनपुट स्ट्रिंग से स्वरूपित डेटा को पढ़ता है, जो आमतौर पर कीबोर्ड होता है और जब भी निर्दिष्ट तर्कों में बुलाया जाता है तो परिणाम लिखता है।
एक '''स्कैनएफ फॉर्मेट स्ट्रिंग''' (''स्कैन एफ''ऑर्मेटेड) एक इनपुट [[स्ट्रिंग (कंप्यूटर विज्ञान)|स्ट्रिंग]] के लेआउट को निर्दिष्ट करने के लिए विभिन्न [[फ़ंक्शन (कंप्यूटर विज्ञान)|फ़ंक्शन]] में उपयोग किया जाने वाला एक कण्ट्रोल पैरामीटर होता है। फ़ंक्शंस तब स्ट्रिंग को विभाजित कर सकते हैं और उचित [[डेटा प्रकार]] के वैल्यू में अनुवाद कर सकते हैं। स्ट्रिंग स्कैनिंग फ़ंक्शंस अधिकांशतः स्टैण्डर्ड [[ पुस्तकालय (कंप्यूटिंग) |लाइब्रेरीज]] में प्रदान किए जाते हैं। स्कैनफ़ एक फ़ंक्शन होता है जो स्टैण्डर्ड इनपुट स्ट्रिंग से स्वरूपित डेटा को रीड है, जो सावैल्यू ्यतः कीबोर्ड होता है और जब भी स्पेसीफाईड आर्गुमेंट्स में बुलाया जाता है तो यह परिणाम लिखता है।


स्कैनएफ शब्द सी मानक लाइब्रेरी से आया है, जिसने इस प्रकार के फ़ंक्शन को लोकप्रिय बनाया, लेकिन ऐसे फ़ंक्शन सी से पहले के हैं, और अन्य नामों का उपयोग किया जाता है, जैसे <code>readf</code> [[ALGOL 68]] में। स्कैनफ प्रारूप स्ट्रिंग्स, जो स्वरूपित इनपुट ([[ पदच्छेद ]]) प्रदान करते हैं, [[प्रिंटफ प्रारूप स्ट्रिंग]]्स के पूरक हैं, जो स्वरूपित आउटपुट ([[टेम्पलेटिंग भाषा]]) प्रदान करते हैं। ये अधिक परिष्कृत और लचीले पार्सर या टेम्पलेट इंजन की तुलना में सरल कार्यक्षमता और निश्चित प्रारूप प्रदान करते हैं, लेकिन कई उद्देश्यों के लिए पर्याप्त हैं।
स्कैनएफ शब्द सी स्टैण्डर्ड लाइब्रेरी से आया है, जिसने इस प्रकार के फ़ंक्शन को लोकप्रिय बनाया, परन्तु ऐसे फ़ंक्शन C से पहले के होते हैं, और अन्य नामों का उपयोग किया जाता है, जैसे <code>रीडएफ</code> का [[ALGOL 68]] में किया जाता है। स्कैनफ फॉर्मेट स्ट्रिंग्स, जो स्वरूपित इनपुट ([[ पदच्छेद | प्रेसिंग]] ) प्रदान करते हैं, [[प्रिंटफ प्रारूप स्ट्रिंग|प्रिंटएफ फॉर्मेट स्ट्रिंग]] के कॉम्प्लीमेंट होते हैं, जो स्वरूपित आउटपुट ([[टेम्पलेटिंग भाषा]]) प्रदान करते हैं। ये अधिक सोफिस्टिकेटेड और फ्लेक्सिबल पार्सर या टेम्पलेट इंजन की तुलना में सरल कार्यक्षमता और निश्चित फॉर्मेट प्रदान करते हैं, परन्तु कई उद्देश्यों के लिए पर्याप्त होते हैं।


==इतिहास==
==इतिहास==
[[माइक लेस्क]] की stdio.h|पोर्टेबल इनपुट/आउटपुट लाइब्रेरी, सहित <code>scanf</code>, [[संस्करण 7 यूनिक्स]] में आधिकारिक तौर पर यूनिक्स का हिस्सा बन गया।<ref name="reader">{{cite tech report |first1=M. D. |last1=McIlroy |authorlink1=Doug McIlroy |year=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |series=CSTR |number=139 |institution=Bell Labs}}</ref>
[[माइक लेस्क]] की पोर्टेबल इनपुट/आउटपुट लाइब्रेरी, <code>स्कैनफ़</code>सहित, आधिकारिक तौर पर [[संस्करण 7 यूनिक्स]] में यूनिक्स का भाग बन गया।<ref name="reader">{{cite tech report |first1=M. D. |last1=McIlroy |authorlink1=Doug McIlroy |year=1987 |url=http://www.cs.dartmouth.edu/~doug/reader.pdf |title=A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 |series=CSTR |number=139 |institution=Bell Labs}}</ref>


== उपयोग ==
<code>स्कैनफ़</code> फ़ंक्शन, जो [[सी प्रोग्रामिंग भाषा]] में पाया जाता है, [[मानक इनपुट|स्टैण्डर्ड इनपुट]] (अधिकांशतः एक [[कमांड लाइन इंटरफेस]] या सवैल्यू प्रकार का [[टेक्स्ट यूजर इंटरफ़ेस]]) से नंबरओं और अन्य [[ डेटा प्रकार |डेटा प्रकार]] के लिए इनपुट रीड करता है।


==उपयोग== <code>scanf</code> ई> फ़ंक्शन, जो [[सी प्रोग्रामिंग भाषा]] में पाया जाता है, [[मानक इनपुट]] (अक्सर एक [[कमांड लाइन इंटरफेस]] या समान प्रकार का [[टेक्स्ट यूजर इंटरफ़ेस]]) से संख्याओं और अन्य [[ डेटा प्रकार |डेटा प्रकार]] के लिए इनपुट पढ़ता है।
निम्नलिखित सी कोड स्टैण्डर्ड इनपुट स्ट्रीम से अस्वरूपित डेसीमल [[पूर्णांक|पूर्णांकों]] की एक चर नंबर को रीड करता है और उनमें से प्रत्येक को भिन्न-भिन्न पंक्तियों में प्रिंट करता है:
 
निम्नलिखित सी कोड मानक इनपुट स्ट्रीम से अस्वरूपित दशमलव [[पूर्णांक]]ों की एक चर संख्या को पढ़ता है और उनमें से प्रत्येक को अलग-अलग पंक्तियों में प्रिंट करता है:


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Line 24: Line 24:
}
}
</syntaxhighlight>
</syntaxhighlight>
उपरोक्त प्रोग्राम द्वारा संसाधित होने के बाद, पूर्णांकों की एक अनियमित स्थान वाली सूची जैसे
उपरोक्त प्रोग्राम द्वारा संसाधित होने के पश्चात्, पूर्णांकों की एक अनियमित स्पेस वाली लिस्ट जैसे


  456 123 789 456 12
  456 123 789 456 12
  456 1
  456 1
    2378
  2378


लगातार अंतराल पर इस प्रकार दिखाई देगा:
कांस्टेंट स्पेस पर इस प्रकार दिखाई देगा:
  456
  456
  123
  123
Line 54: Line 54:
}
}
</syntaxhighlight>
</syntaxhighlight>
इससे कोई फर्क नहीं पड़ता कि प्रोग्रामर किस डेटा प्रकार को पढ़ना चाहता है, तर्क (जैसे <code>&n</code> ऊपर) मेमोरी की ओर इंगित करने वाला [[ सूचक (कंप्यूटर प्रोग्रामिंग) |सूचक (कंप्यूटर प्रोग्रामिंग)]] होना चाहिए। अन्यथा, फ़ंक्शन सही ढंग से प्रदर्शन नहीं करेगा क्योंकि यह उस वेरिएबल के मेमोरी स्थान को इंगित करने के बजाय मेमोरी के गलत अनुभागों को ओवरराइट करने का प्रयास करेगा जिसके लिए आप इनपुट प्राप्त करने का प्रयास कर रहे हैं।
इससे कोई अंतर नहीं पड़ता कि प्रोग्रामर किस डेटा प्रकार को रीड करना चाहता है, आर्गुमेंट (जैसे <code>&n</code> ऊपर) मेमोरी की ओर पॉइंट करने वाला [[ सूचक (कंप्यूटर प्रोग्रामिंग) |पॉइंटर]] होना चाहिए। अन्यथा, फ़ंक्शन सही विधि से प्रदर्शन नहीं करेगा क्योंकि यह उस वेरिएबल के मेमोरी स्पेस को पॉइंट करने के अतिरिक्त मेमोरी के गलत अनुभागों को ओवरराइट करने का प्रयास करेगा जिसके लिए आप इनपुट प्राप्त करने का प्रयास कर रहे हैं।


अंतिम उदाहरण में ऑपरेटर का पता (<code>&</code>) का उपयोग तर्क के लिए नहीं किया जाता है: जैसा <code>word</code> की एक सारणी डेटा संरचना का नाम है <code>char</code>, इस प्रकार यह (सभी संदर्भों में जिसमें यह किसी पते का मूल्यांकन करता है) सरणी के पहले तत्व के सूचक के बराबर है। जबकि अभिव्यक्ति <code>&word</code> संख्यात्मक रूप से समान मूल्य पर मूल्यांकन करेगा, शब्दार्थ की दृष्टि से, इसका एक बिल्कुल अलग अर्थ है कि यह इसके एक तत्व के बजाय पूरे सरणी के पते को दर्शाता है। नियुक्ति करते समय इस तथ्य को ध्यान में रखा जाना चाहिए <code>scanf</code> स्ट्रिंग्स के लिए आउटपुट।
अंतिम उदाहरण में एड्रेस-ऑफ ऑपरेटर (<code>&</code>) का उपयोग आर्गुमेंट के लिए नहीं किया जाता है: जैसा<code>वर्ड</code> की चूंकि शब्द <code>char</code> एक सारणी डेटा संरचना का नाम है , इस प्रकार यह (सभी संदर्भों में जिसमें यह किसी एड्रेस का मूल्यांकन करता है) ऐरे के पहले तत्व के पॉइंटर के सवैल्यू होता है। जबकि अभिव्यक्ति <code>&word</code> नंबरत्मक रूप से सवैल्यू मूल्य पर मूल्यांकन करेगा, शब्दार्थ की दृष्टि से, इसका एक बिल्कुल अलग अर्थ है कि यह इसके एक तत्व के अतिरिक्त पूरे ऐरे के पते को प्रदर्शित करता है। <code>स्कैनफ़</code> स्ट्रिंग्स के लिए आउटपुट नियुक्ति करते समय इस तथ्य को ध्यान में रखा जाना चाहिए


जैसा <code>scanf</code> केवल मानक इनपुट से पढ़ने के लिए निर्दिष्ट किया गया है, [[इंटरफ़ेस (कंप्यूटर विज्ञान)]] वाली कई प्रोग्रामिंग भाषाओं, जैसे [[PHP]], में डेरिवेटिव होते हैं जैसे <code>sscanf</code> और <code>fscanf</code> लेकिन नहीं <code>scanf</code> अपने आप।
चूँकि <code>स्कैनफ़</code> को मात्र स्टैण्डर्ड इनपुट से पढ़ने के लिए निर्दिष्ट किया गया है, [[इंटरफ़ेस (कंप्यूटर विज्ञान)|इंटरफ़ेस]] वाली कई प्रोग्रामिंग भाषाओं, जैसे [[PHP]], <code>एसस्कैनफ़</code> और <code>एफस्कैनफ़ जैसे</code> डेरिवेटिव होते हैं ,परन्तु स्वयं <code>स्कैनफ़</code> नही होता है।


==प्रारूप स्ट्रिंग विनिर्देश==
==फॉर्मेट स्ट्रिंग विनिर्देश==
फ़ॉर्मेटिंग [[प्लेसहोल्डर (कंप्यूटिंग)]] अंदर है <code>scanf</code> कमोबेश प्रिंटफ| के समान ही हैं<code>printf</code>, इसका उल्टा कार्य। प्रिंटफ की तरह, POSIX एक्सटेंशन {{code|n$}} परिभाषित किया गया।<ref name=linux/>
<code>स्कैनफ़</code>में फ़ॉर्मेटिंग [[प्लेसहोल्डर (कंप्यूटिंग)|प्लेसहोल्डर]] निम् और अधिक<code>प्रिंटएफ</code>के सवैल्यू ही होता हैं, यह एक रिवर्स फ़ंक्शन होता है। प्रिंटएफ की तरह, POSIX एक्सटेंशन {{code|n$}} को परिभाषित किया गया है।<ref name="linux" />


प्रारूप स्ट्रिंग में शायद ही कभी स्थिरांक होते हैं (यानी, वर्ण जो प्लेसहोल्डर (कंप्यूटिंग) को स्वरूपित नहीं कर रहे हैं), मुख्यतः क्योंकि एक प्रोग्राम आमतौर पर ज्ञात डेटा को पढ़ने के लिए डिज़ाइन नहीं किया गया है, हालांकि <code>scanf</code> यदि स्पष्ट रूप से निर्दिष्ट किया गया है तो इन्हें स्वीकार करता है। अपवाद एक या अधिक [[व्हाइटस्पेस (कंप्यूटर विज्ञान)]] वर्ण है, जो इनपुट में सभी व्हाइटस्पेस वर्णों को हटा देता है।<ref name=linux/>
फॉर्मेट स्ट्रिंग में संभाव्यता ही कभी कांस्टेंट होते हैं (अर्थात, करैक्टर जो प्लेसहोल्डर को स्वरूपित नहीं कर रहे हैं), मुख्यतः क्योंकि एक प्रोग्राम सामान्यतः ज्ञात डेटा को पढ़ने के लिए डिज़ाइन नहीं किया जाता है, यघपि <code>स्कैनफ़</code> यदि स्पष्ट रूप से निर्दिष्ट किया गया है तो इन्हें स्वीकार करता है। अपवाद एक या अधिक [[व्हाइटस्पेस (कंप्यूटर विज्ञान)|व्हाइटस्पेस]] कैरेक्टर होते है, जो इनपुट में सभी व्हाइटस्पेस कैरेक्टर को हटा देता है।<ref name="linux" />


सबसे अधिक उपयोग किए जाने वाले कुछ प्लेसहोल्डर इस प्रकार हैं:
सबसे अधिक उपयोग किए जाने वाले कुछ प्लेसहोल्डर इस प्रकार हैं:
* <code>%a</code> : एक फ़्लोटिंग-पॉइंट नंबर को उसके हेक्साडेसिमल नोटेशन में स्कैन करें।
* <code>%a</code> : एक फ़्लोटिंग-पॉइंट नंबर को उसके हेक्साडेसिमल नोटेशन में स्कैन करें।
* <code>%d</code> : एक पूर्णांक को हस्ताक्षरित [[दशमलव]] संख्या के रूप में स्कैन करें।
* <code>%d</code> : एक पूर्णांक को साइंड [[दशमलव|डेसीमल]] नंबर के रूप में स्कैन करें।
* <code>%i</code> : एक पूर्णांक को हस्ताक्षरित संख्या के रूप में स्कैन करें। के समान <code>%d</code>, लेकिन पहले आने पर संख्या को [[हेक्साडेसिमल]] के रूप में व्याख्या करता है <code>0x</code> और अष्टक जब से पहले <code>0</code>. उदाहरण के लिए, स्ट्रिंग <code>031</code> का उपयोग करके 31 के रूप में पढ़ा जाएगा <code>%d</code>, और 25 का उपयोग कर रहे हैं <code>%i</code>. झंडा <code>h</code> में <code>%hi</code> में रूपांतरण को इंगित करता है <code>short</code> और <code>hh</code> ए में रूपांतरण <code>char</code>.
* <code>%i</code> : एक पूर्णांक को साइंड नंबर के रूप में स्कैन करें। <code>%d</code> के सवैल्यू परन्तु, <code>0x</code> से पहले आने पर नंबर को [[हेक्साडेसिमल]] और <code>0</code> से पहले होने पर ऑक्टल के रूप में व्याख्या करता है। उदाहरण के लिए, स्ट्रिंग <code>031</code> को <code>%d</code> का उपयोग करके 31 और <code>%i</code> का उपयोग करके 25 रके ूप में पढ़ा जाएगा। <code>%hi</code> में फ्लैग <code>h</code> में कन्वर्शन और <code>hh</code> एक <code>char</code> में कन्वर्शन को पॉइंट करता है।
* <code>%u</code> : दशमलव के लिए स्कैन करें <code>unsigned int</code> (ध्यान दें कि C99 मानक में इनपुट मान ऋण चिह्न वैकल्पिक है, इसलिए यदि ऋण चिह्न पढ़ा जाता है, तो कोई त्रुटि उत्पन्न नहीं होगी और परिणाम एक ऋणात्मक संख्या का पूरक होगा, संभवतः एक बहुत बड़ा मान। देखें <code>[[strtoul]]()</code>.{{Failed verification|date=January 2011}}) तदनुसार, <code>%hu</code> एक के लिए स्कैन करता है <code>unsigned short</code> और <code>%hhu</code> एक के लिए <code>unsigned char</code>.
*<code>%u</code> : डेसीमल <code>अनसाइंड इंट</code> के लिए स्कैन करें(ध्यान दें कि C99 स्टैण्डर्ड में इनपुट वैल्यू नेगेटिव साइन वैकल्पिक होते है, इसलिए यदि नेगेटिव साइन पढ़ा जाता है, तो कोई एरर उत्पन्न नहीं होगी और परिणाम एक नेगेटिव नंबर का कॉम्प्लीमेंट होगा, संभवतः यह एक बहुत बड़ा वैल्यू होती है। देखें <code>[[strtoul]]()</code> तदनुसार, <code>%hu</code> एक <code>अनसाइंड शोर्ट</code> के लिए स्कैन करता है और <code>%hhu</code> एक <code>अनसाइंड चार</code> के लिए स्कैन करता है।
* <code>%f</code> : एक [[तैरनेवाला स्थल]] नंबर को सामान्य (फ़िक्स्ड-पॉइंट अंकगणित|फ़िक्स्ड-पॉइंट) नोटेशन में स्कैन करें।
* <code>%f</code> : एक [[तैरनेवाला स्थल|फ्लोटिंग पॉइंट]] नंबर को (फ़िक्स्ड-पॉइंट) नोटेशन में स्कैन करें।
* <code>%g</code>, <code>%G</code> : किसी फ़्लोटिंग-पॉइंट संख्या को सामान्य या घातांकीय नोटेशन में स्कैन करें। <code>%g</code> छोटे अक्षरों का उपयोग करता है और <code>%G</code> अपरकेस का उपयोग करता है.
* <code>%g</code>, <code>%G</code> : किसी फ़्लोटिंग-पॉइंट नंबर को नार्मल या एक्सपोनेंशियल नोटेशन में स्कैन करें। <code>%g</code> लोअर-केस का उपयोग करता है और <code>%G</code> अपर-केस का उपयोग करता है.
* <code>%x</code>, <code>%X</code> : एक पूर्णांक को अहस्ताक्षरित हेक्साडेसिमल संख्या के रूप में स्कैन करें।
* <code>%x</code>, <code>%X</code> : एक पूर्णांक को असाइंड हेक्साडेसिमल नंबर के रूप में स्कैन करें।
* <code>%o</code> : एक पूर्णांक को अष्टक संख्या के रूप में स्कैन करें।
* <code>%o</code> : एक पूर्णांक को ऑक्टल नंबर के रूप में स्कैन करें।
* <code>%s</code> : एक [[ वर्ण स्ट्रिंग |वर्ण स्ट्रिंग]] को स्कैन करें. स्कैन व्हाइटस्पेस (कंप्यूटर विज्ञान) पर समाप्त होता है। स्ट्रिंग के अंत में एक [[शून्य वर्ण]] संग्रहीत होता है, जिसका अर्थ है कि आपूर्ति किया गया बफ़र निर्दिष्ट इनपुट लंबाई से कम से कम एक वर्ण लंबा होना चाहिए।
* <code>%s</code> : एक [[ वर्ण स्ट्रिंग |करैक्टर स्ट्रिंग]] को स्कैन करें। स्कैन व्हाइटस्पेस पर टर्मिनेट होता है। स्ट्रिंग के अंत में एक [[शून्य वर्ण|नल करैक्टर]] स्टोर होता है, जिसका अर्थ है कि आपूर्ति किया गया बफ़र निर्दिष्ट इनपुट लेंग्थ से कम से कम एक करैक्टर लेंग्थ होना चाहिए।
* <code>%c</code> : एक अक्षर (चार) को स्कैन करें। कोई शून्य वर्ण नहीं जोड़ा गया है.
* <code>%c</code> : एक करैक्टर (चार) को स्कैन करें। कोई जीरो करैक्टर नहीं जोड़ा गया है।
* व्हाइटस्पेस (कंप्यूटर विज्ञान): कोई भी व्हाइटस्पेस वर्ण शून्य या अधिक व्हाइटस्पेस (कंप्यूटर विज्ञान) वर्णों के लिए स्कैन ट्रिगर करता है। रिक्त स्थान वर्णों की संख्या और प्रकार का किसी भी दिशा में मिलान करने की आवश्यकता नहीं है।
* व्हाइटस्पेस: कोई भी व्हाइटस्पेस करैक्टर जीरो या अधिक व्हाइटस्पेस करैक्टरों के लिए स्कैन ट्रिगर करता है। रिक्त स्पेस करैक्टरों की नंबर और प्रकार का किसी भी दिशा में मिलान करने की आवश्यकता नहीं होती है।
* <code>%lf</code> [[दोहरा परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप]] प्रारूप फ़्लोटिंग-पॉइंट नंबर के रूप में स्कैन करें। लंबे विनिर्देशक के साथ फ़्लोट प्रारूप।
* <code>%lf:</code> [[दोहरा परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप|डबल फ़्लोटिंग-पॉइंट नंबर]] रूप में स्कैन करें। "लॉन्ग" स्पेसिफायर के साथ "फ़्लोट" फॉर्मेट।
* <code>%Lf</code> : एक लंबे डबल फ़्लोटिंग-पॉइंट नंबर के रूप में स्कैन करें। लंबे लंबे विनिर्देशक को फ़्लोट करें।
* <code>%Lf</code> : एक लॉन्ग डबल फ़्लोटिंग-पॉइंट नंबर के रूप में स्कैन करें। "लॉन्ग लॉन्ग" स्पेसिफायर को "फ़्लोट" करें।
* <code>%n</code> : कुछ भी अपेक्षित नहीं है. इनपुट से अब तक उपभोग किए गए वर्णों की संख्या अगले पॉइंटर के माध्यम से संग्रहीत की जाती है, जो कि int का पॉइंटर होना चाहिए। यह रूपांतरण नहीं है और फ़ंक्शन द्वारा लौटाई गई संख्या में वृद्धि नहीं करता है।
* <code>%n</code> : कुछ भी अपेक्षित नहीं है। इनपुट से अब तक कंज्यूम किए गए करैक्टरों की नंबर अगले पॉइंटर के माध्यम से स्टोर की जाती है, जो कि इंट का पॉइंटर होना चाहिए। यह कन्वर्शन नहीं है और फ़ंक्शन द्वारा रिटर्न गई नंबर में वृद्धि नहीं करता है।
 
उपरोक्त का उपयोग नंबर मॉडिफ़ायर और<code>l</code> , <code>L</code> मॉडिफ़ायर के साथ संयोजन में किया जा सकता है जो प्रतिशत साइन और करैक्टर के मध्य में "लॉन्ग" और "लॉन्ग लॉन्ग" तक स्टैंड रहते हैं। प्रतिशत साइन और उससे पहले के करैक्टरों के मध्य नंबर वैल्यू भी हो सकते हैं, यदि कोई <code>लॉन्ग</code> मॉडिफ़ायर से पहले हो, जो स्कैन किए जाने वाले करैक्टरों की नंबर निर्दिष्ट करता है। एक वैकल्पिक [[तारांकन|एस्टरिस्क]] (<code>*</code>) प्रतिशत साइन के ठीक पश्चात् यह प्रदर्शित करता है कि इस फॉर्मेट स्पेसिफायर द्वारा रीड किया गया डेटाम एक करैक्टर में स्टोर नहीं किया जाता है। इस गिराए गए चर के लिए फॉर्मेट स्ट्रिंग के पीछे कोई आर्गुमेंट सम्मलित नहीं किया जाना चाहिए।


प्रिंटफ में <code>एफएफ</code> मॉडिफ़ायर स्कैनएफ में उपस्थिति नहीं होती है, जिससे इनपुट और आउटपुट के मोड के मध्य अंतर पैदा होता है। <code>ll</code> और <code>hh</code> मॉडिफ़ायर C90 स्टैण्डर्ड में उपस्थति नहीं होता हैं, परन्तु C99 स्टैण्डर्ड में उपस्थति होता हैं।<ref>C99 standard, §7.19.6.2 "The fscanf function" alinea 11.</ref>


उपरोक्त का उपयोग संख्यात्मक संशोधक और के साथ संयोजन में किया जा सकता है <code>l</code>, <code>L</code> संशोधक जो प्रतिशत चिह्न और अक्षर के बीच में लंबे समय तक खड़े रहते हैं। प्रतिशत चिह्न और उससे पहले के अक्षरों के बीच संख्यात्मक मान भी हो सकते हैं <code>long</code> संशोधक यदि कोई हो, जो स्कैन किए जाने वाले वर्णों की संख्या निर्दिष्ट करता है। एक वैकल्पिक [[तारांकन]] (<code>*</code>) प्रतिशत प्रतीक के ठीक बाद यह दर्शाता है कि इस प्रारूप विनिर्देशक द्वारा पढ़ा गया डेटाम एक चर में संग्रहीत नहीं किया जाना है। इस गिराए गए चर के लिए प्रारूप स्ट्रिंग के पीछे कोई तर्क शामिल नहीं किया जाना चाहिए। <code>ff</code> ई>प्रिंटफ में संशोधक स्कैनएफ में मौजूद नहीं है, जिससे इनपुट और आउटपुट के मोड के बीच अंतर पैदा होता है। <code>ll</code> ई> और <code>hh</code> संशोधक C90 मानक में मौजूद नहीं हैं, लेकिन C99 मानक में मौजूद हैं।<ref>C99 standard, §7.19.6.2 "The fscanf function" alinea 11.</ref>
फॉर्मेट स्ट्रिंग का एक उदाहरण निम्न प्रकार है
प्रारूप स्ट्रिंग का एक उदाहरण है
:<code>"%7d%s %c%lf"</code>
:<code>"%7d%s %c%lf"</code>
उपरोक्त प्रारूप स्ट्रिंग पहले सात वर्णों को दशमलव पूर्णांक के रूप में स्कैन करती है, फिर शेष को एक स्ट्रिंग के रूप में पढ़ती है जब तक कि कोई स्थान, न्यूलाइन या टैब नहीं मिल जाता है, फिर पहले गैर-व्हाट्सएप वर्ण मिलने तक व्हाइटस्पेस का उपभोग करता है, फिर उस वर्ण का उपभोग करता है, और अंत में शेष वर्णों [[डबल-परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप]] प्रारूप के रूप में स्कैन करता है। इसलिए, एक मजबूत कार्यक्रम को यह जांचना चाहिए कि क्या <code>scanf</code> कॉल सफल हुई और उचित कार्रवाई करें। यदि इनपुट सही प्रारूप में नहीं था, तो गलत डेटा अभी भी इनपुट स्ट्रीम पर रहेगा और नए इनपुट को पढ़ने से पहले उसे हटा दिया जाना चाहिए। एक वैकल्पिक तरीका, जो इससे बचता है, का उपयोग करना है <code>[[fgets]]</code> और फिर पढ़ी गई स्ट्रिंग की जांच करें। अंतिम चरण द्वारा किया जा सकता है <code>[[sscanf]]</code>, उदाहरण के लिए।
उपरोक्त फॉर्मेट स्ट्रिंग पहले सात करैक्टरों को डेसीमल पूर्णांक के रूप में स्कैन करती है, फिर शेष को एक स्ट्रिंग के रूप में रीड करती है जब तक कि कोई स्पेस, न्यूलाइन या टैब नहीं मिल जाता है, फिर पहले नॉन-व्हाइटस्पेस करैक्टर मिलने तक व्हाइटस्पेस का कंज्यूम करता है, फिर उस करैक्टर का कंज्यूम करता है, और अंत में शेष करैक्टरों [[डबल-परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप|डबल-फ़्लोटिंग-पॉइंट फॉर्मेट]] फॉर्मेट के रूप में स्कैन करता है। इसलिए, एक रोबस्ट फंक्शन को यह चेक करना चाहिए कि क्या <code>स्कैनफ़</code> कॉल सफल हुई और उचित एक्शन लें। यदि इनपुट सही फॉर्मेट में नहीं था, तो गलत डेटा अभी भी इनपुट स्ट्रीम पर रहेगा और नए इनपुट को रीड करने से पहले उसे हटा दिया जाना चाहिए। एक वैकल्पिक विधि, जो इससे बचता है, <code>[[fgets|एफगेट्स]]</code> का उपयोग करना है और फिर रीड की गई स्ट्रिंग को चेक करें। अंतिम स्टेप <code>[[sscanf|एसस्कैनएफ]]</code> द्वारा किया जा सकता है, उदाहरण के लिए।


अनेक फ़्लोट प्रकार के वर्णों के मामले में {{tt|a, e, f, g}}, कई कार्यान्वयन अधिकांश को एक ही पार्सर में संक्षिप्त करना चुनते हैं। Microsoft MSVCRT इसके साथ करता है {{tt|e, f, g}},<ref>{{cite web |title=स्कैनफ़ प्रकार फ़ील्ड वर्ण|url=https://docs.microsoft.com/en-us/cpp/c-runtime-library/scanf-type-field-characters?view=vs-2019 |website=docs.microsoft.com }}</ref> जबकि [[glibc]] चारों के साथ ऐसा करता है।<ref name=linux>{{man|3|scanf|Linux}}</ref>
अनेक फ़्लोट प्रकार के करैक्टरों के स्थितियों में {{tt|a, e, f, g}}, कई इम्प्लीमेंटेशन अधिकांश को एक ही पार्सर में कोलाप्स करना चयन करते हैं। माइक्रोसॉफ्ट एमएसवीसीआरटी {{tt|e, f, g}} इसके साथ करता है,<ref>{{cite web |title=स्कैनफ़ प्रकार फ़ील्ड वर्ण|url=https://docs.microsoft.com/en-us/cpp/c-runtime-library/scanf-type-field-characters?view=vs-2019 |website=docs.microsoft.com }}</ref> जबकि [[glibc|जीएलआईबीसी]] चारों के साथ ऐसा करता है।<ref name=linux>{{man|3|scanf|Linux}}</ref>


== कमजोरियाँ ==
== कमजोरियाँ(वल्नेरेबिलिटीज) ==
<code>scanf</code> स्ट्रिंग हमलों को प्रारूपित करने के प्रति संवेदनशील है। यह सुनिश्चित करने के लिए बहुत सावधानी बरतनी चाहिए कि [[प्रारूप स्ट्रिंग आक्रमण]] स्ट्रिंग और सरणी आकार की सीमाएं शामिल हैं। अधिकांश मामलों में उपयोगकर्ता से इनपुट स्ट्रिंग का आकार मनमाना होता है और इसे पहले निर्धारित नहीं किया जा सकता है <code>scanf</code> फ़ंक्शन निष्पादित किया गया है. इस का मतलब है कि <code>%s</code> लंबाई विनिर्देशक के बिना प्लेसहोल्डर स्वाभाविक रूप से असुरक्षित हैं और [[बफ़र ओवरफ़्लो]] के लिए शोषण योग्य हैं। एक अन्य संभावित समस्या डायनामिक फ़ॉर्मेटिंग स्ट्रिंग्स को अनुमति देना है, उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइलों या अन्य उपयोगकर्ता-नियंत्रित फ़ाइलों में संग्रहीत फ़ॉर्मेटिंग स्ट्रिंग्स। इस मामले में स्ट्रिंग आकार की अनुमत इनपुट लंबाई तब तक निर्दिष्ट नहीं की जा सकती जब तक कि फ़ॉर्मेटिंग स्ट्रिंग की पहले से जाँच नहीं की जाती और सीमाएँ लागू नहीं की जातीं। इससे संबंधित अतिरिक्त या बेमेल फ़ॉर्मेटिंग प्लेसहोल्डर हैं जो वास्तविक Varargs.h सूची से मेल नहीं खाते हैं। Varargs.hs के विशेष कार्यान्वयन के आधार पर, इन प्लेसहोल्डर्स को आंशिक रूप से स्टैक से निकाला जा सकता है या इसमें अवांछनीय या यहां तक ​​कि असुरक्षित पॉइंटर्स भी हो सकते हैं।
<code>स्कैनफ़</code> स्ट्रिंग अटैक को फॉर्मेट करने के प्रति संवेदनशील होता है। यह सुनिश्चित करने के लिए बहुत सावधानी बरतनी चाहिए कि [[प्रारूप स्ट्रिंग आक्रमण|फॉर्मेट स्ट्रिंग अटैक]] स्ट्रिंग और ऐरे आकार की लिमिटेशन सम्मिलित होती हैं। अधिकांश स्थितियों में उपयोगकर्ता से इनपुट स्ट्रिंग का आकार आरबिटरेरी होता है और इसे पहले निर्धारित नहीं किया जा सकता है <code>स्कैनफ़</code> फ़ंक्शन निष्पादित किया गया है। इस का अर्थ है कि <code>%s</code> लेंग्थई स्पेसीफायर्स के बिना प्लेसहोल्डर स्वाभाविक रूप से असुरक्षित होते हैं और [[बफ़र ओवरफ़्लो]] के लिए एक्सप्लॉइट होते हैं। एक अन्य संभावित समस्या डायनामिक फ़ॉर्मेटिंग स्ट्रिंग्स को अनुमति देना है, उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइलों या अन्य यूजर-कंट्रोल्ड फ़ाइलों में स्टोर्ड फ़ॉर्मेटिंग स्ट्रिंग्स। इस स्थिति में स्ट्रिंग आकार की अनुमत इनपुट लेंग्थई तब तक निर्दिष्ट नहीं की जा सकती जब तक कि फ़ॉर्मेटिंग स्ट्रिंग की पहले से जाँच नहीं की जाती और सीमाएँ प्रयुक्त नहीं की जातीं है। इससे संबंधित अतिरिक्त या बेमेल फ़ॉर्मेटिंग प्लेसहोल्डर होता हैं जो वास्तविक वैरार्ग लिस्ट से मैच नही होता हैं। वैरार्ग के विशेष इम्प्लीमेंटेशन के आधार पर, इन प्लेसहोल्डर्स को आंशिक रूप से स्टैक से निकाला जा सकता है या इसमें अनडिजायरेबल या यहां तक ​​कि इनसिक्योर पॉइंटर्स भी हो सकते हैं।


==यह भी देखें==
==यह भी देखें==


* सी प्रोग्रामिंग भाषा
* सी प्रोग्रामिंग भाषा
* स्ट्रिंग आक्रमण को प्रारूपित करें
* स्ट्रिंग अटैक को फॉर्मेट करें
* प्रिंटफ़ प्रारूप स्ट्रिंग
* प्रिंटफ़ फॉर्मेट स्ट्रिंग
* [[ स्ट्रिंग प्रक्षेप ]]
* [[ स्ट्रिंग प्रक्षेप | स्ट्रिंग इंटरपोलेशन]]


==संदर्भ==
==संदर्भ==
Line 105: Line 107:
==बाहरी संबंध==
==बाहरी संबंध==
*{{man|sh|scanf|SUS}}
*{{man|sh|scanf|SUS}}
* [http://en.cppreference.com/w/cpp/io/c/scanf C++ reference for <code>std::scanf</code>]
* [http://en.cppreference.com/w/cpp/io/c/scanf C++ reference for <code>std::स्कैनफ़</code>]


{{CProLang}}
{{CProLang}}

Revision as of 01:29, 4 August 2023

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

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

इतिहास

माइक लेस्क की पोर्टेबल इनपुट/आउटपुट लाइब्रेरी, स्कैनफ़सहित, आधिकारिक तौर पर संस्करण 7 यूनिक्स में यूनिक्स का भाग बन गया।[1]

उपयोग

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

निम्नलिखित सी कोड स्टैण्डर्ड इनपुट स्ट्रीम से अस्वरूपित डेसीमल पूर्णांकों की एक चर नंबर को रीड करता है और उनमें से प्रत्येक को भिन्न-भिन्न पंक्तियों में प्रिंट करता है:

#include <stdio.h>

int main(void)
{
    int n;

    while (scanf("%d", &n) == 1)
        printf("%d\n", n);
    return 0;
}

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

456 123 789 456 12
456 1
  2378

कांस्टेंट स्पेस पर इस प्रकार दिखाई देगा:

456
123
789
456
12
456
1
2378

किसी शब्द का प्रिंट आउट लेने के लिए:

#include <stdio.h>

int main(void)
{
    char word[20];

    if (scanf("%19s", word) == 1)
        puts(word);
    return 0;
}

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

अंतिम उदाहरण में एड्रेस-ऑफ ऑपरेटर (&) का उपयोग आर्गुमेंट के लिए नहीं किया जाता है: जैसावर्ड की चूंकि शब्द char एक सारणी डेटा संरचना का नाम है , इस प्रकार यह (सभी संदर्भों में जिसमें यह किसी एड्रेस का मूल्यांकन करता है) ऐरे के पहले तत्व के पॉइंटर के सवैल्यू होता है। जबकि अभिव्यक्ति &word नंबरत्मक रूप से सवैल्यू मूल्य पर मूल्यांकन करेगा, शब्दार्थ की दृष्टि से, इसका एक बिल्कुल अलग अर्थ है कि यह इसके एक तत्व के अतिरिक्त पूरे ऐरे के पते को प्रदर्शित करता है। स्कैनफ़ स्ट्रिंग्स के लिए आउटपुट नियुक्ति करते समय इस तथ्य को ध्यान में रखा जाना चाहिए ।

चूँकि स्कैनफ़ को मात्र स्टैण्डर्ड इनपुट से पढ़ने के लिए निर्दिष्ट किया गया है, इंटरफ़ेस वाली कई प्रोग्रामिंग भाषाओं, जैसे PHP, एसस्कैनफ़ और एफस्कैनफ़ जैसे डेरिवेटिव होते हैं ,परन्तु स्वयं स्कैनफ़ नही होता है।

फॉर्मेट स्ट्रिंग विनिर्देश

स्कैनफ़में फ़ॉर्मेटिंग प्लेसहोल्डर निम् और अधिकप्रिंटएफके सवैल्यू ही होता हैं, यह एक रिवर्स फ़ंक्शन होता है। प्रिंटएफ की तरह, POSIX एक्सटेंशन n$ को परिभाषित किया गया है।[2]

फॉर्मेट स्ट्रिंग में संभाव्यता ही कभी कांस्टेंट होते हैं (अर्थात, करैक्टर जो प्लेसहोल्डर को स्वरूपित नहीं कर रहे हैं), मुख्यतः क्योंकि एक प्रोग्राम सामान्यतः ज्ञात डेटा को पढ़ने के लिए डिज़ाइन नहीं किया जाता है, यघपि स्कैनफ़ यदि स्पष्ट रूप से निर्दिष्ट किया गया है तो इन्हें स्वीकार करता है। अपवाद एक या अधिक व्हाइटस्पेस कैरेक्टर होते है, जो इनपुट में सभी व्हाइटस्पेस कैरेक्टर को हटा देता है।[2]

सबसे अधिक उपयोग किए जाने वाले कुछ प्लेसहोल्डर इस प्रकार हैं:

  • %a : एक फ़्लोटिंग-पॉइंट नंबर को उसके हेक्साडेसिमल नोटेशन में स्कैन करें।
  • %d : एक पूर्णांक को साइंड डेसीमल नंबर के रूप में स्कैन करें।
  • %i : एक पूर्णांक को साइंड नंबर के रूप में स्कैन करें। %d के सवैल्यू परन्तु, 0x से पहले आने पर नंबर को हेक्साडेसिमल और 0 से पहले होने पर ऑक्टल के रूप में व्याख्या करता है। उदाहरण के लिए, स्ट्रिंग 031 को %d का उपयोग करके 31 और %i का उपयोग करके 25 रके ूप में पढ़ा जाएगा। %hi में फ्लैग h में कन्वर्शन और hh एक char में कन्वर्शन को पॉइंट करता है।
  • %u : डेसीमल अनसाइंड इंट के लिए स्कैन करें(ध्यान दें कि C99 स्टैण्डर्ड में इनपुट वैल्यू नेगेटिव साइन वैकल्पिक होते है, इसलिए यदि नेगेटिव साइन पढ़ा जाता है, तो कोई एरर उत्पन्न नहीं होगी और परिणाम एक नेगेटिव नंबर का कॉम्प्लीमेंट होगा, संभवतः यह एक बहुत बड़ा वैल्यू होती है। देखें strtoul() तदनुसार, %hu एक अनसाइंड शोर्ट के लिए स्कैन करता है और %hhu एक अनसाइंड चार के लिए स्कैन करता है।
  • %f : एक फ्लोटिंग पॉइंट नंबर को (फ़िक्स्ड-पॉइंट) नोटेशन में स्कैन करें।
  • %g, %G : किसी फ़्लोटिंग-पॉइंट नंबर को नार्मल या एक्सपोनेंशियल नोटेशन में स्कैन करें। %g लोअर-केस का उपयोग करता है और %G अपर-केस का उपयोग करता है.
  • %x, %X : एक पूर्णांक को असाइंड हेक्साडेसिमल नंबर के रूप में स्कैन करें।
  • %o : एक पूर्णांक को ऑक्टल नंबर के रूप में स्कैन करें।
  • %s : एक करैक्टर स्ट्रिंग को स्कैन करें। स्कैन व्हाइटस्पेस पर टर्मिनेट होता है। स्ट्रिंग के अंत में एक नल करैक्टर स्टोर होता है, जिसका अर्थ है कि आपूर्ति किया गया बफ़र निर्दिष्ट इनपुट लेंग्थ से कम से कम एक करैक्टर लेंग्थ होना चाहिए।
  • %c : एक करैक्टर (चार) को स्कैन करें। कोई जीरो करैक्टर नहीं जोड़ा गया है।
  • व्हाइटस्पेस: कोई भी व्हाइटस्पेस करैक्टर जीरो या अधिक व्हाइटस्पेस करैक्टरों के लिए स्कैन ट्रिगर करता है। रिक्त स्पेस करैक्टरों की नंबर और प्रकार का किसी भी दिशा में मिलान करने की आवश्यकता नहीं होती है।
  • %lf: डबल फ़्लोटिंग-पॉइंट नंबर रूप में स्कैन करें। "लॉन्ग" स्पेसिफायर के साथ "फ़्लोट" फॉर्मेट।
  • %Lf : एक लॉन्ग डबल फ़्लोटिंग-पॉइंट नंबर के रूप में स्कैन करें। "लॉन्ग लॉन्ग" स्पेसिफायर को "फ़्लोट" करें।
  • %n : कुछ भी अपेक्षित नहीं है। इनपुट से अब तक कंज्यूम किए गए करैक्टरों की नंबर अगले पॉइंटर के माध्यम से स्टोर की जाती है, जो कि इंट का पॉइंटर होना चाहिए। यह कन्वर्शन नहीं है और फ़ंक्शन द्वारा रिटर्न गई नंबर में वृद्धि नहीं करता है।

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

प्रिंटफ में एफएफ मॉडिफ़ायर स्कैनएफ में उपस्थिति नहीं होती है, जिससे इनपुट और आउटपुट के मोड के मध्य अंतर पैदा होता है। ll और hh मॉडिफ़ायर C90 स्टैण्डर्ड में उपस्थति नहीं होता हैं, परन्तु C99 स्टैण्डर्ड में उपस्थति होता हैं।[3]

फॉर्मेट स्ट्रिंग का एक उदाहरण निम्न प्रकार है

"%7d%s %c%lf"

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

अनेक फ़्लोट प्रकार के करैक्टरों के स्थितियों में a, e, f, g, कई इम्प्लीमेंटेशन अधिकांश को एक ही पार्सर में कोलाप्स करना चयन करते हैं। माइक्रोसॉफ्ट एमएसवीसीआरटी e, f, g इसके साथ करता है,[4] जबकि जीएलआईबीसी चारों के साथ ऐसा करता है।[2]

कमजोरियाँ(वल्नेरेबिलिटीज)

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

यह भी देखें

संदर्भ

  1. McIlroy, M. D. (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (Technical report). CSTR. Bell Labs. 139.
  2. 2.0 2.1 2.2 scanf(3) – Linux Programmer's Manual – Library Functions
  3. C99 standard, §7.19.6.2 "The fscanf function" alinea 11.
  4. "स्कैनफ़ प्रकार फ़ील्ड वर्ण". docs.microsoft.com.


बाहरी संबंध