面试: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 }