2010-09-19 14 views
19

अगर मैं कुछ कोशिश जैसे:सरल सी स्कैनफ़ काम नहीं करता है?

int anint; 
char achar; 

printf("\nEnter any integer:"); 
scanf("%d", &anint); 
printf("\nEnter any character:"); 
scanf("%c", &achar); 
printf("\nHello\n"); 
printf("\nThe integer entered is %d\n", anint); 
printf("\nThe char entered is %c\n", achar); 

यह एक पूर्णांक में प्रवेश की अनुमति देता है, तो छोड़ देता है तो दूसरा scanf पूरी तरह से, यह वास्तव में अजीब बात है, जब मैं दो (char scanf पहले) स्वैप के रूप में, यह ठीक काम करता है । पृथ्वी पर क्या गलत हो सकता है?

+1

अपने संकेत दिए गए गलत आकार है, anint एक है में और अधिक उपयोगी चार और आचर एक int है। ऐसा मत करो। –

+0

@ वरीयता लंबाई कोडर: मुझे इसके बारे में खेद है, एक सरल उदाहरण को दोहराया गया था और दोनों को मिश्रित किया गया था। वह गलत टाइप मेरी समस्या से संबंधित नहीं है, उदाहरण को ठीक किया गया है। – John

उत्तर

22

जब scanf का उपयोग कर इनपुट पढ़ने, इनपुट पढ़ा जाता है के बाद वापस कुंजी दबाया जाता है, लेकिन वापस कुंजी द्वारा उत्पन्न न्यू लाइन scanf, जो अगली बार जब आप मानक इनपुट से एक char पढ़ वहाँ एक हो जाएगा मतलब है द्वारा खपत नहीं है पढ़ने के लिए तैयार नई लाइन। उपभोग करने के लिए न्यू लाइन scanf("%c%*c",&anint); होगा एक और तरीका है

char line[MAX]; 

printf("\nEnter any integer:"); 
if(fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1) 
    anint=0; 

printf("\nEnter any character:"); 
if(fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1) 
    achar=0; 

:

एक तरह से बचने के लिए fgets उपयोग करने के लिए एक स्ट्रिंग के रूप इनपुट को पढ़ने के लिए और उसके बाद निकालने क्या आप के रूप में sscanf का उपयोग कर चाहते हैं। %*c बफर से नई लाइन पढ़ेगा और इसे छोड़ देगा।

आप इस पढ़ने के लिए चाहते हो सकता है:

C FAQ : Why does everyone say not to use scanf?

+1

आपको '% d' प्रारूप (भी, या इसके बजाय) के बाद '% * c' की आवश्यकता होगी, है ना? यद्यपि यह भी भरोसेमंद नहीं है - यदि उपयोगकर्ता ने संख्या के बाद और नई लाइन से पहले कोई स्थान या कुछ टाइप किया है। मुझे लगता है कि 'fgets() '+' sscanf() 'बेहतर है। –

+3

@ जोनाथन: आप सही हैं। हमें '% d' के बाद इसकी आवश्यकता होगी। और हाँ 'fgets + sscanf' हमेशा बेहतर होता है। – codaddict

+0

@codeaddict: लंबे समय तक स्वीकार करने के लिए खेद है, लेकिन आपने वास्तव में मुझे आंतरिक अंतर्दृष्टि के बारे में कुछ और जानकारी दी है। मैं वास्तव में सी अकसर किये गए सवाल लिंक की भी सराहना करता हूं, इन लोगों को नए लोगों को सिखाने के लिए बुद्धिमान होना बेहतर होगा, अगर मैं कभी बाद में लोगों की मदद करने के लिए मिलता है। – John

5

यह दूसरे scanf() को छोड़ नहीं देता है; दूसरा scanf() पहले scanf() द्वारा छोड़ी गई नई लाइन को पढ़ता है। अधिकांश प्रारूप कोड सफेद स्थान छोड़ते हैं; %c प्रारूप सफेद स्थान को छोड़ नहीं करता है।

12

अन्य उत्तर सही हैं - %c खाली स्थान के छोड़ नहीं करता है। सबसे आसान तरीका है कि ऐसा करना बनाने के लिए %c से पहले खाली स्थान के जगह है:

scanf(" %c", &achar); 

(प्रारूप स्ट्रिंग में कोई खाली स्थान के scanf लगातार सभी खाली स्थान के उपभोग कर देगा)।

+0

व्हाइटस्पेस को छोड़ने से वास्तव में नई लाइन को हटाने में मदद मिलती है? उदाहरण के लिए: 'scanf ("\ n% c", और achar);' भी काम करेगा। – cpx

+2

@ सीपीएक्स: क्योंकि एक नई लाइन व्हाइटस्पेस है। प्रारूप स्ट्रिंग में कोई भी व्हाइटस्पेस किसी भी अन्य व्हाइटस्पेस की तरह व्यवहार करता है, इसलिए \ n' एक स्थान के रूप में उतना ही अच्छा है (लेकिन एक और अक्षर)। – caf

0

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

0

getchar()scanf से पहले कॉलिंग संग्रहित लाइन ब्रेक को भी शुद्ध करेगा। अधिक हल्के लेकिन अधिक स्थितिजन्य

char input_1; 
char input_2; 
getchar(); 
scanf("%c", &input_1); 
getchar(); 
scanf("%c", &input_2); 

पंक्ति विराम फ्लश, कोड की लगातार पंक्तियों में आप जानते हैं कि यह केवल एक मान और नहीं एक स्ट्रिंग पंक्तिबद्ध है

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