zoukankan      html  css  js  c++  java
  • 面试:atoi和itoa的实现

    1.int atoi(const char* src)

    • nullptr指针
    • 空白字符' ',' ',' '
    • 符号位
    •  避免值溢出
    • 出错信息保存在全局变脸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 == '	' || *src == '
    '){
    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 == '') {
    22         errnum = -2;
    23         return 0;
    24     }
    25 
    26     long long res = 0;
    27     while(*src != ''){
    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 = '';
    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 }
  • 相关阅读:
    C#之事件
    C#之委托
    CIC许可更新
    HMP许可更新
    知识库上传
    [转]spring中<tx:advice></tx:advice>意义
    [转]spring property标签中的 ref属性和ref 标签有什么不同
    [转] Spring@Autowired注解与自动装配
    [转]SpringMVC入门
    [转]SpringMVC拦截器详解[附带源码分析]
  • 原文地址:https://www.cnblogs.com/wxquare/p/5135612.html
Copyright © 2011-2022 走看看