2011-06-14 13 views
9

मैं हाल ही में एक जिज्ञासु मामले पर ठोकर खाई (कम से कम मेरे लिए, के बाद से मैं इस से पहले का सामना करना पड़ा नहीं था) .. पर विचार करें नीचे सरल कोड: -स्कैनफ() उत्सुक व्यवहार!

int x; 
scanf("%d",&x); 
printf("%d",x); 

ऊपर कोड एक सामान्य पूर्णांक इनपुट लेता है और प्रदर्शित करता है परिणाम अपेक्षा के अनुरूप ..

अब, अगर मैं निम्नलिखित करने के लिए उपरोक्त कोड संशोधित: -

int x; 
scanf("%d ",&x);//notice the extra space after %d 
printf("%d",x); 

यह एक और अतिरिक्त इनपुट में ले जाता है इससे पहले कि यह printf बयान के परिणाम देता है .. मुझे नहीं पता समझें क्यों एक अंतरिक्ष resu scanf() .. किसी को भी मेरे लिए इस व्याख्या कर सकते हैं के व्यवहार के परिवर्तन में लीटर ....

+1

स्कैनफ EVIL है और इससे बचा जाना चाहिए - तो मैं कहें, और अन्य :): http: // stackoverflow।कॉम/प्रश्न/456303/कैसे-से-वैध-इनपुट-उपयोग-स्कैनफ़ – Bukes

+0

@ बुक्स: हाँ, यदि आपको नहीं पता कि प्रोग्राम कैसे करें, या दस्तावेज़ीकरण पढ़ें, तो आपको C –

+1

@Chris Dodd - 'scanf' का उपयोग नहीं करना चाहिए न्यूलाइन और अन्य सफेद जगहों के बीच अंतर नहीं कर सकते हैं। यदि आप अपने इनपुट पर अच्छा नियंत्रण चाहते हैं, या त्रुटियों से संवेदना से पुनर्प्राप्त करने की क्षमता चाहते हैं, तो आप सी –

उत्तर

8

http://beej.us/guide/bgc/output/html/multipage/scanf.html से:

कार्यों का scanf() परिवार कंसोल से या एक फ़ाइल धारा से डेटा पढ़ता है, यह पार्स करता है, और चर आप तर्क सूची में प्रदान में परिणाम दूर संग्रहीत करता है।

प्रारूप स्ट्रिंग printf() में बहुत समान है जिसमें आप इसे "% d" पढ़ने के लिए कह सकते हैं, उदाहरण के लिए एक int के लिए। लेकिन इसमें अतिरिक्त क्षमताएं भी हैं, विशेष रूप से यह इनपुट स्ट्रिंग में निर्दिष्ट इनपुट में अन्य वर्णों को खा सकती है।

क्या हो रहा है स्कैनफ प्रारूप स्ट्रिंग से मेल खाने वाला पैटर्न है (एक नियमित अभिव्यक्ति की तरह)। स्कैनफ मानक इनपुट (जैसे कंसोल) से पाठ का उपभोग करता है जब तक कि पूरा पैटर्न मेल नहीं खाता।

आपके दूसरे उदाहरण में, स्कैनफ़ एक संख्या में पढ़ता है और इसे x में संग्रहीत करता है। लेकिन यह अभी तक प्रारूप स्ट्रिंग के अंत तक नहीं पहुंच पाया है - अभी भी एक स्पेस कैरेक्टर बाकी है। इसलिए स्कैनफ मानक इनपुट से अतिरिक्त व्हाइटस्पेस वर्ण (ओं) को पढ़ने के लिए (कोशिश करने के लिए) पढ़ता है।

3

man page:

प्रारूप स्ट्रिंग निर्देश हैं जो वर्णन के अनुक्रम के होते हैं से कैसे कार्रवाई करने के लिए इनपुट वर्णों का अनुक्रम। यदि निर्देश की प्रक्रिया विफल हो जाती है, तो कोई और इनपुट पढ़ा नहीं जाता है, और scanf() रिटर्न। "विफलता" निम्न में से कोई भी हो सकता है: इनपुट विफलता, जिसका अर्थ है कि इनपुट वर्ण अनुपलब्ध थे, या मिलान विफलता, जिसका अर्थ है कि इनपुट अनुचित था (नीचे देखें)।

A directive is one of the following: 

    ?  A sequence of white-space characters (space, tab, newline, etc; 
     see isspace(3)). This directive matches any amount of white 
     space, including none, in the input. 
+0

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

0

man scanf

[...] white-space वर्णों का एक क्रम (अंतरिक्ष, टैब, न्यू लाइन, आदि .; isspace देखना (3))। यह निर्देश इनपुट में किसी भी सहित, सफेद स्थान की किसी भी मात्रा से मेल खाता है।

+2

और उत्तर है? –

+1

@ क्रिस्टियन राउ: यह पैटर्न मिलान के बारे में है। एक स्थान 'इनपुट में किसी भी मात्रा में सफेद स्थान, [...] से मेल खाता है। एक जवाब की तरह लगता है। –

संबंधित मुद्दे