【C】——itoa 函数的实现

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

主函数:

1 int main(void){

2     char val[12];

3     my_atoi(val,43983);

4     printf("%s\n",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\n",*tmp);    

    //printf("%d\n",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\n",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\n",*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\n",val);

5     return 0;

6 }

全部代码如下:

【C】——itoa 函数的实现
 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\n",*tmp);    

17     //printf("%d\n",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\n",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\n",*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\n",my_atoi2(val,43983));

77     return 0;

78 }

79 int main(void){

80     char val[12];

81     my_atoi(val,43983);

82     printf("%s\n",val);

83     return 0;

84 }
View Code

 

你可能感兴趣的:(函数)