2013-08-11 20 views
16

में fflush (stdin) के उपयोग क्या है मेरे पास है निम्नलिखित कार्यक्रमसी प्रोग्रामिंग

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char ans[8]; 
    int i; 
    for(i=1;i<=3;i++) 
    { 
     printf("\n What is the unit of traffic ?"); 
     scanf("%s",ans); 
     fflush(stdin); 

     if(stricmp(ans,"Earlang")==0) 
     { 
      printf("\nAnswer is correct"); 
      exit(1); 
     } 
     else 
      if(i<3) 
      printf("\n Try Again!\n"); 
    } 
    printf("\n Nunit of traffic is Earlang:"); 
} 

इस कार्यक्रम में fflush (stdin) के उपयोग क्या है?

+3

क्या आप दस्तावेज़ पढ़ने में असमर्थ हैं? –

+5

@MitchWheat जैसा कि आपको पता होना चाहिए, बहुत से दस्तावेज़ों में 'fflush (stdin)' का उल्लेख नहीं किया जाएगा, क्योंकि इसमें केवल कुछ प्लेटफॉर्म पर परिभाषित व्यवहार है। इस पर पहले से परेशान होना बिल्कुल सामान्य है (लेकिन SO पर डुप्लिकेट प्रश्नों का एक टन होना चाहिए, उदाहरण के लिए [fflush (stdin) का उपयोग करना] (http://stackoverflow.com/questions/2979209/using-fflushstdin))। उपरोक्त प्रोग्राम में – Gilles

उत्तर

10

यह पढ़ने से पहले stdin बफर साफ करता है। आदमी page से:

आउटपुट स्ट्रीम के लिए, fflush() सभी उपयोगकर्ता के अंतरिक्ष के एक लिखने दी उत्पादन या स्ट्रीम के अंतर्निहित लिखने समारोह के माध्यम से अपडेट स्ट्रीम के लिए डेटा बफ़र बाध्य करती है। इनपुट धाराओं के लिए, fflush() किसी भी बफ़र डेटा कि अंतर्निहित फ़ाइल से दिलवाया कर दिया गया है को छोड़ देता है, लेकिन आवेदन से भस्म नहीं किया गया है।

नोट: यह लिनक्स-विशिष्ट है, का उपयोग कर fflush() इनपुट पर स्ट्रीम मानक से अपरिभाषित है, तथापि, अधिकांश प्रयोगों लिनक्स में के रूप में ही व्यवहार करते हैं।

+0

, भले ही fflush (stdin) लिखा नहीं गया है, प्रोग्राम निष्पादित होगा, लेकिन कैसे fflush (stdin) सहायक होगा। कृपया सुझाव दें। – user2526830

+0

@ user2526830 मुझे यकीन नहीं है कि आप क्या कह रहे हैं, लेकिन जैसा कि मैंने कहा था कि यह फिर से पढ़ने से पहले बफर को साफ़ करता है। – iabdalkader

+1

@ user2526830 यह सुनिश्चित करेगा कि प्रोग्राम अलग-अलग मशीनों पर अलग-अलग निष्पादित करता है, अलग-अलग प्रक्रियाओं को चलाता है, अलग-अलग सिस्टम लोड के तहत और न केवल आपकी मशीन पर। – TheCodeArtist

19

यह मानक सी में नहीं है, तो व्यवहार अनिर्धारित रहता है।

कुछ कार्यान्वयन इसे इस्तेमाल करता है stdin बफर स्पष्ट करने के लिए।

सी 11 7.21.5.2 से Fflush फ़ंक्शन, fflush केवल आउटपुट/अपडेट स्ट्रीम के साथ काम करता है, इनपुट स्ट्रीम नहीं।

एक आउटपुट स्ट्रीम या एक अद्यतन धारा जिसमें सबसे हाल ही में आपरेशन इनपुट नहीं था करने के लिए धारा अंक, fflush समारोह है कि धारा के लिए किसी भी अलिखित डेटा का कारण बनता है, तो मेजबान पर्यावरण के लिए वितरित किए जाने के लिए लिखे जाने की फ़ाइल; अन्यथा, व्यवहार अपरिभाषित है।

+8

+1। सी मानक के दृष्टिकोण से यह बिल्कुल सही है। कुछ अपूर्णताएं इनपुट स्ट्रीम में 'fflush() 'से semantics देते हैं, लेकिन यह एक एक्सटेंशन है। – glglgl

5

इनपुट बफर से सभी डेटा को अगली नई लाइन तक हटाने का यह एक अप्राप्य तरीका है। मैंने देखा है ऐसा मामलों में इस्तेमाल किया: fflush() बिना

char c; 
char s[32]; 
puts("Type a char"); 
c=getchar(); 
fflush(stdin); 
puts("Type a string"); 
fgets(s,32,stdin); 

, यदि आप एक चरित्र टाइप करें, कहते हैं कि "एक", और हिट दर्ज करें, इनपुट बफर शामिल है "एक \ n", getchar() "एक" peeks, लेकिन "\ n" बफर में बनी हुई है, इसलिए अगले fgets() इसे खोजने और यहां तक ​​कि उपयोगकर्ता इनपुट का इंतजार किए बिना कोई रिक्त स्ट्रिंग वापस आ जाएगी।

हालांकि, ध्यान दें कि fflush() के इस प्रयोग unportable है। मैंने अभी एक लिनक्स मशीन पर परीक्षण किया है, और यह काम नहीं करता है, उदाहरण के लिए।

+0

लिनक्स उपयोग में: # शामिल शून्य clean_stdin (शून्य) { int c; { सी = getchar(); } जबकि (सी! = '\ N' && c! = ईओएफ); } https://stackoverflow.com/a/17319153/1925162 – Sunny127

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