2009-09-28 10 views
9

मैंने पढ़ा है कि atoi() हटा दिया गया है और यह के बराबर है कि:atoi() - स्ट्रिंग int करने के लिए

(int)strtol(token_start, (char **)NULL, 10); 

कि अर्थ है कि मेरे atoi(chr) के बजाय ऊपर का उपयोग करना चाहिए या यह सिर्फ कह रहा है कि वे बराबर हैं करता है?

+3

'atoi' के साथ मेरी समस्या: 'assert (atoi (" 0 ")! = Atoi (! Blah")) ' – sbi

उत्तर

9

यह ऐप्पल के Mac OS X Manual Page for atoi(3) (और बीएसडी मैन पेजों में भी) पर कहता है कि atoi को बहिष्कृत कर दिया गया है।

atoi() फ़ंक्शन strtol द्वारा() पदावनत किया गया है और नहीं किया जा नए कोड में इस्तेमाल किया जाना चाहिए।

मैं सिर्फ इतना है कि कारण के लिए strtol() बराबर का प्रयोग करेंगे, लेकिन मैं शक आप atoi() के बारे में हटाया जा रहा चिंता करने की ज़रूरत।

http://www.codecogs.com/library/computing/c/stdlib.h/atoi.php कार्यान्वयन से नोट्स

* The atoi function is not thread-safe and also not async-cancel safe. 
* The atoi function has been deprecated by strtol and should not be used in new code. 

+2

क्या यह केवल 'atoi' के आंतरिक कार्यान्वयन पर निर्भर नहीं है 'क्या यह थ्रेड-सुरक्षित है या नहीं? अगर नहीं, तो क्या यह बाहर थ्रेड-सुरक्षित नहीं बनाता है? – SasQ

+2

उन्होंने इसे थ्रेड सुरक्षित बनाने के लिए वास्तव में कड़ी मेहनत की कोशिश की होगी। निष्पक्ष कार्यान्वयन सुनिश्चित है। –

+2

टूटा लिंक गैर-आधिकारिक स्रोत ... –

-2

इसका मतलब है कि एक बिंदु पर atoi अब और उपलब्ध नहीं होगा। तो अब अपना कोड बदलना शुरू करें

+0

मुझे वह हिस्सा मिलता है, लेकिन यह सोच रहा था कि अगर एटोई के कार्यान्वयन को उपर्युक्त कोड कहा जाता है। – user105033

+3

यह है गलत, उद्धरण वांछित। वर्तमान सी मानक में कुछ भी इंगित नहीं करता है कि atoi को बहिष्कृत किया गया है। और यह जवाब 6 साल बाद किया गया था, सी 11 सक्रिय मानक होने के साथ। – Lundin

4

description of atoi() समानता के संबंध में एक बहुत महत्वपूर्ण बात है/मतभेद strtol()

> ... The call atoi(str) shall be equivalent to:
को
> except that the handling of errors may differ.

मनोरंजन के लिए इस प्रयास करें:

const char *buf = "forty two"; 
int t1 = atoi(buf);    /* detect errors? */ 
int t2 = strtol(buf, NULL, 10); /* detect errors? */ 

+0

मैंने अपने कंपाइलर (जीसीसी) पर अपना कोड आजमाया है और दोनों ने मुझे '0' दिया है, इसलिए मुझे कोई अंतर नहीं दिख रहा है: | – SasQ

+0

हम्म, मेरा बुरा! धन्यवाद @ एसएएसक्यू। मैंने सोचा कि 'strtol' को त्रुटि पर' errno' सेट करना था, लेकिन उपरोक्त मेरे टेस्ट कोड के विशिष्ट मामले में, यह नहीं है। – pmg

+0

@pmg आपका टेस्ट कोड बिल्कुल 'errno' की जांच नहीं करता है। – Dan

2

नहीं, आप ऊपर atoi के बजाय प्रयोग नहीं करना चाहिए।

आप वास्तव में त्रुटि जानकारी की जाँच करनी चाहिए कि strtol उपलब्ध बनाता है:

i = atoi(s); 

द्वारा

char* stopped; 
i = (int)strtol(s, &stopped, 10); 
if (*stopped) { /* handle error */ } 
8

atoi प्रतिस्थापित किया जाना चाहिए पदावनत नहीं है, अपने स्रोत सही नहीं है। वर्तमान सी मानक आईएसओ 98 99: 2011 में कुछ भी यह इंगित करता है (उदाहरण के लिए अध्याय 6.11 भविष्य की भाषा निर्देशों के लिए देखें), न ही पिछले मानकों में कुछ भी।

सी मानक के अनुसार, atoi, के रूप में इस प्रकार C11 7.22.1.2 strtol के बराबर है:

atoi, Atol, और एटोल कार्यों कन्वर्ट स्ट्रिंग की प्रारंभिक भाग में nptr द्वारा की ओर इशारा किया int, long int, और लंबे समय तक int प्रतिनिधित्व, क्रमशः।

त्रुटि पर व्यवहार के अलावा, वे,

atoi: (int)strtol(nptr, (char **)NULL, 10)

atol: strtol(nptr, (char **)NULL, 10)

atoll: strtoll(nptr, (char **)NULL, 10)

strtol पसंद किया जाता है के बराबर हैं atoi के रूप में त्रुटि होने पर अपरिभाषित व्यवहार का आह्वान। 7.22.1 देखें "यदि परिणाम का मूल्य प्रदर्शित नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है।"

+1

(हाँ मुझे पता है कि यह प्रश्न बहुत पुराना है लेकिन स्वीकार्य उत्तर गलत है, इसे स्पष्ट किया जाना था) – Lundin

+1

"यदि परिणाम का मूल्य प्रदर्शित नहीं किया जा सकता है, तो व्यवहार अपरिभाषित है"। निश्चित रूप से यह फ़ंक्शन पूरी तरह से अनुपयोगी बना देता है, और फ़ंक्शन को प्रभावी रूप से बहिष्कृत करने पर विचार करने के पर्याप्त कारण हैं। –

+0

@ विलियम पर्सेल वास्तव में। सी मानक समिति को दो दशकों तक दें और उन्हें एहसास हो सकता है। उदाहरण के लिए, 'होट' को हटाने में उन्हें 22 साल लग गए। दक्षता और पहल का बहुत प्रतीक। इसे मिसा-सी सुरक्षित सबसेट मानक के साथ तुलना करें, जिसने 1 99 8 के आरंभ में एटीओ * कार्यों के सभी उपयोगों पर प्रतिबंध लगा दिया था। – Lundin

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