實現字符串和整數的相互轉換

即將就業,也複習複習相關的知識,看了看嵌入式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. }
上面的代碼就實現了字符串與整數的轉換問題,基本上實現了各種情況的轉換。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章