स्कैनफ़ प्रारूप स्ट्रिंग
This article needs additional citations for verification. (May 2010) (Learn how and when to remove this template message) |
एक स्कैनएफ प्रारूप स्ट्रिंग (स्कैन एफऑर्मेटेड) एक इनपुट स्ट्रिंग (कंप्यूटर विज्ञान) के लेआउट को निर्दिष्ट करने के लिए विभिन्न फ़ंक्शन (कंप्यूटर विज्ञान) में उपयोग किया जाने वाला एक नियंत्रण पैरामीटर है। फ़ंक्शंस तब स्ट्रिंग को विभाजित कर सकते हैं और उचित डेटा प्रकारों के मानों में अनुवाद कर सकते हैं। स्ट्रिंग स्कैनिंग फ़ंक्शंस अक्सर मानक पुस्तकालय (कंप्यूटिंग) में प्रदान किए जाते हैं। स्कैनफ़ एक फ़ंक्शन है जो मानक इनपुट स्ट्रिंग से स्वरूपित डेटा को पढ़ता है, जो आमतौर पर कीबोर्ड होता है और जब भी निर्दिष्ट तर्कों में बुलाया जाता है तो परिणाम लिखता है।
स्कैनएफ शब्द सी मानक लाइब्रेरी से आया है, जिसने इस प्रकार के फ़ंक्शन को लोकप्रिय बनाया, लेकिन ऐसे फ़ंक्शन सी से पहले के हैं, और अन्य नामों का उपयोग किया जाता है, जैसे readf
ALGOL 68 में। स्कैनफ प्रारूप स्ट्रिंग्स, जो स्वरूपित इनपुट (पदच्छेद ) प्रदान करते हैं, प्रिंटफ प्रारूप स्ट्रिंग्स के पूरक हैं, जो स्वरूपित आउटपुट (टेम्पलेटिंग भाषा) प्रदान करते हैं। ये अधिक परिष्कृत और लचीले पार्सर या टेम्पलेट इंजन की तुलना में सरल कार्यक्षमता और निश्चित प्रारूप प्रदान करते हैं, लेकिन कई उद्देश्यों के लिए पर्याप्त हैं।
इतिहास
माइक लेस्क की stdio.h|पोर्टेबल इनपुट/आउटपुट लाइब्रेरी, सहित scanf
, संस्करण 7 यूनिक्स में आधिकारिक तौर पर यूनिक्स का हिस्सा बन गया।[1]
==उपयोग== scanf
ई> फ़ंक्शन, जो सी प्रोग्रामिंग भाषा में पाया जाता है, मानक इनपुट (अक्सर एक कमांड लाइन इंटरफेस या समान प्रकार का टेक्स्ट यूजर इंटरफ़ेस) से संख्याओं और अन्य डेटा प्रकार के लिए इनपुट पढ़ता है।
निम्नलिखित सी कोड मानक इनपुट स्ट्रीम से अस्वरूपित दशमलव पूर्णांकों की एक चर संख्या को पढ़ता है और उनमें से प्रत्येक को अलग-अलग पंक्तियों में प्रिंट करता है:
#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
ऊपर) मेमोरी की ओर इंगित करने वाला सूचक (कंप्यूटर प्रोग्रामिंग) होना चाहिए। अन्यथा, फ़ंक्शन सही ढंग से प्रदर्शन नहीं करेगा क्योंकि यह उस वेरिएबल के मेमोरी स्थान को इंगित करने के बजाय मेमोरी के गलत अनुभागों को ओवरराइट करने का प्रयास करेगा जिसके लिए आप इनपुट प्राप्त करने का प्रयास कर रहे हैं।
अंतिम उदाहरण में ऑपरेटर का पता (&
) का उपयोग तर्क के लिए नहीं किया जाता है: जैसा word
की एक सारणी डेटा संरचना का नाम है char
, इस प्रकार यह (सभी संदर्भों में जिसमें यह किसी पते का मूल्यांकन करता है) सरणी के पहले तत्व के सूचक के बराबर है। जबकि अभिव्यक्ति &word
संख्यात्मक रूप से समान मूल्य पर मूल्यांकन करेगा, शब्दार्थ की दृष्टि से, इसका एक बिल्कुल अलग अर्थ है कि यह इसके एक तत्व के बजाय पूरे सरणी के पते को दर्शाता है। नियुक्ति करते समय इस तथ्य को ध्यान में रखा जाना चाहिए scanf
स्ट्रिंग्स के लिए आउटपुट।
जैसा scanf
केवल मानक इनपुट से पढ़ने के लिए निर्दिष्ट किया गया है, इंटरफ़ेस (कंप्यूटर विज्ञान) वाली कई प्रोग्रामिंग भाषाओं, जैसे PHP, में डेरिवेटिव होते हैं जैसे sscanf
और fscanf
लेकिन नहीं scanf
अपने आप।
प्रारूप स्ट्रिंग विनिर्देश
फ़ॉर्मेटिंग प्लेसहोल्डर (कंप्यूटिंग) अंदर है scanf
कमोबेश प्रिंटफ| के समान ही हैंprintf
, इसका उल्टा कार्य। प्रिंटफ की तरह, POSIX एक्सटेंशन n$
परिभाषित किया गया।[2]
प्रारूप स्ट्रिंग में शायद ही कभी स्थिरांक होते हैं (यानी, वर्ण जो प्लेसहोल्डर (कंप्यूटिंग) को स्वरूपित नहीं कर रहे हैं), मुख्यतः क्योंकि एक प्रोग्राम आमतौर पर ज्ञात डेटा को पढ़ने के लिए डिज़ाइन नहीं किया गया है, हालांकि scanf
यदि स्पष्ट रूप से निर्दिष्ट किया गया है तो इन्हें स्वीकार करता है। अपवाद एक या अधिक व्हाइटस्पेस (कंप्यूटर विज्ञान) वर्ण है, जो इनपुट में सभी व्हाइटस्पेस वर्णों को हटा देता है।[2]
सबसे अधिक उपयोग किए जाने वाले कुछ प्लेसहोल्डर इस प्रकार हैं:
%a
: एक फ़्लोटिंग-पॉइंट नंबर को उसके हेक्साडेसिमल नोटेशन में स्कैन करें।%d
: एक पूर्णांक को हस्ताक्षरित दशमलव संख्या के रूप में स्कैन करें।%i
: एक पूर्णांक को हस्ताक्षरित संख्या के रूप में स्कैन करें। के समान%d
, लेकिन पहले आने पर संख्या को हेक्साडेसिमल के रूप में व्याख्या करता है0x
और अष्टक जब से पहले0
. उदाहरण के लिए, स्ट्रिंग031
का उपयोग करके 31 के रूप में पढ़ा जाएगा%d
, और 25 का उपयोग कर रहे हैं%i
. झंडाh
में%hi
ए में रूपांतरण को इंगित करता हैshort
औरhh
ए में रूपांतरणchar
.%u
: दशमलव के लिए स्कैन करेंunsigned int
(ध्यान दें कि C99 मानक में इनपुट मान ऋण चिह्न वैकल्पिक है, इसलिए यदि ऋण चिह्न पढ़ा जाता है, तो कोई त्रुटि उत्पन्न नहीं होगी और परिणाम एक ऋणात्मक संख्या का पूरक होगा, संभवतः एक बहुत बड़ा मान। देखेंstrtoul()
.[failed verification]) तदनुसार,%hu
एक के लिए स्कैन करता हैunsigned short
और%hhu
एक के लिएunsigned char
.%f
: एक तैरनेवाला स्थल नंबर को सामान्य (फ़िक्स्ड-पॉइंट अंकगणित|फ़िक्स्ड-पॉइंट) नोटेशन में स्कैन करें।%g
,%G
: किसी फ़्लोटिंग-पॉइंट संख्या को सामान्य या घातांकीय नोटेशन में स्कैन करें।%g
छोटे अक्षरों का उपयोग करता है और%G
अपरकेस का उपयोग करता है.%x
,%X
: एक पूर्णांक को अहस्ताक्षरित हेक्साडेसिमल संख्या के रूप में स्कैन करें।%o
: एक पूर्णांक को अष्टक संख्या के रूप में स्कैन करें।%s
: एक वर्ण स्ट्रिंग को स्कैन करें. स्कैन व्हाइटस्पेस (कंप्यूटर विज्ञान) पर समाप्त होता है। स्ट्रिंग के अंत में एक शून्य वर्ण संग्रहीत होता है, जिसका अर्थ है कि आपूर्ति किया गया बफ़र निर्दिष्ट इनपुट लंबाई से कम से कम एक वर्ण लंबा होना चाहिए।%c
: एक अक्षर (चार) को स्कैन करें। कोई शून्य वर्ण नहीं जोड़ा गया है.- व्हाइटस्पेस (कंप्यूटर विज्ञान): कोई भी व्हाइटस्पेस वर्ण शून्य या अधिक व्हाइटस्पेस (कंप्यूटर विज्ञान) वर्णों के लिए स्कैन ट्रिगर करता है। रिक्त स्थान वर्णों की संख्या और प्रकार का किसी भी दिशा में मिलान करने की आवश्यकता नहीं है।
%lf
दोहरा परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप प्रारूप फ़्लोटिंग-पॉइंट नंबर के रूप में स्कैन करें। लंबे विनिर्देशक के साथ फ़्लोट प्रारूप।%Lf
: एक लंबे डबल फ़्लोटिंग-पॉइंट नंबर के रूप में स्कैन करें। लंबे लंबे विनिर्देशक को फ़्लोट करें।%n
: कुछ भी अपेक्षित नहीं है. इनपुट से अब तक उपभोग किए गए वर्णों की संख्या अगले पॉइंटर के माध्यम से संग्रहीत की जाती है, जो कि int का पॉइंटर होना चाहिए। यह रूपांतरण नहीं है और फ़ंक्शन द्वारा लौटाई गई संख्या में वृद्धि नहीं करता है।
उपरोक्त का उपयोग संख्यात्मक संशोधक और के साथ संयोजन में किया जा सकता है l
, L
संशोधक जो प्रतिशत चिह्न और अक्षर के बीच में लंबे समय तक खड़े रहते हैं। प्रतिशत चिह्न और उससे पहले के अक्षरों के बीच संख्यात्मक मान भी हो सकते हैं long
संशोधक यदि कोई हो, जो स्कैन किए जाने वाले वर्णों की संख्या निर्दिष्ट करता है। एक वैकल्पिक तारांकन (*
) प्रतिशत प्रतीक के ठीक बाद यह दर्शाता है कि इस प्रारूप विनिर्देशक द्वारा पढ़ा गया डेटाम एक चर में संग्रहीत नहीं किया जाना है। इस गिराए गए चर के लिए प्रारूप स्ट्रिंग के पीछे कोई तर्क शामिल नहीं किया जाना चाहिए। ff
ई>प्रिंटफ में संशोधक स्कैनएफ में मौजूद नहीं है, जिससे इनपुट और आउटपुट के मोड के बीच अंतर पैदा होता है। ll
ई> और hh
संशोधक C90 मानक में मौजूद नहीं हैं, लेकिन C99 मानक में मौजूद हैं।[3]
प्रारूप स्ट्रिंग का एक उदाहरण है
"%7d%s %c%lf"
उपरोक्त प्रारूप स्ट्रिंग पहले सात वर्णों को दशमलव पूर्णांक के रूप में स्कैन करती है, फिर शेष को एक स्ट्रिंग के रूप में पढ़ती है जब तक कि कोई स्थान, न्यूलाइन या टैब नहीं मिल जाता है, फिर पहले गैर-व्हाट्सएप वर्ण मिलने तक व्हाइटस्पेस का उपभोग करता है, फिर उस वर्ण का उपभोग करता है, और अंत में शेष वर्णों डबल-परिशुद्धता फ़्लोटिंग-पॉइंट प्रारूप प्रारूप के रूप में स्कैन करता है। इसलिए, एक मजबूत कार्यक्रम को यह जांचना चाहिए कि क्या scanf
कॉल सफल हुई और उचित कार्रवाई करें। यदि इनपुट सही प्रारूप में नहीं था, तो गलत डेटा अभी भी इनपुट स्ट्रीम पर रहेगा और नए इनपुट को पढ़ने से पहले उसे हटा दिया जाना चाहिए। एक वैकल्पिक तरीका, जो इससे बचता है, का उपयोग करना है fgets
और फिर पढ़ी गई स्ट्रिंग की जांच करें। अंतिम चरण द्वारा किया जा सकता है sscanf
, उदाहरण के लिए।
अनेक फ़्लोट प्रकार के वर्णों के मामले में a, e, f, g, कई कार्यान्वयन अधिकांश को एक ही पार्सर में संक्षिप्त करना चुनते हैं। Microsoft MSVCRT इसके साथ करता है e, f, g,[4] जबकि glibc चारों के साथ ऐसा करता है।[2]
कमजोरियाँ
scanf
स्ट्रिंग हमलों को प्रारूपित करने के प्रति संवेदनशील है। यह सुनिश्चित करने के लिए बहुत सावधानी बरतनी चाहिए कि प्रारूप स्ट्रिंग आक्रमण स्ट्रिंग और सरणी आकार की सीमाएं शामिल हैं। अधिकांश मामलों में उपयोगकर्ता से इनपुट स्ट्रिंग का आकार मनमाना होता है और इसे पहले निर्धारित नहीं किया जा सकता है scanf
फ़ंक्शन निष्पादित किया गया है. इस का मतलब है कि %s
लंबाई विनिर्देशक के बिना प्लेसहोल्डर स्वाभाविक रूप से असुरक्षित हैं और बफ़र ओवरफ़्लो के लिए शोषण योग्य हैं। एक अन्य संभावित समस्या डायनामिक फ़ॉर्मेटिंग स्ट्रिंग्स को अनुमति देना है, उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइलों या अन्य उपयोगकर्ता-नियंत्रित फ़ाइलों में संग्रहीत फ़ॉर्मेटिंग स्ट्रिंग्स। इस मामले में स्ट्रिंग आकार की अनुमत इनपुट लंबाई तब तक निर्दिष्ट नहीं की जा सकती जब तक कि फ़ॉर्मेटिंग स्ट्रिंग की पहले से जाँच नहीं की जाती और सीमाएँ लागू नहीं की जातीं। इससे संबंधित अतिरिक्त या बेमेल फ़ॉर्मेटिंग प्लेसहोल्डर हैं जो वास्तविक Varargs.h सूची से मेल नहीं खाते हैं। Varargs.hs के विशेष कार्यान्वयन के आधार पर, इन प्लेसहोल्डर्स को आंशिक रूप से स्टैक से निकाला जा सकता है या इसमें अवांछनीय या यहां तक कि असुरक्षित पॉइंटर्स भी हो सकते हैं।
यह भी देखें
- सी प्रोग्रामिंग भाषा
- स्ट्रिंग आक्रमण को प्रारूपित करें
- प्रिंटफ़ प्रारूप स्ट्रिंग
- स्ट्रिंग प्रक्षेप
संदर्भ
- ↑ 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.0 2.1 2.2 Linux Programmer's Manual – Library Functions –
- ↑ C99 standard, §7.19.6.2 "The fscanf function" alinea 11.
- ↑ "स्कैनफ़ प्रकार फ़ील्ड वर्ण". docs.microsoft.com.
बाहरी संबंध
- The Single UNIX Specification, Version 4 from The Open Group – System Interfaces Reference,
- C++ reference for
std::scanf