【C】——itoa 函数的实现

  itoa函数的实现,函数实现功能:输入一个 int 型的数据然后修改成 十六进制的字符串。 例如:  输入 100  输出 0x64

主函数:

1 int main(void){
2     char val[12];
3     my_atoi(val,43983);
4     printf("%s
",val);
5     return 0;
6 }

正常的情况下就是使用 传入的num 除以 16,得到余数,然后循环除。但是得到的数据是反的,所以需要再把字符串逆序一下;

char change(int num){
    if(num > 9)
        return num+'A'-10;
    else
        return num+'0';
}

//颠倒数组中的元素
void swap(char* val){
    char* tmp;
    tmp = val;
    while(*++tmp);
    tmp--;
    //printf("%c
",*tmp);    
    //printf("%d
",tmp-val);
    while((tmp - val + 1) / 2){
        char ch;
        ch = *tmp;
        *tmp = *val;
        *val = ch;
        tmp--;
        val++;
    }
}
void my_atoi(char* val,int num){
    int i = 0;
    while(num/16){
        val[i] = change(num%16);    
        num /= 16;
        i++;
    }    
    val[i++] = change(num);
    val[i++] = 'x';
       val[i++] = '0';
    val[i++] = 0;
    //由于存入数组中的元素是倒序的,要把数组颠倒一下
    swap(val);    
}

上面的代码是用 指针逆序,下面用另一种方法逆序

 1 void swap2(char* val){
 2     char* tmp = val;
 3     int i = 0;
 4     int j;
 5     while(*tmp++)
 6         i++;
 7     //printf("%d
",i);
 8     for(j = 0; j < i/2; j++){
 9         char ch;
10         ch = val[j];
11         val[j] = val[i - j - 1];
12         val[i - j - 1] = ch;
13     }
14 }

  其实还有一种方法更加简便,不需要使用字符串的逆序,因为用次算法得到的数据是逆序的,所以,就想办法让字符串从最后开始输入,然后返回字符串的指针。但是有一点需要注意,首先要知道数组的长度,然后才可以得到数组的最后一个位置。所以可以在 调用此函数之前 把数组的长度赋值到数组的第一个元素里面。

 1 char* my_atoi2(char* val, int num){
 2     int i = val[0];
 3     while(--i)
 4         val++;
 5     //printf("%c
",*val);
 6     *val-- = 0;  //由于是倒着输入,所以第一个元素应该是字符串的结束符
 7     while(num/16){
 8         *val-- = change(num % 16);
 9         num /= 16;
10     }
11     *val-- = change(num%16); 
12     *val-- = 'x';
13     *val = '0';
14     return val;
15 }

main函数修改如下:

1 int main(void){
2     char val[12];
3     my_atoi(val,43983);
4     printf("%s
",val);
5     return 0;
6 }

全部代码如下:

 1 #include <stdio.h>
 2 
 3 char change(int num){
 4     if(num > 9)
 5         return num+'A'-10;
 6     else
 7         return num+'0';
 8 }
 9 
10 //颠倒数组中的元素
11 void swap(char* val){
12     char* tmp;
13     tmp = val;
14     while(*++tmp);
15     tmp--;
16     //printf("%c
",*tmp);    
17     //printf("%d
",tmp-val);
18     while((tmp - val + 1) / 2){
19         char ch;
20         ch = *tmp;
21         *tmp = *val;
22         *val = ch;
23         tmp--;
24         val++;
25     }
26 }
27 
28 void swap2(char* val){
29     char* tmp = val;
30     int i = 0;
31     int j;
32     while(*tmp++)
33         i++;
34     //printf("%d
",i);
35     for(j = 0; j < i/2; j++){
36         char ch;
37         ch = val[j];
38         val[j] = val[i - j - 1];
39         val[i - j - 1] = ch;
40     }
41 }
42 
43 void my_atoi(char* val,int num){
44     int i = 0;
45     while(num/16){
46         val[i] = change(num%16);    
47         num /= 16;
48         i++;
49     }    
50     val[i++] = change(num);
51     val[i++] = 'x';
52        val[i++] = '0';
53     val[i++] = 0;
54     //由于存入数组中的元素是倒序的,要把数组颠倒一下
55     swap2(val);    
56 }
57 char* my_atoi2(char* val, int num){
58     int i = val[0];
59     while(--i)
60         val++;
61     //printf("%c
",*val);
62     *val-- = 0;  //由于是倒着输入,所以第一个元素应该是字符串的结束符
63     while(num/16){
64         *val-- = change(num % 16);
65         num /= 16;
66     }
67     *val-- = change(num%16); 
68     *val-- = 'x';
69     *val = '0';
70     return val;
71 }
72 int main(void){
73     char val[12];
74     val[0] = 12;
75     //my_atoi2(val,43983);
76     printf("%s
",my_atoi2(val,43983));
77     return 0;
78 }
79 int main(void){
80     char val[12];
81     my_atoi(val,43983);
82     printf("%s
",val);
83     return 0;
84 }
View Code
原文地址:https://www.cnblogs.com/ngnetboy/p/3614849.html