2009-08-09 17 views
27

के बीच अंतर मैं जानना चाहता हूं कि fgets() और scanf() के बीच क्या अंतर है। मैं अपने मंच के रूप में सी का उपयोग कर रहा हूँ।स्कैनफ़() और fgets()

उत्तर

6

स्कैनफ सीमा जांच नहीं करता है। fgets शायद बेहतर विकल्प होने जा रहा है। फिर आप इसका मूल्यांकन करने के लिए sscanf() का उपयोग कर सकते हैं।

विषय यहाँ (मेरे बुराई जुड़वां इस- नहीं भूल मेरे लिए भाषण हो रही है कि गया था) http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html

How do you allow spaces to be entered using scanf?

+1

संख्यात्मक प्रकारों के लिए, scanf() को सीमाओं की जांच करने की आवश्यकता नहीं है। स्ट्रिंग प्रकारों के लिए, आप सीमा जांच करने के लिए scanf() बता सकते हैं। –

1

scanf, एक स्ट्रिंग आप में पढ़ा (या बनाई गई) को पार्स करता है के अच्छे चर्चा और fgets एक खुली फ़ाइल * से एक पंक्ति पढ़ता है। या आप fscanf मतलब है?

+1

आप मानक इनपुट (कंसोल) से fgets के साथ पढ़ सकते हैं। –

20

कई अंतर हैं। दो महत्वपूर्ण हैं:

  • fgets() किसी भी खुले फ़ाइल से पढ़ सकते हैं, लेकिन scanf() केवल मानक इनपुट पढ़ता है।
  • fgets() फ़ाइल से 'टेक्स्ट की एक पंक्ति' पढ़ता है; इसके लिए scanf() का उपयोग किया जा सकता है लेकिन संख्यात्मक प्रकारों में निर्मित स्ट्रिंग से रूपांतरणों को भी संभालता है।

बहुत से लोग fgets() का उपयोग डेटा की एक पंक्ति को पढ़ने और फिर sscanf() का उपयोग यह टुकड़े करना होगा।

4
int scanf(const char * restrict format, ...); 

scanf (3) कुछ पैटर्न दिया stdin, जहां पैटर्न आप द्वारा परिभाषित किया गया है के रूप में जाना इनपुट पर प्रारूप तर्क द्वारा परिभाषित के लिए खोज करता है। दिए गए इनपुट स्कैनफ़ (3), इसके संस्करण (स्कैनफ़, fscanf, sscanf, vscanf, vsscanf, vfscanf) के आधार पर, एक स्ट्रिंग या फ़ाइल हो सकता है।

char *fgets(char * restrict str, int size, FILE * restrict stream); 

fgets (3) बस इनपुट फ़ाइल धारा से एक लाइन पढ़ता है और बाइट्स दिया बाइट्स बफर करने के लिए बफर str के रूप में अशक्त समाप्त स्ट्रिंग कॉपी और उत्पादन की सीमा आकार में।

0

मुख्य अंतर यह है, तथ्य यह है कि scanf अक्षर हैं जो पढ़ा जा सकता है (उसके डिफ़ॉल्ट उपयोग में) की संख्या पर कोई सीमा नहीं है में निहित है, जबकि fgets कि पढ़ा जा सकता है चार की एक अधिकतम संख्या है।

चार * fgets (चार * गंतव्य, पूर्णांक आकार, फ़ाइल * धारा);:

दो कार्यों के प्रोटोटाइप देखें

int स्कैनफ़ (कॉन्स चार * प्रारूप, ...);

आप देख सकते हैं कि fgets का दूसरा पैरामीटर अधिकांश आकार वाले char में पढ़ने के लिए लगाया जाता है।

एक और स्पष्ट अंतर वापसी मान है: fgets वापसी dest सफलता पर करने के लिए एक सूचक; scanf सफलतापूर्वक मेल खाने और असाइन किए गए इनपुट आइटम की संख्या लौटाएं। फिर, scanf समारोह प्रारूप के अनुसार इनपुट को स्कैन करता है, और मानक इनपुट धारा stdin से इनपुट पढ़ता है, जबकि fgets से डिफ़ॉल्ट के रूप में फ़ाइल * धारा इनपुट पढ़ता है।

निष्कर्ष में, आप फ़ाइल से डेटा पढ़ने के लिए scanf का उपयोग कर सकते हैं और उन्हें एक निश्चित आकार सरणी (उदाहरण के लिए) में डालने का अधिक अर्थ नहीं है। scanf का एक लाभ यह आउटपुट डेटा का स्वरूपण है: समारोह पढ़ता अगर 12345\n, उत्पादन 12345 है, जबकि fgets पढ़ता है और रिटर्न तक \n (शामिल है), एक स्ट्रिंग टर्मिनेटर के रूप में अंत में एक \0 जोड़ने।

0

यह ध्यान दिया जाना चाहिए कि scanf पैटर्न चश्मा क्षेत्र चौड़ाई सीमा की अनुमति देते हैं:

scanf(" %80s", mybuffer); 

लेकिन, जहां printf() की अनुमति देता है चौड़ाई एक चर के रूप में प्रदान किया जाने वाला (साथ '*'):

printf("My name is %*s.\n", 20, name); 

scanf() नहीं करता है।

#define NAMEWIDTH 40 
char buffer[ NAMEWIDTH + 4 ]; 
... 
scanf(" %40x", buffer); 

और कोई रास्ता नहीं क्षेत्र कनेक्ट करने के लिए साथ scanf() में 40 चौड़ाई: यदि आप इस तरह की बातें कर रही अंत जिसका मतलब है (। यह '*' एक झंडा दबाने/क्षेत्र पूरी तरह से अनदेखी करने के लिए के रूप में व्याख्या) बफर घोषणा में बफर चौड़ाई 40।

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