3

double を読み取る sscanf() 関数に問題があります。次のようなカンマ区切りのテキスト ファイルがあります。

ABC,DEF,0.465798,0.754314
GHI,JKL,0.784613,0.135264
MNO,OPQ,0.489614,0.745812
etc.

最初に fgets() で行を取得し、次に sscanf() を使用して 2 つの文字列と 2 つの double 変数を取得します。

fgets(buffer, 28, file);
sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);

printf("%s %s %f %f\n", string1, string2, double1, double2);

しかし、出力は次のとおりです。

ABC DEF 0.465798 0.000000
GHI JKL 0.784613 0.000000
MNO OPQ 0.489614 0.000000

そのため、どういうわけか最後のフロートをスキャンしません。試してみまし%lf[^ \t\n\r\v\f,]%lfが、まだ機能しません。

4

4 に答える 4

3

double1変数とdouble2がポインターでない限り、未定義の動作が発生します。

&これらの変数へのポインターを取得するには、address-of 演算子を使用する必要があります。

sscanf(buffer, "%3s,%3s,%lf,%lf", string1, string2, &double1, &double2);
于 2013-07-31T12:17:18.513 に答える
3

変化する

"%4[^,],%4[^,],%lf[^,],%lf[^\n]"

int result;
result = sscanf(buffer, "%4[^,],%4[^,],%lf,%lf", string1, string2, &double1, &double2);
if (result != 4) // handle error

&ondouble1と- に注意してくださいdouble2。タイプミスの可能性があります。

また、結果が 4 であることを確認することを強くお勧めします。結果を確認しないことが、sscanf()この質問の核心です。印刷された「ゼロ」は、double2スキャンされなかった結果であり、以前の値が保持されていた可能性があります。結果がチェックされていれば、問題がスキャンとsscanf()の間にあったことを示す 3 と報告されていたでしょう。しかし、より大きなシーンでは、先に進む前にすべての期待値がスキャンされたことを確認することをお勧めします。double1double2

于 2013-07-31T12:17:51.890 に答える
2
sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, double1, double2);

する必要があります

sscanf(buffer, "%3s,%3s,%lf,%lf", string1, string2, &double1, &double2);

double の注記&(のアドレス)

于 2013-07-31T12:16:08.947 に答える
1

コードが機能しなかった理由は次のとおりです。

sscanf(buffer, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);

%[...]%[^...]は実際には , のような変換タイプであり%d%xで終わるリストされた文字のシーケンスに一致する/一致しない]%s文字列を解析していても、を指定する必要がないことに注意してください。

あなたの問題は、2 つのタイプの変換タイプを組み合わせたことで%lfあり[^...]、scanf は実際には後の部分を一致する文字列と見なすため、たとえば次のコードは文字列を正常に解析します。

char *b = "ABC,DEF,0.465798[^,],0.754314[^\n]\n";
sscanf(b, "%4[^,],%4[^,],%lf[^,],%lf[^\n]", string1, string2, &double1, &double2);

最も簡単な解決策は、一部を残すことです[^,](chuxの解決策):

sscanf(b, "%4[^,],%4[^,],%lf,%lf", string1, string2, &double1, &double2);

または、フィールド幅を使用します (Joachim Pileborg と David RF のソリューション):

sscanf(buffer, "%3s,%3s,%lf,%lf", string1, string2, &double1, &double2);
于 2013-07-31T12:37:23.970 に答える