【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 }
全部代码如下:
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 }