编写atoi库函数
看到很多面試書和博客都提到編寫atoi函數(shù),在很多面試中面試官都會要求應聘者當場寫出atoi函數(shù)的實現(xiàn)代碼,但基本很少人能寫的完全正確,倒不是這道題有多么高深的算法,有多么復雜的數(shù)據(jù)結(jié)構(gòu),只因為這道題要考慮的情況比較多,大部分應聘者都沒能把所有情況都考慮到,能很好的考察應聘者的編程基本功和思考問題全面性等能力。一看到這道題目我的第一反應是這么簡單啊,不就是把一個字符串轉(zhuǎn)化成整數(shù)嗎?然后速度寫下了實現(xiàn)代碼,然后測試了下,貌似結(jié)果也正確,然后再看了看書和博客上的實現(xiàn),發(fā)現(xiàn)自己很多種情況都沒考慮進去,自己測試的也只是自己考慮的一兩種情況。
這道題目要考慮的情況還真是很多,比如:如果傳的字符串指針為NULL;如果傳的字符串為空;如果傳的字符串中包含非法的字符;如果傳的字符串中包含+-符號;如果字符串代表的整數(shù)超過了整數(shù)能表示的范圍...,看了這么多情況,真心感覺實現(xiàn)這個函數(shù)還真不是件簡單的事,下面貼出我自己重新寫的atoi函數(shù)。
1 int myError = 0; 2 3 int atoi(const char *str) 4 { 5 bool is_f = false; 6 long long result = 0; 7 8 myError = 0; 9 if (str == NULL || *str == 0) 10 { 11 myError = -1; 12 return 0; 13 } 14 if (*str == '+' || *str == '-') 15 { 16 if (*str == '-') 17 is_f = true; 18 ++str; 19 if (*str == 0) 20 { 21 myError = -1; 22 return 0; 23 } 24 } 25 while (*str) 26 { 27 if (!(*str >= '0' && *str <= '9') || 28 (!is_f && result > 0x7fffffff) 29 || (is_f && result > 0x80000000)) 30 { 31 myError = -1; 32 return 0; 33 } 34 result = result * 10 + (*str - '0'); 35 ++str; 36 } 37 if((!is_f && result > 0x7fffffff) 38 || (is_f && result > 0x80000000)) 39 { 40 myError = -1; 41 return 0; 42 } 43 return is_f ? -((int)result) : (int)result; 44 }上面代碼我將出錯的代碼保存在myError全局變量中,因為如果用返回值來表示出錯,這個會與字符串代表的整數(shù)值產(chǎn)生混淆。上面的代碼自己測試了下貌似對應上面寫得各種情況都正確,不過寫得代碼質(zhì)量不高,貼出來僅供分享,也許還有沒有考慮的情況。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: 图片加到json中,提交到服务器端处理异
- 下一篇: [0716] Jsoi B Rsss