c क्यों fgets फ़ंक्शन नापसंद है?




file-io gnu (2)

जीएनयू सी प्रोग्रामिंग ट्यूटोरियल से :

fgets ("फ़ाइल स्ट्रिंग प्राप्त करें") फ़ंक्शन फ़ंक्शन के समान होती है। यह फ़ंक्शन नापसंद है - इसका मतलब है कि यह अप्रचलित है और यह जोरदार सुझाव है कि आप इसका उपयोग नहीं करते - क्योंकि यह खतरनाक है यह खतरनाक है क्योंकि अगर इनपुट डेटा में कोई रिक्त वर्ण है, तो आप नहीं बता सकते। fgets उपयोग न करें जब तक कि आप नहीं जानते कि डेटा में शून्य नहीं है। उपयोगकर्ता द्वारा संपादित की गई फ़ाइलों को पढ़ने के लिए इसका उपयोग न करें, क्योंकि यदि उपयोगकर्ता एक रिक्त वर्ण को सम्मिलित करता है, तो आपको इसे ठीक से संभाल करना चाहिए या स्पष्ट त्रुटि संदेश प्रिंट करना चाहिए। अगर आप कर सकते हैं तो getdelim बजाय हमेशा getline या getdelim का fgets

मैंने सोचा कि fgets फ़ंक्शन बंद हो जाता है जब यह किसी \0 या \n ; यह मैनुअल पेज क्यों नल बाइट का सुझाव देता है कि "खतरनाक है" जब fgets को इनपुट को सही ढंग से संभालना चाहिए? इसके अलावा, getline और getline में अंतर क्या है, और क्या getline या भावी सी मानकों में नापसंद रूप से माना जाने वाला getline फ़ंक्शन वास्तव में माना जाता है?


यह सिर्फ जीएनयू प्रचार है कोई आधिकारिक रूप में fgets नापसंद है हालांकि खतरनाक और पदावनत gets है।


नहीं, वास्तव में C99 या वर्तमान मानक, सी 11 में fgets को नापसंद नहीं किया गया है लेकिन उस ट्यूटोरियल के लेखक सही हैं कि fgets जब एक एनयूएल का सामना करता है तब बंद नहीं होता है, और इस तरह के चरित्र को पढ़ने के बारे में रिपोर्ट करने के लिए कोई तंत्र नहीं है।

fgets फ़ंक्शन, धारा द्वारा इंगित किए गए अक्षरों की संख्या की तुलना में अधिक से कम एक में पढ़ता है, जो कि fgets द्वारा इंगित की गई stream में इंगित होता है। कोई अतिरिक्त वर्ण एक नए-रेखा के चरित्र के बाद नहीं पढ़ाए जाते हैं (जो कि बरकरार रखा गया है) या फ़ाइल के अंत के बाद

(§7.21.7.2)

जीएनयू के getdelim और getline को पॉसिक्स 2008 में मानकीकृत किया गया है, इसलिए यदि आप एक पॉसिक्स प्लेटफ़ॉर्म को लक्षित कर रहे हैं, तो इसके बजाय उन का उपयोग करने के लिए एक बुरा विचार नहीं होगा।

संपादित करें मैंने सोचा था कि NUL अक्षरों के चेहरे में fgets का उपयोग करने के लिए बिल्कुल सुरक्षित नहीं था, लेकिन आर .. (टिप्पणी देखें) ने बताया है:

char buf[256];

memset(buf, '\n', sizeof(buf));  // fgets will never write a newline
fgets(buf, sizeof(buf), fp);

अब buf में पिछले गैर- \n चरित्र की तलाश करें मैं वास्तव में इस कलेड़ की सिफारिश नहीं होता, हालांकि।





buffer-overflow