2012-10-15 26 views
20

cplusplus.comसी 11 में समतुल्य() समतुल्य क्या है?

सी मानक के सबसे हाल ही संशोधन (2011) से निश्चित अपने विनिर्देशन

समारोह सी में हटाई गई है ++ (से इस समारोह हटा दिया गया है 2011 मानक है, जो C99 इस प्रकार के रूप में + TC3)।

मैं सिर्फ यह जानना चाहता था कि सी 11 मानक में gets() का विकल्प क्या है?

+2

fgets (..., ..., stdin) –

उत्तर

15

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 का उपयोग कर लिखना चाहिए। यदि आप fgetsstdin पर उपयोग करते हैं तो आपका प्रोग्राम सी के पुराने संस्करणों में भी संकलित होगा। व्यवहार में अंतर को ध्यान में रखें: gets_s ने n-1 वर्ण पढ़ा है, यह तब तक पढ़ता रहता है जब तक कि कोई नई लाइन या अंत-फ़ाइल तक पहुंच न हो , इनपुट को छोड़कर। तो, gets_s के साथ आप हमेशा एक पूरी लाइन पढ़ रहे हैं, भले ही इसका केवल एक हिस्सा इनपुट बफर में वापस किया जा सके।

+6

यह ध्यान दिया जाना चाहिए कि 'get_s' वैकल्पिक है, यदि कार्यान्वयन '__STDC_LIB_EXT1__' को परिभाषित नहीं करता है, तो मौजूद नहीं होना चाहिए, और यदि ऐसा होता है, तो' __STDC_WANT_LIB_EXT1__' को परिभाषित करने की आवश्यकता है (यदि यह बिल्कुल परिभाषित नहीं है, तो यह कार्यान्वयन- परिभाषित किया गया है कि अनुबंध हे के कार्यों को संबंधित शीर्षकों में शामिल किया गया है)। –

+6

'fgets' का उपयोग किया जाना चाहिए। 'get_s' एक वैकल्पिक इंटरफ़ेस है जो केवल विंडोज पर मौजूद है और केवल राजनीतिक कारणों के लिए मानक में उल्लेख किया गया था।एमएस के बाहर बहुत ज्यादा लोग _s इंटरफेस गुमराह और हानिकारक पाते हैं। रिपोर्ट की गई है कि कुछ या सभी इंटरफेस का मानकीकृत व्यवहार केवल मौजूदा कार्यान्वयन (एमएस वाले) से अलग है, जिससे उनका उपयोग और भी हानिकारक हो जाता है। –

+0

मुझे संदेह है कि आपने get_s के व्यवहार को गलत समझा है। Fgets की तरह, यह ज्यादातर एन -1 अक्षर पर पढ़ता है। अंतर यह है कि अगर यह एक नए रेखा चरित्र से मुकाबला करता है तो get_s बंद हो जाता है। मानक में कुछ भी इंगित करता है कि यह एन -1 के बाद पढ़ता रहता है। C11 से पहले मौजूद विभिन्न गैर-मानक कार्यान्वयन के साथ मानक संस्करण को भ्रमित न करें। – Lundin

4

man 3 gets, fgets के अनुसार।

+0

सी 11 मानक में बराबर हो जाता है get_s है, हालांकि यह तकनीकी रूप से fgets (..., stdin) जैसा ही होना चाहिए; – Lundin

+1

"राजनीतिक कारणों के लिए जोड़े गए वैकल्पिक अनुबंध में" शायद ही कभी "सी 11 मानक में" है। आपको कहीं भी _s कार्यों का सी 11-अनुरूप संस्करण नहीं मिलेगा, क्योंकि कोई भी उन्हें लागू करने की योजना नहीं बना रहा है। –

+2

@ आर .. सी 11 का अनुलग्नक के मानक मानक है, भले ही इसे कार्यान्वित करना अनिवार्य नहीं है। अभ्यास में इसका क्या अर्थ है, यह है कि सी कार्यान्वयन में अब अजीब, गैर-मानक get_s फ़ंक्शंस नहीं हो सकते हैं जिनके व्यवहार में मानक होता है। मैं यह भी शर्त लगाता हूं कि जीसीसी इन कार्यों को लागू करेगा: कि कंपाइलर केवल वैकल्पिक, अनावश्यक, व्यर्थ सुविधाओं को प्यार करता है। हालांकि मैं संगतता कारणों के लिए fgets() की सिफारिश करता हूं। – Lundin

8

अन्य ने पहले से ही इस प्रश्न का उत्तर दिया है। पूर्णता के लिए, यह सी मानक की सिफारिश है:

आईएसओ 98 99: 2011 के.3.5.4।1/6

अनुशंसित अभ्यास

fgets ठीक तरह से कार्य से लिखा कार्यक्रमों को सुरक्षित रूप से इनपुट लाइनों बहुत लंबा परिणाम सरणी में स्टोर करने के लिए कार्रवाई करने के लिए अनुमति देता है। आम तौर पर यह आवश्यक है कि fgets के कॉलर्स पर परिणाम सरणी में एक नए-पंक्ति चरित्र की उपस्थिति या अनुपस्थिति पर ध्यान दें। get_s के बजाय fgets ( नए-पंक्ति वर्णों के आधार पर किसी भी आवश्यक प्रसंस्करण के साथ) पर विचार करें।

तो आपको जब भी संभव हो fgets का उपयोग करना चाहिए।

ISO9899:

संपादित

gets_s व्यवहार होने के लिए निर्दिष्ट 2011 K.3.5.4.1/4

विवरण

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

अंत फ़ाइल का सामना करना पड़ा है और कोई वर्ण सरणी में पढ़ा गया है, या आपरेशन के दौरान एक पढ़ा त्रुटि तब होती है, तो रों [0] अशक्त चरित्र को अन्य तत्वों सेट कर दिया जाता है, और अगर अनिर्दिष्ट मूल्य लेते हैं।

+3

ध्यान दें कि 'get_s()' एक बाधा उल्लंघन की रिपोर्ट करता है यदि न तो कोई नई लाइन है और न ही 'n-1' वर्णों में EOF; यह एक अधिक लाइन पाने के लिए एक त्रुटि है। –