2012-03-17 14 views
18

में मान्य int है या नहीं, मुझे यह जांचना होगा कि कोई सी स्ट्रिंग एक वैध पूर्णांक है या नहीं।निर्धारित करें कि सी 0 स्ट्रिंग सी

मैं दोनों

int num=atoi(str); 

और

int res=sscanf(str, "%d", &num); 

लेकिन कोशिश की लाइनों के दोनों में स्ट्रिंग "8 -9 10" भेजने बस 8 लौट आए, इस स्ट्रिंग की अमान्यता उल्लेख किए बिना।

कोई भी विकल्प सुझा सकता है?

+0

'atoi' कोई त्रुटि जांच नहीं करता है; इसका व्यवहार अगर 'str' में' int' मान का प्रतिनिधित्व नहीं है, तो यह अनिर्धारित है। (विशिष्ट कार्यान्वयन '0' वापस आते हैं।) 'Sscanf' बेहतर है, लेकिन स्ट्रिंग में मान' int' के रूप में प्रस्तुत नहीं होने पर इसका व्यवहार अपरिभाषित है। साथ ही, आपका शीर्षक कहता है कि आप एक वैध int की जांच करना चाहते हैं, लेकिन आपके प्रश्न का बॉडी "वैध पूर्णांक" कहता है; वे एक ही बात नहीं हैं। 'int' कई * पूर्णांक * प्रकारों में से एक है। –

उत्तर

29

स्ट्रेटोल() पर एक नज़र डालें, यह आपको सूचक वापसी के द्वारा स्ट्रिंग के अमान्य हिस्सों के बारे में बता सकता है।

और उत्साही उदाहरण कोड से सावधान रहें .. व्यापक त्रुटि-हैंडलिंग के लिए मैन पेज देखें।

+0

strtol() स्ट्रिंग में अगले "ऑब्जेक्ट" पर पॉइंटर सेट करता है। यह कुछ भी मान्य नहीं करता है। –

+1

@ g24l यदि वह पॉइंटर न्यूल पर इंगित करता है, तो आप जानते हैं कि पूरी स्ट्रिंग मान्य थी। यदि नहीं, नहीं। Tadaa! – blueshift

+0

यदि यह एक शून्य समाप्त स्ट्रिंग है। –

8

शायद मैं strtol या इसी तरह libc कार्यों का उपयोग नहीं है, लेकिन तर्क के बारे में इस समस्या यह है कि मुश्किल नहीं है के लिए flamed प्राप्त करेंगे:

#include <stdbool.h> // if using C99... for C++ leave this out. 
#include <ctype.h> 

bool is_valid_int(const char *str) 
{ 
    // Handle negative numbers. 
    // 
    if (*str == '-') 
     ++str; 

    // Handle empty string or just "-". 
    // 
    if (!*str) 
     return false; 

    // Check for non-digit chars in the rest of the stirng. 
    // 
    while (*str) 
    { 
     if (!isdigit(*str)) 
     return false; 
     else 
     ++str; 
    } 

    return true; 
} 

[एनबी: मैं अन्यथा करने के लिए else के बजाय isdigit(*str++) किया है हो सकता है इसे छोटा रखें लेकिन मानकों का कहना है कि मानकों का कहना है कि यह संभव है कि isdigit एक मैक्रो है।]

मुझे लगता है कि एक सीमा यह है कि स्ट्रिंग में संख्या पूर्णांक में फिट नहीं होने पर यह झूठी नहीं लौटाती है। यह आपके लिए महत्वपूर्ण हो सकता है या नहीं भी हो सकता है।

+1

"इतना कठिन नहीं", लेकिन आपको वापस आना और इसे बदलना पड़ा;) – blueshift

+1

@blueshift प्वाइंट लिया गया, लेकिन वेब फ़ॉर्म में कोड टाइप करते समय 1 मिनट में 1 संपादन मेरे लिए बुरा नहीं है। :-) – asveikau

+0

इस मामले में मुझे नहीं पता कि यह स्वयं को रोल करने के लिए अधिक त्रुटि-प्रवण है या कोशिश करने और स्ट्रेटोल() के लिए त्रुटि-हैंडलिंग प्राप्त करने के लिए .. मैं शायद अभी भी स्ट्रेटोल की अनुशंसा करता हूं। – blueshift

2

इस मजबूती के साथ क्या करने के लिए int पढ़ सकते हैं और बनाने के लिए किया जाएगा एक आसान तरीका यकीन है कि यह स्ट्रिंग प्रतिनिधित्व है इनपुट स्ट्रिंग के समान है, उदाहरण के संयोजन atoi और itoa के लिए:

int is_int(char const* p) 
{ 
    return strcmp(itoa(atoi(p)), p) == 0; 
} 
+0

अच्छा विचार :) के लिए काम नहीं करेगा। हालांकि, इसे काम करने के लिए, इसे अग्रणी और पिछली जगहों को भी ट्रिम करना होगा। – sara

+3

ध्यान दें कि यह समाधान एएनएसआई अनुपालन नहीं है। –

0

पता चल सके कि स्ट्रिंग एक में शामिल है के लिए वैध संख्या आप नियमित अभिव्यक्ति का उपयोग कर सकते हैं। पूर्णांकों के लिए उदाहरण के लिए उपयोग करें:

[- +] [0-9] +

और चल बिन्दु संख्या के लिए एक सामान्य मामला?

[+ -] [0-9] + [ ।] [0-9] * ([ईई] [- +] [0-9] +?)?

सी ++ 11 नियमित अभिव्यक्ति कार्यों के मामले में लाइब्रेरी में उपलब्ध हैं, उदा। "std :: regex_match (.....)" सटीक मिलान देता है। कोड इस तरह दिखना चाहिए:

#include <regex> 
..... 
std::string strnumber("-1.234e+01"); 
float number; 
if(regex_match(strnumber,std::regex("[+-]?[0-9]+[.]?[0-9]*([eE][-+]?[0-9]+)?")) 
number=std::stof(strnumber); 
else 
std::cout<<"error, string is not a valid number"; 
0

विषय को खोदकर निकाल लिए क्षमा करें, लेकिन पूर्णता के लिए के लिए और क्योंकि इस सूत्र पहला मैच जब एक Google खोज कर रही है ...

यह संभव है की तरह कुछ का उपयोग करें:

ret = sscanf(string, "%d%n", &number, &idx); 
if (ret == 0 || string[idx] != '\0') 
    /* handle the error */ 

%n निर्देश है, जो आदमी पृष्ठ के अनुसार मानक सी प्रतीत हो रहा है, प्रसंस्कृत वर्णों की संख्या गिना जाता है।

[संपादित करें] एसएसकेएनएफ ओवरफ्लो का पता लगाने का एक तरीका प्रदान नहीं करता है, इसलिए स्ट्रेटेक्स फ़ंक्शन परिवार को आईएमएचओ पसंद किया जाना चाहिए।

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