2013-04-01 5 views
12
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

char *method1(void) 
{ 
    static char a[4]; 
    scanf ("%s\n", a); 
    return a; 
} 

int main(void) 
{ 
    char *h = method1(); 
    printf ("%s\n", h); 
    return 0; 
} 

पूछने के लिए जब मैं कोड ऊपर चलाने की उम्मीद, शीघ्र इनपुट के लिए दो बार मुझे पूछ रहा है (मैं केवल scanf एक बार कोड में उपयोग करें)। ऐसा क्यों है?scanf इनपुट के लिए दो बार पूछ जब मैं यह केवल एक बार

+0

आपको क्या आउटपुट मिला? –

+0

यह एक बहुत ही छोटी सरणी है। क्या आपने बहुत अधिक डेटा दर्ज किया था? –

+0

मैं जो दर्ज करता हूं। यह एक और इनपुट के लिए पूछता है। फिर मैं फिर से प्रवेश करता हूं। तो केवल यह एक बार प्रिंट करें। – joy

उत्तर

17

मेरी scanf मैनुअल पृष्ठ

व्हाइट अंतरिक्ष (जैसे कारतूस, टैब, या नई-पंक्तियों के रूप में) प्रारूप स्ट्रिंग में से, कोई भी सहित सफेद स्थान, की किसी भी राशि से मेल खाते हैं इनपुट में। बाकी सब कुछ केवल खुद से मेल खाता है।

इस प्रकार scanf ("%s\n", a) के साथ यह वैकल्पिक सफेद स्थान के बाद एक स्ट्रिंग के लिए स्कैन करेगा। चूंकि पहली नई लाइन के बाद अधिक व्हाइटस्पेस का पालन किया जा सकता है, स्कैनफ पहली नईलाइन के बाद नहीं किया जाता है और यह देखता है कि अगला क्या है। आप देखेंगे कि आप किसी भी नई लाइन (या टैब या रिक्त स्थान) दर्ज कर सकते हैं और स्कैनफ़ अभी भी और अधिक प्रतीक्षा करेगा।

हालांकि, जब आप दूसरी स्ट्रिंग में प्रवेश करते हैं, तो व्हाइटस्पेस का अनुक्रम सीमित होता है और स्कैनिंग रोकता है।

पिछला सफेद स्थान स्कैन करने के लिए scanf ("%s", a) का उपयोग करें।

7

आपको scanf के स्ट्रिंग प्रारूप से \n को हटाना होगा। यह होना चाहिए

scanf("%s",a); 

संपादित करें: स्पष्टीकरण

%s मतलब यह है कि scanf इनपुट चरित्र पढ़ता है जब तक यह एक परिसीमक जो अंतरिक्ष या टैब या नई लाइन की तरह एक सफेद स्थान होना चाहिए हो जाता है (\n) तो पहला प्रविष्टि "%s" के लिए एक डिलीमीटर के रूप में प्राप्त होता है और स्ट्रिंग प्रारूप "%s\n" पर "\n" जोड़ना मतलब है कि स्कैनफ 2 न्यूलाइन का इंतजार करेगा, पहली नईलाइन "%s" के डिलीमीटर से संबंधित है और दूसरी नईलाइन \n से संबंधित है सेंट अंगूठी प्रारूप।

+2

आप सही रास्ते पर हैं, लेकिन आपने यह नहीं कहा है कि 'स्कैनफ' एक गैर-अंतरिक्ष चरित्र में आने तक सफेद स्थान को पढ़ता रहेगा। गैर-स्थान दर्ज होने से पहले आप कई नई लाइनें (और रिक्त या टैब) दर्ज कर सकते हैं और 'scanf' रोक सकते हैं। 'Scanf()' फ़ाइल I/O प्रकारों पर 'fgets() 'और' sscanf() 'को प्राथमिकता देने का एक और कारण। –

+1

स्कैनफ के बारे में आपकी तर्क दो न्यूलाइन के लिए प्रतीक्षा करना गलत है। सभी न्यूलाइन दर्ज की गई हैं (यहां तक ​​कि दो से अधिक) प्रारूप में ** सिंगल ** '\ n' द्वारा स्कैन की गई हैं, जैसा कि किसी भी अंतःस्थापित रिक्त स्थान और टैब हैं।कृपया सी मानक या मैन्युअल पृष्ठ में स्कैनफ़ विनिर्देश पढ़ें। – Jens

-1

इसके बजाय उपयोग() या fgets() हो जाता है ... वैकल्पिक रूप से scanf ("% [^ \ n] s", ए) का उपयोग करें;

+0

सरणी में स्कैनफ़ इनपुट इनपुट करता है जब तक कि आपको कोई स्थान प्राप्त न हो .. इसलिए% [^ \ n] s का उपयोग करें ... या स्कैनफ़ का उपयोग न करें, इसके बजाय fgets() के लिए जाएं या प्राप्त करें() –

+2

'"% [^ \ n] एस "' दो निर्देशों से बना है: '% [^ \ n]', जो या तो एक या अधिक गैर-'\ n' वर्णों से मेल खाता है (या स्टोर करता है), या विफल रहता है क्योंकि इसे तुरंत '\ n' का सामना करना पड़ता है, और ' एस 'जो एक शाब्दिक' से मेल खाता है और इसे त्याग देता है, या विफल रहता है और गैर-के 'चरित्र को वापस stdin पर धक्का देता है। पहला निर्देश लगातार प्रयासों के लिए असफल हो जाएगा, क्योंकि '\ n' नहीं है ', इसलिए' \ n 'सीधे स्टडीन पर धक्का दिया जाएगा और यह पहला चरित्र सामने आया है। अपने लिए देखें: 'char a [64]; int n = scanf ("% [^ \ n] s", ए); जोर दें (एन == 1); एन = स्कैनफ ("% [^ \ n] एस", ए); जोर दें (एन == 1); ' – Sebivor

+0

मेरा सुझाव है [fscanf] (http://pubs.opengroup.org/onlinepubs/007904975/functions/fscanf.html) मैन्युअल को पढ़ने के लिए ताकि आप भ्रम को साफ़ कर सकें '% [' निर्देश और '% s 'निर्देश के संबंध में है। – Sebivor

0

 scanf ("%s", a); 
+2

क्यों कोई स्पष्टीकरण नहीं है - और जब आप करते हैं तो क्या होता है। यह [उत्तर] (http://stackoverflow.com/a/15740060/) [MOHAMED] (http://stackoverflow.com/users/1003575/mohamed), या स्वीकृत उत्तर द्वारा कुछ भी नहीं जोड़ता है। –

-1

निकालें/एन scanf से scanf stdio समारोह में एस्केप अनुक्रम का उपयोग न करें और एक इनपुट देने के लिए और यह देखते हुए उत्पादन पर एक बार आधारित उत्पादन प्रदर्शित करता है।

+0

गलत स्लैश। साथ ही, यह उत्तर पिछले उत्तरों के लिए कुछ भी नहीं जोड़ता है। –

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