2011-10-31 6 views
6

को समझना मैं कश्मीर & आर किताब से सी जानने के लिए हो रही एक अजगर प्रोग्रामर हूँ। यह एक बहुत ही मामूली सवाल की तरह प्रतीत होता है, लेकिन फिर भी मैं स्टंप हो गया हूं। नीचे संलग्न K& आर (आरआईपी रिची!) पुस्तक से कोड का एक स्निपेट है जो atoi() फ़ंक्शन लागू करता है।एक atoi() फ़ंक्शन

atoi(s) /*convert s to integer */ 
char s[]; 
{ 
    int i, n, sign; 
    for (i=0; s[i]==' '||s[i] == '\n' || s[i] == '\t'; i++) 
    ; /* skip whitespace */ 
    sign = 1; 
    if (s[i] == '+' || s[i] = '-') /* sign */ 
     sign = (s[i++] == '+') ? 1 : -1; 
    for (n=0; s[i] >= '0' && s[i] <= '9'; i++) 
     n = 10 * n + s[i] - '0'; 
    return (sign * n); 
} 

मेरे सवालों का:

1) पहली पाश 'के लिए' वैध characaters की संख्या की गणना के अतिरिक्त कोई उद्देश्य पूरा करता है?
2) यदि (1) सत्य है, तो पहला लूप 'i' के मान को मान्य वर्णों की संख्या में सेट करता है - लूप के लिए दूसरा कैसे 0 को रीसेट किए बिना काम करता है?

उदाहरण के लिए कहें मैं फ़ंक्शन में इनपुट के रूप में '2 9 2 9' दर्ज करता हूं। लूप के लिए पहला मैं 3 से सेट करता हूं, तो शेष कार्य कैसे काम करता है? मेरे पास मेरी मूल बातें सभी गड़बड़ हो सकती हैं लेकिन किसी भी मदद की वास्तव में सराहना की जाएगी। धन्यवाद, -क्रेग

+1

मुझे पता नहीं था कि सी _that_ भयानक है। –

+0

मुझे लगता है कि कोड के टुकड़े को समझने का सबसे अच्छा तरीका यह है कि इसे डीबगर (उदा। जीडीबी) के साथ निष्पादित करना है, और चरण-दर-चरण आगे बढ़ें। कोड को पढ़ने और अंदर की टिप्पणियां भी मदद कर सकती हैं। – eyalm

+0

@PatrickB .: old_ सी आधुनिक सी _very है कि लग रहा है ... बिल्कुल वैसा ही :) – Mat

उत्तर

10
int atoi(char* str) 
{ 
    if(!str) 
     printf("Enter valid string"); 

    int number = 0; 
    char* p = str; 

    while((*p >= '0') && (*p <= '9')) 
    { 
     number = number * 10 + (*p - '0'); 
     p++; 
    } 
    return number; 
} 

एटीओआई के पीछे पूरा विचार यहां दिया गया है।

1) आप चार सरणी

2 के शुरू में सूचक सेट) और फिर अंदर जबकि पाश आप प्रत्येक चरित्र पर जाने और 10 से गुणा करें और 0.

से घटाकर चरित्र जोड़ने और यदि आप 2 9 2 9 के साथ प्रयास करेंगे। संख्या 2 9 2 9 भी होगी।

+0

ओपी में वापस दूर कश्मीर एंड आर के लिए जा रहा है, तो मैं आपको बताएंगे कि C89 में, तुम नहीं घोषणाओं मध्य कोड में डाल कर सकते हैं: http://stackoverflow.com/questions/288441/variable-declaration-placement- इन-सी – HostileFork

4

पहले पाश क्या करता है टिप्पणी कहते हैं: यह खाली स्थान के छोड़ देता है।

इसके बाद, i पहले गैर-व्हाइटस्पेस चरित्र की अनुक्रमणिका है, जो आपको आगे बढ़ने की ज़रूरत है।

1

नहीं, पहला लूप व्हाइटस्पेस छोड़ देता है, जैसा कि टिप्पणी कहता है।

1

टिप्पणी उत्तर प्रदान करती है: पहला लूप स्किप व्हाइटस्पेस पर है। 2992 के लिए, i0 रहेगा।

1

मैं पहले गैर-सफ़ेद चरित्र को इंगित करने के पाश अग्रिमों के लिए पहले।

सशर्त छोरों के बीच, संकेत का ध्यान करता है, यदि कोई हो।

फिर लूप के लिए अंतिम वास्तविक रूपांतरण करता है।

अंत में, संकेत लागू किया गया है, और परिणाम लौटा दिया गया है।

0

1) लूप के लिए कोई भी व्यक्ति चरित्र की संख्या की गणना नहीं करता है, लेकिन यह संख्या की पहली स्थिति की गणना करता है अगर केवल अक्षर शुरू हो रहा है यानी "-29 9 2" के लिए मैं 1 और 2 9 2 9 के लिए होगा 0. 2) sign = (s[i++] == '+') ? 1 : -1; यह कथन जांचता है कि क्या I \ 'char char एक संकेत है और काउंटर को 1 [i ++] द्वारा बढ़ाता है और अगले लूप के लिए यह स्ट्रिंग में पहला प्रारंभिक अंक है। अगर मैं 0 बनाता हूं तो पहले सशर्त इनपुट के लिए आपका चेकिंग चार्टर अंतरिक्ष होगा!

संपादित 1: पहला इनपुट "स्पेस स्पेस -29 9 2"

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