सी

2017-04-30 26 views
6

में चार को जोड़ने के बिना पार्स इंटीजर मैं एक पूर्णांक पार्स करना चाहता हूं लेकिन मेरा निम्नलिखित कोड स्ट्रिंग्स को "3 बी" भी स्वीकार करता है जो संख्या के रूप में शुरू होता है लेकिन वर्णों को जोड़ता है। मैं ऐसे स्ट्रिंग्स को कैसे अस्वीकार करूं?सी

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int n; 
    if(argc==2 && sscanf(argv[1], "%d", &n)==1 && n>0){ 
     f(n); 
     return 0; 
    } 
    else{ 
     exit(EXIT_FAILURE); 
    } 
} 
+4

आप 'sscanf()' का उपयोग नहीं करते हैं; आप 'strtol()' या इसी तरह का उपयोग करते हैं, और जांचें कि अंतिम पॉइंटर बिंदु कहां है। या, यदि आपको 'sscanf() 'का उपयोग करना होगा, तो आप' int pos; ... अगर (... && sscanf (argv [1], "% d% n", & n, और pos) == 1) '- ध्यान दें कि '% n' को रूपांतरण के रूप में नहीं गिना जाता है, इसलिए तुलना अभी भी' 1', '2' नहीं। फिर आप जांचें कि क्या 'argv [1] [pos] 'एक शून्य बाइट है या नहीं, शिकायत है कि यह नहीं है। –

+0

http://stackoverflow.com/questions/13199693/what-does-the-n-stand-for-in-sscanfs-d-n-i-n –

उत्तर

4

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

strtol (Sample code from tutorial points)

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char str[30] = "2030300 This is test"; 
    char *ptr; 
    long ret; 

    ret = strtol(str, &ptr, 10); 
    printf("The number(unsigned long integer) is %ld\n", ret); 
    printf("String part is |%s|", ptr); 

    return(0); 
} 

का उपयोग कैसे करें strtol के अंदर, यह str स्कैन करता है, एक सूचक शब्द संग्रहीत करता है, तो संख्या का आधार परिवर्तित किया जा रहा। यदि आधार 2 और 36 के बीच है, तो इसका उपयोग संख्या के रेडिक्स के रूप में किया जाता है। लेकिन मैं शून्य डालने की सलाह देता हूं जहां 10 है इसलिए यह स्वचालित रूप से सही संख्या चुन लेगा। शेष ret में संग्रहीत है।

+0

आपको समझाया जाना चाहिए कि '3b' 'जैसे तारों को कैसे अस्वीकार करना है। –

0

ctype.h पुस्तकालय आप समारोह isdigit (चार) समारोह है कि रिटर्न कि क्या तर्क के रूप में प्रदान की चार अंक के है या नहीं प्रदान करता है।
आप argv [1] पर फिर से शुरू कर सकते हैं और इसे इस तरह से जांच सकते हैं।

+0

'isdigit()' का उपयोग करना उचित है यदि केवल एकल-अंक पूर्णांक स्वीकार्य हैं। यदि बहु-अंक पूर्णांक की अनुमति है, तो 'isdigit()' इतना अच्छा समाधान नहीं है। स्ट्रिंग-टू-इंटीजर रूपांतरण फ़ंक्शन का उपयोग करना बेहतर होता है जो 'atoi() 'के बजाय रूपांतरित करता है (इसलिए' strtol() 'et al)। –