2016-03-15 107 views
0

我需要將字符串(如「3.456」)轉換爲不帶atof()或任何其他字符串操作函數的float類型。下面是我的代碼,它適用於c字符串到int的轉換,但顯然由於句點而不能用於float。我需要添加什麼來處理這段時間?謝謝。C字符串浮點轉換

#include <stdio.h> 

int size; 
char string[] = "345"; 
int result = 0; 
int i = 0; 

int findLength(char string[]){ 

for(size = 0; string[size]!='\0'; size++){ 

} 
return size; 
}; 

void conversion(char string[]){ 

result = result * 10 + (string[i] - '0'); 
if (i < size - 1) { 
i++; 
conversion(string); 
} 
} 

int main(int argc, const char * argv[]) { 
findLength(string); 
conversion(string); 
printf("%d\n", result); 
return 0; 
} 
+1

正確執行此操作需要幾千行代碼。 –

+0

大量關於interwebs的例子,例如[atof.c](http://www.opensource.apple.com/source/python/python-3/python/Python/atof.c) –

+0

我會用char-by-char狀態機。也許這只是我.. :) –

回答

0

別的之前,我想對你瞭解這一點很重要如何浮點數工作,以及它們是如何表示的,至少在C在此question/reply尋找更多的信息。

現在回到你的問題。由於float在內存中的表示方式,您可能無法獲得確切的轉換。也就是說,您可能無法將「3.456」完全轉換爲保存值3.456的浮點數。你只能接近你想要的確切值。

一兩件事情你的代碼錯誤:

  • 我就從我的代碼,除非必要使用全局變量望而卻步。您將「大小」定義爲全局變量,這不是一個好習慣。
  • 使用標準庫strlen函數獲取字符串的長度,而不是重寫這樣做的函數。

下面,你會發現一個工作解決方案。做轉換的方法是如下:

  • 掃描通過字符串得到小數點
  • 的位置。如果遇到非點字符,把它添加到結果
  • 當你通過字符串掃描完成後,您需要考慮小數點前的數字的強弱。例如,小數點前的第一位數字只是簡單地添加到結果中。小數點前的第二位數字乘以10.0並添加到結果中,依此類推。這是通過一個簡單的while循環完成的,如代碼所示。
#include <stdio.h> 
#include <string.h> 
float stringToFloat(char *string) 
{ 
    float result= 0.0; 
    int len = strlen(string); 
    int dotPosition = 0; 

    for (int i = 0; i < len; i++) 
    { 
     if (string[i] == '.') 
     { 
      dotPosition = len - i - 1; 
     } 
     else 
     { 
      result = result * 10.0 + (string[i]-'0'); 
     } 
     } 

     while (dotPosition--) 
     { 
     result /= 10.0; 
     } 

    return result; 
} 

int main() 
{ 
    char string[] = "3.456"; 

    printf("%f\n",stringToFloat(string)); 
} 

我希望這有助於。

P.S:您可以通過使用double而不是float來提高精度。

+0

您的回覆非常有幫助謝謝! –

+0

這可以起作用,因爲你不關心如何獲得所謂的「正確舍入」結果。例如,對於「1234.56」,正確答案是1234.56005859375(如果您打印所有數字),即十六進制數爲0x1.34a3d8p10。您的代碼返回1234.5599365234375,或十六進制0x1.34a3d6p + 10;這是一個「最後一個單位」,低於正確的值。 (另外,你可能需要在文字後面加上'f'後綴,所以你的中間值是浮動值,而不是雙倍值。) –