2011-06-22 17 views
5

वैसे यह एक बुनियादी सवाल है लेकिन मुझे काफी उलझन में लग रहा है।आंतरिक रूप से fgets कैसे काम करता है?

#include<stdio.h> 
int main() 
{ 
char a[100]; 
printf("Enter a string\n"); 
scanf("%s",a); 
} 

असल में उपरोक्त मैं प्राप्त करना चाहता हूं। अगर मैं एक स्ट्रिंग दर्ज

James Bond 

तो मैं चाहता हूँ कि सरणी एक में संग्रहित किया जा करने के लिए। लेकिन समस्या केवल जेम्स शब्द के बीच में रिक्त स्थान की उपस्थिति के कारण है। तो मैं इसे कैसे हल कर सकता हूं।

अद्यतन
) नीचे मैं fgets को समझने (दिए गए उत्तरों के बाद एक बेहतर विकल्प होगा। मैं fgets के आंतरिक काम को जानना चाहता हूं क्योंकि यह स्ट्रिंग को अंतरिक्ष के साथ क्यों स्टोर करने में सक्षम है जहां स्कैनफ ऐसा करने में सक्षम नहीं है।

+3

'scanf' के बजाय' fgets' का प्रयोग करें। ज्यादातर हमेशा। –

+0

@ क्रिस लुट्ज़ मैं जानना चाहता हूं कि कैसे fgets काम करता है क्यों fgets अंतरिक्ष स्वीकार करने में सक्षम है लेकिन scanf नहीं? –

उत्तर

5

के लिए The Open Group Base Specifications Issue 7 का उपयोग इस आपको क्या चाहिए है?

सभी कार्यान्वयन इनपुट फ़ाइल (या स्ट्रीम) जब तक यह \ N तक पहुँच जाता है स्कैन करता है या ईओएफ, या maxSize परम हिट है ...

+0

हाँ आदमी जो वही है जो मैं चाहता था। धन्यवाद। मुझे बताएं कि आपने कौन से कीवर्ड प्राप्त किए थे। –

+0

http://www.google.ro/search?q=fgets+source+code&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:en-US:official&client=firefox-a – Quamis

0

आपको sscanf() के बजाय (ए)/fgets (ए, आकार (ए), stdin) का उपयोग करना चाहिए।

+0

मैं fgets के आंतरिक काम को जानना चाहता हूं क्योंकि यह स्ट्रिंग को उस स्थान के साथ स्टोर करने में सक्षम क्यों है जहां स्कैनफ़ ऐसा करने में सक्षम नहीं है। –

+0

@ पंजीकृत उपयोगकर्ता देखें http://www.cplusplus.com/reference/clibrary/cstdio/sscanf/। शब्द के साथ sscanf काम के लिए% s। (जब तक एक सफेद जगह नहीं मिली) – mattn

1

स्कैनफ पहले व्हाइटस्पेस चरित्र तक पढ़ता है।

fgets(a, 100, STDIN);

यह मानक इनपुट से 100 अक्षरों (या पहले \ N) तक पढ़ सकते हैं और यह स्टोर करेगा: यदि स्मृति मुझे सही ढंग से कार्य करता है, अपने उदाहरण में यह होगा समाधान, fgets उपयोग करने के लिए है में।

कभी भी फ़ंक्शन का उपयोग न करें, भले ही यह आसान लग रहा हो।

+0

@Lainlwakura मैं जानना चाहता हूं कि fgets कैसे काम करता है क्यों fgets अंतरिक्ष स्वीकार करने में सक्षम है लेकिन स्कैनफ़ नहीं है और क्यों उपयोग नहीं किया जाना चाहिए()? –

+1

मुझे fgets() के आंतरिक पता नहीं है, लेकिन आपको इसका उपयोग नहीं करना चाहिए() क्योंकि यह केवल सरणी के लिए एक सूचक लेता है। इसमें बिल्कुल कोई जानकारी नहीं है कि सरणी कितनी बड़ी है और वास्तव में आप इसे आसानी से बह सकते हैं। जीसीसी जैसे कुछ कंपाइलर्स वास्तव में आपको() फ़ंक्शन – LainIwakura

0

fgets() का प्रयास करें:

char a[100]; 
printf("Enter a string\n"); 
fgets(a, sizeof(a), STDIN); 

STDIN, check this के बारे में अधिक जानने के लिए।

+0

का उपयोग करने के बारे में चेतावनी देंगे, मैं जानना चाहता हूं कि fgets कैसे काम करता है यानी fgets सफेद स्ट्रिंग के साथ पूर्ण स्ट्रिंग को स्टोर करने में सक्षम कैसे है। –

+0

@ पंजीकृत उपयोगकर्ता: कृपया लिंक जांचें। – Donotalo

+0

मैंने आपके लिंक को पढ़ा है, यह stdin के बारे में बात करता है जिसका फ़ाइल डिस्क्रिप्टर 0 है लेकिन मैं यह नहीं समझ पा रहा हूं कि यह कैसे fgets करता है। –

1

आमतौर पर scanf व्हाइटस्पेस (स्पेस, टैब, न्यूलाइन, ...) पर इनपुट को तोड़ देता है।

उदाहरण के लिए, इनपुट " 5 42 -100"scanf("%d%d%d") के साथ स्वीकार किया जाता है क्योंकि प्रत्येक %d अग्रणी व्हाइटस्पेस को स्ट्रिप्स करता है। %s के साथ एक ही व्यवहार होता है।

केवल रूपांतरण विनिर्देशक जहां प्रमुख खाली स्थान के की अनदेखी नहीं होता है %%, %[ और %c (और, विभिन्न कारणों के लिए, %n)

char input[] = " hello world"; 
char buf[100]; 
sscanf(input, "%8c", buf); /* buf contains " hello w" */ 
sscanf(input, "%8[^o]", buf); /* buf contains " hell" */ 

fgets समारोह के रूप में कई अक्षर पढ़ता के रूप में देखते हैं कर रहे हैं , घोंसला लाइन ब्रेक तक।


मैं ऑनलाइन प्रलेखन

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