zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    开源APM应用性能管理工具调研
    Inside ARC — to see the code inserted by the compiler
    报表应用系统中怎样正确使用图表功能
    创建cifs系统案例之“实现将Windows磁盘共享至Linux”
    Eclipse快捷键 10个最有用的快捷键
    如何生成KeyStore
    android中调用系统的发送短信、发送邮件、打电话功能
    android自带theme
    Android 报错:Conversion to Dalvik format failed: Unable to execute dex: java.nio.BufferOverflowException. Check the Eclipse log for stack trace.
    Android oncreate onupgrade什么时候被调用
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/3614849.html
Copyright © 2011-2022 走看看