2012-07-01 8 views
6

according documentation:मैं कैसे सुनिश्चित कर सकता हूं कि strtol() सफलतापूर्वक लौट आए हैं?

सफलता पर, समारोह एक लंबे पूर्णांक मान के रूप में परिवर्तित अभिन्न संख्या दिखाता है। यदि कोई वैध रूपांतरण नहीं किया जा सकता है, तो शून्य मान वापस कर दिया जाता है। यदि सही मान प्रतिनिधित्व योग्य मानों की सीमा से बाहर है, LONG_MAX या LONG_MIN वापस कर दिया गया है, और वैश्विक परिवर्तनीय त्रुटि को ERANGE पर सेट किया गया है।

strtol(str, (char**)NULL, 10); अगर str"0\0" कैसे समारोह में विफल रहा है या केवल "0" संख्या के साथ स्ट्रिंग परिवर्तित कर दिया है, तो पता करने के लिए कर रहा है पर विचार करें?

+1

आप पर विचार किया है 'scanf'? –

+2

@StevenLuu: 'scanf' में भी त्रुटि प्रबंधन को और भी खराब है। कुछ कार्यान्वयन आम तौर पर आपको अतिप्रवाह पर कचरा देंगे, लेकिन किसी भी तरह से त्रुटि को संकेत दिए बिना। –

उत्तर

11

ताकि आप "0" से उत्पन्न होने वाले 0 मूल्यों भेद और 0 मूल्यों "pqr" से उत्पन्न होने वाली से समान कर सकते हैं आप, यदि त्रुटि जाँच चाहते हैं एक वास्तविक सूचक पते के पारित करने के लिए की जरूरत है:

char *endptr; 
errno = 0; 
long result = strtol(str, &endptr, 10); 
if (endptr == str) 
{ 
    // nothing parsed from the string, handle errors or exit 
} 
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE) 
{ 
    // out of range, handle or exit 
} 
// all went fine, go on 
+0

देखें IIII इसे आजमाएं ! धन्यवाद! – Jack

+0

डैनियल: मुझे आपको कुछ चीजें पूछने की ज़रूरत है। क्या आप कृपया [इस चैट] (http://chat.stackoverflow.com/rooms/4064/haskell) पर आ सकते हैं? – Nawaz

+0

क्यों विफलता की जांच करने के लिए 'if (errno == ERANGE) 'क्यों नहीं? – Undefined

1

आप errno जाँच सकते हैं या दूसरा तर्क के लिए एक गैर-रिक्त मान पास और की तरह, str करने के लिए अपने जिसके परिणामस्वरूप मूल्य की तुलना:

char * endptr; 
long result = strtol(str, &endptr, 10); 
if (endptr > str) 
{ 
    // Use result... 
} 
1

IMHO, मैं atoi() या strtol() को sscanf() पसंद करते हैं। मुख्य कारण यह है कि आप मज़बूती से कुछ प्लेटफ़ॉर्म (यानी विंडोज) जब तक आप sscanf() का उपयोग (जो 1 यदि आप सफल, और 0 लौटाता है यदि आप असफल) पर त्रुटि स्थिति के लिए जाँच नहीं कर सकते हैं।

+0

मैं कुछ प्लेटफ़ॉर्म पर त्रुटि स्थिति की जांच क्यों नहीं कर सकता? IMHO: 'strtol()' विफलता पर नकारात्मक-मूल्य लौटा सकता है .. – Jack

+0

@ जैक लांग भी ऋणात्मक हो सकता है। – Turix

+0

'scanf' अतिप्रवाह पर विफलता वापस नहीं करता है। 'स्ट्रेटोल' के साथ रूपांतरण विफलता आसान है, केवल ओवरफ्लो जांचने के लिए परेशान है। –

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

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