2012-08-10 48 views
2

當我嘗試將char轉換爲float我使用ATOF,它不是返回整條價值,& 如何糾正這種是否有任何其他的方法來做到這一點?ATOF()不考慮整個價值在Symbian

如果我給這個長度值(700.898)它返回正確的值。如果我給3個以上的數字,那麼只會遇到問題。如果我問任何問題,請聯繫我。

float flt = 71237.898; 
char myfloat[50]; 
sprintf (myfloat, "%f", flt); //myfloat = 71 237.8984380 
float f = atof(myfloat); //f = 71.0000 

刪除空格:

int myfllen = strlen(myfloat); 
    for(int b=0;b<strlen(myfloat);b++) 
     { 
     if(myfloat[b] == ' ') 
      { 
      int c = b; 
      while(c<=myfllen) 
       { 
       myfloat[c] = myfloat[c+1]; 
       c++; 
       } 
      } 
     } 
+0

可以yopu發佈您遇到問題的情況嗎? – 2012-08-10 05:03:23

+0

他確實發佈了這個案例......代碼是他發現的問題 – DanZimm 2012-08-10 05:05:23

+0

@DanZimm代碼工作正常http://codepad.org/z77DEjq9 – 2012-08-10 05:08:43

回答

4

你真的有71237之間的空間sprintf後,你在發表的評論?如果是這樣,那麼這很可能是atof71之後停止解析字符串的原因。您實際上可以切換到strtod(總是比atof更好的主意),並要求它爲您提供導致其停止解析的字符位置。

顯然你的區域設置使得sprintf使用空格作爲數字組分隔符。同時atof不是區域意識。語言規範不要求atofstrtod)識別區域設置以外的語言環境特定的數字格式,而不是"C"語言環境。

setlocale(LC_ALL, "C")之前sprintf它應該有希望擺脫那個空間。或手動清理這些空間。

+0

猜測sprintf可能會這樣做?否則不知道 – DanZimm 2012-08-10 04:58:05

+0

是的,這是正確的,但我沒有給予任何空間的價值。如何避免與sprintf空間? – 012346 2012-08-10 05:02:03

+0

@ 20120:正如我上面所說的,在執行'sprintf'之前切換到'「C」'locale。 C程序實際上應該以「C」語言環境開始。是否有機會有人更改程序中當前的區域設置?如果是這樣,您可能必須保存並恢復原始語言環境。 – AnT 2012-08-10 05:04:32

0

我用你的代碼,使小程序

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
double flt = 71237.898; 
char myfloat[50]; 
sprintf (myfloat, "%f", flt); 
double f = atof(myfloat); 
printf("answer is %f",f); 
return 0; 
} 

賦予的

answer is 71237.898000 

看到http://codepad.org/GMWScwqK

輸出我想你,因爲使用浮動的返回值的問題....但在真實atof返回雙倍值...

+0

不,這不是問題。 'atof()'返回的'double'值將被隱式轉換爲'float',並且會保持相同的值(精度會有所下降)。 – 2012-08-10 05:11:25

+0

@KeithThompson yea你是對的.. – 2012-08-10 05:16:01