2017-03-13 1 views
2

基本的にCを使用して、ファイルからリンクリストに情報を読み込もうとしていますが、値段が浮動小数点でサイズが文字列の場合私はフロートとしてもサイズを読む必要があります。 私はこのFscanfがファイルからリンクリストに正しく浮かぶことがない

fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price); 

のようなファイルを読んでいると私は

printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price); 

で結果を確認しようとすると、ファイルの構造は、今、この

bottle-0.33:0.10 
bottle-0.50:0.20 
bottle-1.50:0.40 

のようなものであることは、同じようにすべてを印刷しますこの

bottle 0.33 8290796282473829.00 
:0.10 
bottle 0.50 2572489705689592000000000000000000000000000000000000000.00 
:0.20 
bottle 1.50 0.00 
:0.40 

誰かが間違っているのか何か手がかりを持っていますか?

+1

'%f [^:]:%f' - >'%f:%f' – BLUEPIXY

+1

私は馬鹿だと感じます。はい、文字列を読み込まないときは[^:]は必要ありません。ありがとう、あなたの命の恩人。 – user7513618

答えて

3

コードが@BLUEPIXY

// bottle-0.33:0.10 
fscanf(file,"%[^-]-%f[^:]:%f\n", pLog->name, &pLog->size, &pLog->price); 

"%[^-]"間違ったフォーマットを使用するには、​​と一致し、pLog->nameでテキストを保存します。
"-""-"と一致し、スキャンが続けられます。
"%f""0.33"と一致し、値0.33をpLog->sizeに保存します。
"["は、":"と一致しません。スキャンが停止するので、関数は2を返します。
残りの形式"^:]:%f\n"は関係ありません。

正しいフォーマット、幅制限、およびチェック結果を使用してください。

// assume sizeof pLog->name is 10 
if (fscanf(file,"%9[^-]-%f:%f\n", pLog->name, &pLog->size, &pLog->price) == 3) 
    Success(); 
} 
1

printf()コールへのポインタを渡すことで間違いがあります。

printf("%s %.2f %.2f\n", pLog->name, &pLog->size, &pLog->price); 

undefined behaviorを呼び出す形式指定子にミスマッチ引数を供給する、

printf("%s %.2f %.2f\n", pLog->name, pLog->size, pLog->price); 
            ^^^   ^^^ 

FWIWであるべきです。

また、"bottle-0.33:0.10"のような入力を一致させるには、"%[^-]-%f:%f"のようなフォーマット指定子でも十分です。

しかし、成功を確認するためには、常に戻り値scanf()と家族の呼び出しを確認する必要があります。そうしないと、初期化されていない値が使用されてしまい、UBにつながる可能性があります。

+0

申し訳ありませんが、私の側で書いている間違いでした。コード内で正しいです。私はそれを編集しようとしていましたが、あなたが速すぎるようです。 – user7513618

1

fscanfの戻り値を確認するのを忘れました。そうでなければ、何が起こったのかははっきりと分かります。

呼び出した関数の戻り値は、常にチェックしてください。

+0

2を返します。これは、明白な2つの値と一致するように管理したことを意味します。私はなぜそれが不思議です。 – user7513618

+0

あなたのコードから、 'fscanf'が2を返すことは分かっていませんでした。そうでなければ、質問に注意し、3つの変数すべてを表示せず、未定義の振る舞いになりました。 –

関連する問題