1. 程式人生 > >用c語言實現一個自己的atof()函式

用c語言實現一個自己的atof()函式

用c語言實現atof()函式,將字元分解用乘法和除法實現轉換,程式碼如下

*************************************************************************************************************************************************************************************************

#include<stdio.h>

#include<math.h>

  double my_atof(char const *str);

  int main()
  {
    char src[] = "            -456.78999";
    printf("%lf",my_atof(src));
    return 0;
  }

double my_atof(char const *str)
{
   char const *p = NULL ;
   int num;
   double ret = 0;
   int  sign = 0 ;
   while(isspace(*str))
   str++;
   if(*str == '-')
   {
   sign = -1;
   str++;
   }
   else
   {
   sign = 1;
   }
   while(isdigit(*str))
   {


     ret = ret * 10 +(*str-'0');
     str++;
   }
   if(*str == '.')
   {
     //p = str;
     p = str + 1;
     //str ++;
   }


   str ++;


   while(isdigit(*str))
   {
      ret = ret * 10 + (*str - '0');
      str ++;
   }


   num = pow(10,(str - p));


   return (ret * sign) / num;
}

這裡用到了指標減指標以獲得小數點之後的數字字元個數,指標減指標得到的是兩個指標之間的陣列元素個數,這種方法只能用於陣列,也就是連續開闢的儲存空間才能使用指標減指標。

pow()函式是包含在 math.h 檔案中的函式,用法為pow(10,N) 表示10的N次方,以此類推pow(M, N)就表示M的N次方。

此處還有個需要注意的地方,const 修飾的指標只能賦給同樣被const 修飾的指標!

*************************************************************************************************************************************************************************************************

#include<stdio.h>
#include<string.h>
#include<assert.h>


double my_atof(char const *src);
int main()
{
 double S_num;
 char str[] = "        -123.456";
 printf("%lf",my_atof(str));
 return 0;
}


double my_atof(char const *src)
{
 double Front_num = 0.0, After_num = 1.0;
 int flag;
 assert(src != NULL);                                          //判斷字串是否為空
 while(isspace(*src))
 {
   src++;
 }
 /*
 flag = (*src == '-')?-1:1;                            //此處可以用三目運算子,也可以直接用if 語句判斷,沒有本質區別
 if(*src == '-' || *src == '+')    

{

      src ++;

  }

 */
 if(*src == '-')
 {
 flag = -1;
 src++;
 }


 else flag = 1;


 while(isdigit(*src))
 {
   Front_num = Front_num * 10.0 + (*src - '0');                  //Front_num是儲存浮點數的,從第一個數字開始
   src ++;
   if(*src == '.')
   {
   src++;
   break;
  }


 }
 while(isdigit(*src))
 {
  Front_num = Front_num * 10.0 + (*src - '0');
  After_num = After_num * 10.0;//After_num是用來計小數點之後的數字字元位數
  src ++;
 }

  return flag*(Front_num / After_num);
}

這兩個程式實現的功能是一樣,基本思想也都一樣,思路也很簡單。

我正走在成為程式設計師的路上,寫這篇文章貽笑方家了