2012-04-15 7 views
9

यह भेद क्यों? stdlib.h में होने के लिए itoa मानते हुए और itoa के कस्टम संस्करण को एक अलग प्रोटोटाइप के साथ जोड़ने और इस प्रकार कुछ पागल त्रुटियों का उत्पादन करने के साथ अंततः भयानक समस्याओं के साथ उभरा है।atoi एक मानक समारोह है। लेकिन इटाओ नहीं है। क्यूं कर?

तो, itoa क्यों मानक फ़ंक्शन नहीं है? इसके साथ गलत क्या है? और अपने जुड़वां भाई atoi की ओर मानक आंशिक क्यों है?

+11

'atoi' ऐतिहासिक है,' itoa' नहीं है। आपको वास्तव में 'atoi' का उपयोग नहीं करना चाहिए,' स्ट्रेटो (यू) एल (एल) 'जो आपको उपयोग करना चाहिए। दूसरी दिशा के लिए, (एस) printf'। –

+0

चूंकि 'itoa' एक मानक फ़ंक्शन नहीं है, क्या आप 'इटोआ' फ़ंक्शन के लिए इंटरफ़ेस अनुबंध क्या शामिल कर सकते हैं, जिसे आप चर्चा करना चाहते हैं?(ऐसा करने से आपके प्रश्न का उत्तर हो सकता है।) –

+0

@ चार्ल्सबैली मैं सामान्य रूप से उत्सुक हूं कि मानक में एटीओई क्यों नहीं है और यह नहीं है –

उत्तर

7

नहीं itoa को मानक मानने के लिए इसे मानकीकृत किया गया है ताकि आपको एक आकर्षक कारण और इसे जोड़ने के लिए एक अच्छा इंटरफ़ेस चाहिए।

अधिकांश itoa इंटरफेस है कि मैंने देखा है या तो एक स्थिर बफर जो फिर से entrancy और आजीवन मुद्दे हैं, एक गतिशील बफर कि फोन करने वाले मुक्त या उपयोगकर्ता की आवश्यकता के लिए एक बफर जो इंटरफेस नहीं की तुलना में बेहतर बनाता है की आपूर्ति करने की जरूरत है आवंटित का उपयोग sprintf

+2

itoa() पास में बफर के साथ एस (एन) printf() पर एक बड़ी जीत हो सकती है जब लाइब्रेरी के उस विशेष भाग से कुछ और नहीं (printf() परिवार में कुछ भी नहीं) का उपयोग किया जाता है। मानक सी लाइब्रेरी में itoa() डालने का कोई कारण नहीं है, लेकिन यह कुछ अधिक भारी पर इसे पसंद करने का एक कारण है। –

+0

@ जुलिएनऑस्टिन: यह एक बड़ी जीत क्यों है? सच है, आपको दो वर्ण प्रारूप स्ट्रिंग को पार्स करने की आवश्यकता नहीं है, लेकिन मैं उस पर विचार नहीं करता हूं कि _huge_ win। –

+2

प्रिंटफ() परिवार के साथ सवारी के लिए आने वाले अन्य सभी पार्सिंग फ़ंक्शंस से भी बचा जा सकता है। याद रखें - इस जीवन में अन्य चीजें पार्सिंग प्रारूप तारों के अलावा अन्य चीजें हैं। जैसे, स्मृति पदचिह्न। –

2

एक "itoa" फ़ंक्शन को एक स्ट्रिंग वापस करना होगा। चूंकि तार प्रथम श्रेणी की वस्तुएं नहीं हैं, इसलिए कॉलर को बफर + लंबाई पारित करनी होगी और फ़ंक्शन को यह इंगित करने का कोई तरीका होगा कि यह कमरे से बाहर हो गया है या नहीं। जब तक आप इसे प्राप्त नहीं करते हैं, तब तक आपने कुछ ऐसा ही बनाया है जो स्प्रिंटफ के लिए पर्याप्त है कि यह कोड/कार्यक्षमता को डुप्लिकेट करने योग्य नहीं है। "Atoi" फ़ंक्शन मौजूद है क्योंकि यह पूर्ण "स्कैनफ़" कॉल से कम जटिल (और तर्कसंगत रूप से सुरक्षित) है। एक "itoa" समारोह इसके लायक होने के लिए पर्याप्त अलग नहीं होगा।

+0

वास्तव में नहीं। कई डेवलपर्स में itoa() शामिल है - वर्षों में कोड में दिनचर्या की तरह। अधिकतम बफर आकार अच्छी तरह से बाध्य था - 6 बाइट्स और 16-बिट बॉक्सन के लिए एनयूएल के लिए एक अतिरिक्त, और 32-बिट बॉक्सन के लिए 11 प्लस अतिरिक्त। मैं डेटा अधिग्रहण फर्मवेयर के एक टुकड़े में एक itoa() फ़ंक्शन का उपयोग करता हूं ताकि संस्करण और स्थिति की जानकारी वाले टेक्स्ट स्ट्रिंग को प्रारूपित किया जा सके। उस कार्यान्वयन में मैं एक सूचक में पास करता हूं, लेकिन मैंने दूसरों को देखा है कि बफर स्थिर है। सबसे अच्छा स्पष्टीकरण यह है कि मानकों की तरह, वहां से चुनने के लिए कई अलग-अलग itoa() कार्यान्वयन हैं !!! –

+0

@ जुलिएनऑस्टिन - मैं यह नहीं कह रहा हूं कि वे मौजूद नहीं हैं, बस वे _standardized_ नहीं हैं। आपका विवरण दिखाने में मदद करता है क्यों। बफर आकार मशीन के रजिस्टर आकार के आधार पर भिन्न होता है। सी मानकों की समिति इस तरह हार्डवेयर-विशिष्ट विवरण से दूर रहती है। एक मानकीकृत समारोह में एक सतत इंटरफ़ेस होना चाहिए और ** ** ** प्लेटफ़ॉर्म पर समान कार्य करना होगा, और ऐसा करने का एकमात्र व्यावहारिक तरीका है 'printf() 'के अधिकांश को पुन: पेश करना। – bta

+0

मैं आपके दावे का जवाब दे रहा था कि फ़ंक्शन = सभी = चीजों को करने के लिए होगा। यह वास्तव में नहीं करता है, और कार्यान्वयन आसानी से शब्दों के आकार में अंतर प्राप्त करने के लिए उपयुक्त संख्याओं के उपयोग से निर्दिष्ट किया जा सकता है। मेरा मतलब है, किसी दिए गए शब्द के आकार के लिए, भंडारण के पात्रों की एक अच्छी तरह से समझी, सीमित संख्या है जो उस शब्द आकार के लिए सभी संभावित पूर्णांक मानों का प्रतिनिधित्व करने के लिए आवश्यक है। टीएल; डीआर - यह सुझाव दिया जा सकता है, और आपके सुझाव के मुकाबले कहीं अधिक आसान और लागू किया जा सकता है। –

1

itoa फ़ंक्शन संभवतः मानक नहीं है क्योंकि इसकी कोई निरंतर परिभाषा नहीं है। विभिन्न कंपाइलर और लाइब्रेरी विक्रेताओं ने atoi के पूरक के रूप में सेवा करने के लिए संभवतः एक आविष्कार के रूप में इसके विभिन्न संस्करणों को प्रस्तुत किया है।

यदि कुछ गैर-मानक फ़ंक्शन विक्रेताओं द्वारा व्यापक रूप से प्रदान किए जाते हैं, तो मानक का काम को कोडित करें: मूल रूप से मौजूदा फ़ंक्शन का मानक मानक में विवरण जोड़ें। यह संभव है अगर फ़ंक्शन में कम या कम लगातार तर्क सम्मेलन और व्यवहार हो।

क्योंकि itoa के कई स्वाद पहले से ही बाहर हैं, ऐसे फ़ंक्शन को आईएसओ सी में जोड़ा नहीं जा सकता है। जो कुछ भी व्यवहार किया गया है, वह कुछ कार्यान्वयन के साथ बाधाओं में होगा।

void itoa(int n, char *s); /* Given in _The C Programming Language_, 1st ed. (K&R1) */ 

void itoa(int input, void (*subr)(char)); /* Ancient Unix library */ 

void itoa(int n, char *buf, int radix); 
char *itoa(int in, char *buf, int radix); 

माइक्रोसॉफ्ट बदल नाम के तहत उनके विज़ुअल सी भागो समय पुस्तकालय में यह प्रदान करता है:: _itoa

itoa जैसे रूपों में मौजूद है।

इतना ही नहीं है सी कार्यान्वयन ऐतिहासिक दृष्टि से यह भिन्न परिभाषाओं के तहत प्रदान की, सी कार्यक्रमों भी खुद के लिए itoa समारोह नाम के एक समारोह है, जो संभव संघर्ष के लिए एक अन्य स्रोत है प्रदान करते हैं।

असल में, itoa पहचानकर्ता बाहरीकरण या मैक्रो के रूप में मानकीकरण के संबंध में "रेडियोधर्मी" है। यदि ऐसा फ़ंक्शन मानकीकृत है, तो इसे एक अलग नाम के तहत होना होगा।

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

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