यह एक अधिक चर्चा की विषय है, पूरा राय की लेकिन दिलचस्प कोई भी कम है. मैंने देखा है कि एक बड़े बहुमत के उन है कि पहले से ही जवाब दिया के लिए इसी तरह के सवाल इस साइट पर गिर के किनारे पर fgets()
. मैं उनमें से एक हूँ. मैं खोजने के लिए fgets()
किया जा करने के लिए ज्यादा बेहतर है का उपयोग करने के लिए उपयोगकर्ता इनपुट के लिए की तुलना में scanf()
कुछ अपवादों के साथ. scanf()
कई द्वारा माना जाता है के रूप में के रूप में उप-इष्टतम विधि से निपटने के लिए उपयोगकर्ता इनपुट. उदाहरण के लिए
"...यह आपको बता देगा कि क्या यह सफल रहा या विफल रहा है, लेकिन आप बता सकते हैं केवल लगभग, जहां यह विफल रहा है, और सब पर नहीं कैसे या क्यों. आप
बहुत कम अवसर ऐसा करने के लिए किसी भी त्रुटि वसूली."
(jamesdlin). लेकिन ब्याज के प्रयास में संतुलन शुरू होगा, का हवाला देते हुए इस चर्चा.
उपयोगकर्ता इनपुट के लिए से आता है कि stdin
यानी , कुंजीपटल इनपुट, fgets()
एक बेहतर विकल्प हो जाएगा. यह बहुत अधिक क्षमा है कि स्ट्रिंग इसे पढ़ता है हो सकता है पूरी तरह से मान्य करने से पहले रूपांतरण का प्रयास किया है
एक बार कुछ का उपयोग कर एक फार्म के scanf(): fscanf() ठीक हो जाएगा का उपयोग करने के लिए हो सकता है जब परिवर्तित इनपुट से एक बहुत ही नियंत्रित स्रोत, यानी पढ़ने से एक सख्ती से स्वरूपित फ़ाइल के साथ दोहरा उम्मीद के मुताबिक खेतों ।
अधिक चर्चा के लिए, इस तुलना के दो पर प्रकाश डाला गया अतिरिक्त के फायदे और नुकसान दोनों है ।
संपादित करें: के लिए पता सेशन अतिरिक्त प्रश्न के बारे में अतिप्रवाह:
"एक और बात मैं पूछना चाहता हूँ है: यहां तक कि जब हम का उपयोग करें fgets क्या होगा यदि उपयोगकर्ता अक्षर दर्ज करें और अधिक से अधिक सीमा (मैं एक बहुत मतलब है की
अक्षर) है, यह नेतृत्व करने के लिए बफर अतिप्रवाह? तो कैसे के साथ सौदा करने के लिए
यह क्या है?"
[fgets()](https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm अच्छी तरह से बनाया गया है को रोकने के लिए बफर अतिप्रवाह, का उपयोग करके बस अपने मानकों को ठीक से, जैसे:
char buffer[100] = {0};
...
while fgets(buffer, sizeof buffer, stdin);
इस से बचाता है इनपुट की तुलना में अधिक बफर आकार में संसाधित किया जा रहा से, इस प्रकार की रोकथाम अतिप्रवाह.
यहां तक कि का उपयोग कर scanf()
को रोकने के बफर अतिप्रवाह है बहुत सीधे आगे का उपयोग करें: एक चौड़ाई विनिर्देशक में प्रारूप स्ट्रिंग है । यदि आप पढ़ने के लिए चाहते हैं के लिए इनपुट के उदाहरण और सीमित इनपुट से आकार करने के लिए उपयोगकर्ता 100 अक्षर मैक्स, कोड होगा निम्न शामिल हैं:
char buffer[101] = {0};// includes space for 100 + 1 for NULL termination
scanf("%100s", buffer);
^^^ width specifier
हालांकि, संख्या के साथ अतिप्रवाह नहीं है, तो अच्छा उपयोग scanf()
. प्रदर्शित करने के लिए, का उपयोग इस सरल कोड inputting दो मूल्यों का संकेत दिया टिप्पणी में प्रति एक चलाएँ:
int main(void)
{
int val = 0;
// test with 2147483647 & 2147483648
scanf("%d", &val);
printf("%d\n", val);
return 0;
}
दूसरे के लिए मूल्य, अपने सिस्टम फेंकता है निम्नलिखित:
NON-FATAL RUN-TIME ERROR: "test.c", line 11, col 5, thread id 22832: Function scanf: (errno == 34 [0x22]). Range error
`
यहाँ आप की जरूरत है पढ़ने के लिए एक स्ट्रिंग में है, तो साथ पालन करने के लिए एक स्ट्रिंग संख्या रूपांतरण में से एक का उपयोग strto_()
कार्य: strtol(), strtod(), ...). दोनों की क्षमता शामिल करने के लिए परीक्षण के लिए अतिप्रवाह से पहले के कारण एक रन-समय पर चेतावनी या त्रुटि । ध्यान दें कि का उपयोग कर atoi()
, atod()
से रक्षा नहीं करेगा अतिप्रवाह या तो.