面试:atoi和itoa的实现

1.int atoi(const char* src)

  • nullptr指针
  • 空白字符' ','\t','\n'
  • 符号位
  •  避免值溢出
  • 出错信息保存在全局变脸errnum中
 1 int errnum = 0;
 2 int atoi(const char* src){
 3     if(src == nullptr) {
 4         errnum = -1; //empty string
 5         return 0;
 6     }
 7 
 8     //remove whitespace characters.
 9     while(*src == ' ' || *src == '\t' || *src == '\n'){
10         src++;
11     }
12 
13     int sign = 1;
14     if(*src == '+'){
15         src++;
16     }else if(*src == '-'){
17         sign = -1;
18         src++;
19     }
20     //only with sign bit
21     if(*src == '\0') {
22         errnum = -2;
23         return 0;
24     }
25 
26     long long res = 0;
27     while(*src != '\0'){
28         if(*src >= '0' && *src <= '9'){
29             res = res * 10 + *src - '0';
30             if((sign == 1 && res > 0x7fffffff) || (sign == -1 && (-1*res) < (int)0x80000000)){
31                 errnum = -3;  //out of range
32                 return 0;
33             }
34         }else{
35             errnum = -4;  //illegal character
36             return 0;
37         }
38         src++;
39     }
40     return sign*res;
41 }

2. char* itoa(int val,char* buf,size_t radix)

  • 指针有效性判断
  • 符号位
  • 基数(10,16,2进制)
  • reverse操作
 1 char* itoa(int val,char* buf,size_t radix){
 2     assert(buf != nullptr);
 3     char* p = buf;
 4     if(val < 0){
 5         *p++ = '-';
 6         val = -1 * val;
 7     }
 8 
 9     int a = 0;
10     do{
11         a = val % radix;
12         val /= radix;
13         if(a > 9){
14             *p++ = char(a-9+'a');
15         }else{
16             *p++ = (char)(a + '0');
17         }
18     }while(val != 0);
19 
20     *p = '\0';
21     //reverse
22     size_t len = strlen(buf);
23     int left = 0;
24     if(*buf == '-' || *buf == '+'){
25         left++;
26     }
27     int right = len - 1;
28     while(left < right){
29         swap(buf[left++],buf[right--]);
30     }
31     return buf;
32 }

 

posted @ 2017-07-27 17:11  wxquare  阅读(429)  评论(0编辑  收藏  举报