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 }