C11 gets
में gets_s
निम्नलिखित घोषणा है कि द्वारा प्रतिस्थापित कर दिया गया है
char *gets_s(char *str, rsize_t n);
इस समारोह से ज्यादा से ज्यादा n-1
वर्ण पढ़ा जाएगा stdin
*str
में। यह gets
के बफर ओवरफ्लो भेद्यता से बचने के लिए है। फ़ंक्शन fgets
भी एक विकल्प है। http://en.cppreference.com/w/c/io/gets से:
हो जाता है() समारोह सीमा जाँच प्रदर्शन नहीं करता, इसलिए इस समारोह बफ़र-अतिप्रवाह करने के लिए हमलों बेहद कमजोर है। इसका सुरक्षित रूप से उपयोग नहीं किया जा सकता है (जब तक कि कार्यक्रम ऐसे वातावरण में नहीं चलता है जो stdin पर दिखाई दे सकता है)। इस कारण से, समारोह को तीसरे कोर्रिजेंडम में सी 99 मानक में बहिष्कृत कर दिया गया है और सी 11 मानक में पूरी तरह से हटा दिया गया है। fgets() और gets_s() अनुशंसित प्रतिस्थापन हैं।
कभी भी का उपयोग न करें()।
यह देखते हुए कि gets_s
मानक पर एक एक्सटेंशन में परिभाषित किया गया है, केवल वैकल्पिक रूप से लागू किया, तो आप शायद अपने कार्यक्रमों के बजाय fgets
का उपयोग कर लिखना चाहिए। यदि आप fgets
stdin
पर उपयोग करते हैं तो आपका प्रोग्राम सी के पुराने संस्करणों में भी संकलित होगा। व्यवहार में अंतर को ध्यान में रखें: gets_s
ने n-1
वर्ण पढ़ा है, यह तब तक पढ़ता रहता है जब तक कि कोई नई लाइन या अंत-फ़ाइल तक पहुंच न हो , इनपुट को छोड़कर। तो, gets_s
के साथ आप हमेशा एक पूरी लाइन पढ़ रहे हैं, भले ही इसका केवल एक हिस्सा इनपुट बफर में वापस किया जा सके।
fgets (..., ..., stdin) –