14

ファイルから読み込んだ値があり、char*として保存されています。値は、通貨番号#。##、##。##、または###。##です。char *を計算に使用できる数値に変換したいのですが、atofとstrtodを試しましたが、ゴミの数値が表示されます。これを行う正しい方法は何ですか、そしてなぜ私がそれを間違っているのですか?

これは基本的に私が行っていることであり、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を使用していて、適切なヘッダーが含まれていませんでした。

4

3 に答える 3

31

インクルード:が欠落している #include <stdlib.h>ため、GCCはとの暗黙の宣言を作成し、atofガベージatod値につながります。

また、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
于 2012-05-15T17:40:52.333 に答える
1

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

このページをstrtod参照してください。このページをatof参照してください

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

于 2012-05-15T17:26:54.913 に答える
0
printf("price: %d, %f",temp,ftemp); 
              ^^^

これがあなたの問題です。引数はtypedoubleとであるため、両方floatに使用する必要があります(可変個引数関数であるため、に昇格されます)。 %fprintfftempdouble

%d対応する引数が。intではなくタイプであることが期待されますdouble

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

現在、sizeof (int)<がほぼ保証されているsizeof (double)ため、引数リストからprintf次のsizeof (double)バイトを取得する場合、おそらく;tempの最初のバイトではなく、の中央のバイトから開始します。ftempしたがって、2番目のガベージ番号。

両方に使用%fします。

于 2012-05-15T17:51:59.763 に答える