实现字符串和整数的相互转换

即将就业,也复习复习相关的知识,看了看嵌入式C的笔试题,整体感觉考试题目还是蛮有意思的,考点都比较重要,而且比较细,主要还是设计到一些指针和数组以及函数指针等基本的概念。
比如:
如何实现两个值中的最大值:((a+b) + abs(a-b))/2
如何实现不依靠中间量实现两个变量值的交换:
a = a + b;
b = a - b;
a = a - b;
或者
a = a^b;
b = a^b;
a = a^b;
其中后面的这种方式更加的优越。
 
sizeof与strlen的区别
其中sizeof是一个操作符,在编译过程中就能确定结果,但是strlen是一个函数,只有在运行的时候才能得到返回值。
 
指针、数组、函数等各种形式的指针结合起来也是出题的重点。
 
在编程中主要是设计到字符串、链表的处理问题,我就找几个简单的程序当做练兵吧。实现整数和字符串之间的转换问题。这个转换问题实质上是处理好ASCII码与数字之间的切换关系,即数字的ASCII码形式为‘0’= 0 + 48; ‘9’= 9 + 48;0 = '0'-48。
这个关系是转换过程中最主要的问题,当然整数到字符串的转换过程中需要注意负数的影响,如果负数没有正确处理,就可能出现一些莫名其妙的结果。
 
首先实现字符串到整数的转换过程:这个过程相对来说比较容易,因为这个过程可直接判断是正数还是负数,直接判断下标0对应的内容即可,其他的可以通过逐步求和累加的形式实现。基本的转换过程如下:
  1. int myatoi(char *src)
  2. {
  3.     char flag = 0;
  4.     int sum = 0;
  5.     int i = 0;
  6.     int len = strlen(src);
  7.     
  8.     /*参数的正确性*/
  9.     if(NULL == src)
  10.     {
  11.         return 0;
  12.     }
  13.     
  14.     /*是否存在符号问题*/
  15.     if(src[i] == '-')    
  16.     {
  17.         flag = '-';
  18.         ++ i ;
  19.     }

  20.     for( ; i < len ; ++ i)
  21.     {
  22.         /*判断字符是否合法*/
  23.         if(src[i] < 48 && src[i] > 57)
  24.             return 0;
  25.         
  26.         /*数据求和,注意数值的转换问题src[i] - 48*/
  27.         sum = sum *10 + src[i] - 48;
  28.     }
  29.     
  30.     /*根据标志位实现返回正确的正负数*/
  31.     if(flag == '-')
  32.         return -sum;
  33.     else
  34.         return sum;
  35. }
整数到字符串的转换:实际上就是将一个整数的各个位分离出来,然后实现字符串的排序问题,因为数字长度的不确定性使得不便于快速的确定字符串的长度,只能首先分解,然后排序。同时也需要注意符号的存在,基本的转换过程如下:
  1. char* myitoa(int num, char *str)
  2. {
  3.     char flag = 0;
  4.     int i = 0, count = 0, j = 0;

  5.     /*参数检测*/
  6.     if(NULL == str)
  7.     {
  8.         return NULL;
  9.     }
  10.     
  11.     /*判断数值的正负,设置对应的符号*/
  12.     if(num < 0)
  13.     {
  14.         str[++] = '-';

  15.         /************************
  16.         同时要对数值取绝对值
  17.         保证后面取余整除操作正常
  18.         *************************/
  19.         num = -num;
  20.     }
  21.     
  22.     while(num / 10)
  23.     {
  24.         /***************************
  25.         count用来保存实际的数字个数,
  26.         便于后期的顺序调换
  27.         ****************************/
  28.         ++ count;
  29.         /*实际保存的顺序为反序列*/
  30.         str[i++] = num % 10 + 48;
  31.         num /= 10;
  32.     }
  33.     /*判断是*/
  34.     if(num %10)
  35.     {
  36.         str[i++] = num %10 + 48;
  37.         ++ count; 
  38.     }
  39.     /*字符串结束符*/
  40.     str[i] = 0;
  41.     
  42.     /*实现数据的较好操作*/
  43.     i = 0;
  44.     if(str[0] == '-')
  45.     {
  46.         i = 1;
  47.     }
  48.     /*实际交换的下标区间为i~j*/
  49.     j = count + i - 1;

  50.     for(; i < j ; ++ i, --j)
  51.     {
  52.         /*数据的较好操作*/
  53.         str[i] = str[i] + str[j];
  54.         str[j] = str[i] - str[j];
  55.         str[i] = str[i] - str[j];
  56.     }

  57.     /*返回实际的字符串*/
  58.     return str;
  59. }
上面的代码就实现了字符串与整数的转换问题,基本上实现了各种情况的转换。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章