2012-05-15 14 views
7

ファイルから読み込んだ値がchar *として格納されています。値は通貨番号、#。##、##。##、###。##です。私はchar *を私が計算で使うことができる数字に変換したい、私はatofとstrtodを試してみたところ、私はガベージ番号を与えるだけです。これを行う正しい方法は何ですか、なぜ私はそれを間違ってやっているのですか?char *をfloatまたはdoubleに変換する

これは基本的に私がやっていることです。ちょうどchar *値がファイルから読み込まれます。 tempとftemp変数を出力すると、それらはちょうどゴミで、巨大な負の数になります。

別の編集:

私は、まさにこのgccので

#include <stdio.h> 
int main() 
{ 
char *test = "12.11"; 
double temp = strtod(test,NULL); 
float ftemp = atof(test); 
printf("price: %f, %f",temp,ftemp); 
return 0; 

}

と私の出力は価格である実行しています:3344336.000000、3344336.000000

編集:ここに私のコードです

if(file != NULL) 
    { 
     char curLine [128]; 
     while(fgets(curLine, sizeof curLine, file) != NULL) 
     {    
      tempVal = strtok(curLine,"|");   
      pairs[i].name= strdup(tempVal); 
      tempVal = strtok(NULL,"|"); 
      pairs[i].value= strdup(tempVal); 
      ++i; 
     } 
     fclose(file); 
    } 

    double temp = strtod(pairs[0].value,NULL); 
    float ftemp = atof(pairs[0].value); 
    printf("price: %d, %f",temp,ftemp); 

私の入力ファイルは、このような非常に単純な名前と値のペアです:値はドルであることと

NAME|VALUE 
NAME|VALUE 
NAME|VALUE 

が解決

を金額:あなたのすべてをありがとう、私は「の代わりに%fの%dを使用してのdidnました適切なヘッダーが含まれています。

+4

問題は他の場所にある必要があります。投稿したコードは完全に有効であり、動作しています。ファイルの読み方を教えてください。 –

+0

1. 'atof'は' double'も返します:http://pubs.opengroup.org/onlinepubs/007904875/functions/atof.html – ArjunShankar

+0

2. '%d'は整数です。 '%f'を使用してください。 – ArjunShankar

答えて

21

あなたは、不足している: #include <stdlib.h>、GCCはゴミ値につながる、atofatodの暗黙的な宣言が作成されますので。

doubleの書式指定子は%fであり、%d(つまり整数)ではありません。

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char *test = "12.11"; 
    double temp = strtod(test,NULL); 
    float ftemp = atof(test); 
    printf("price: %f, %f",temp,ftemp); 
    return 0; 
} 
/* Output */ 
price: 12.110000, 12.110000 
+1

+1。右。これが問題です。 [OPが編集される前に、実際には3つの問題があった] – ArjunShankar

1

あなたが投稿したコードは正しいものであり、正しく機能するはずです。しかし、正確にはchar*にあなたが持っているものをチェックしてください。正しい値を表現するのに大きな値にすると、関数は正または負の値を返す。HUGE_VALchar*にあるものを確認し、floatdoubleがあなたのコンピュータで表現できる最大値と比較してください。

チェックthis page for strtod referenceおよびthis page for atof reference

私はあなたがWindowsとLinuxの両方で提供した例を試してみましたが、うまくいきました。

+1

http://pubs.opengroup.org/onlinepubs/007904875/functions/atof.html(C標準に準拠しています):"値が表現できない場合は、その動作は未定義です。 " – ArjunShankar

+0

値は、いずれかの可変型が表すことができる最大値よりもずっと小さく、最大値は120.55です。 – Andrew

+0

@George:cplusplus.comは使用しないでください。それはエラーでいっぱいです。オーバーフローの場合、 'atof'も' strtod'もHUGE_VALを返しません。 [cppreference](http://en.cppreference.com/w/c/string/byte/atof)によると、戻り値は未定義です。 –

0
printf("price: %d, %f",temp,ftemp); 
       ^^^ 

これはあなたの問題です。引数はタイプdoublefloatであるため、printfは可変関数であるため、ftempdoubleに昇格されるため、両方とも%fを使用する必要があります。

%dは、対応する引数がであり、doubleではないと予想しています。

printfのようなバリアント関数は、可変引数リストの引数の型を実際には分かっていません。あなたは変換指定子でそれを伝える必要があります。 printfに、最初の引数がintであると言われたので、printfは引数リストから次のsizeof (int)バイトをとり、それを整数値として解釈します。したがって最初のガベージ番号。

さて、それはほとんど保証だとsizeof (int) < sizeof (double)、そうprintfは、引数リストから次のsizeof (double)バイトを取るとき、それはおそらくtempの真ん中のバイトではなく、ftempの最初のバイトを始めています。したがって第2のごみ番号。

両方とも%fを使用してください。

関連する問題