3

これは奇妙だと思います。

strtodが入力文字列の文字の1つ(正確には1つ)として「e」を受け入れることは理にかなっていますが、「d」も受け入れることがわかりました。

誰か説明してもらえますか?

#include < stdio.h >
#include < stdlib.h >
int main ()
{
char *s[] = {"1a1", "1e1", "1d1", "1f1"};
char * pEnd;
double d0, d1, d2, d3;
d0 = strtod (s[0],&pEnd);
d1 = strtod (s[1],NULL);
d2 = strtod (s[2],NULL);
d3 = strtod (s[3],NULL);
printf ("::: [%f] [%f] [%f] [%f] \n", d0, d1, d2, d3);
return 0;
}
4

4 に答える 4

4

「受け入れる」とはどういう意味ですか?これは私が得ている出力です

::: [1.000000] [10.000000] [1.000000] [1.000000]

strtod(C の他のすべての変換ルーチンと同様に) 「属していない」文字が見つかるまで文字列を解析します。その文字はエラーとは見なされず、単に終了文字として扱われます。の場合"1d1"、最初のみ"1"が解析され、解析は で停止し'd'ます。変換の結果は1.0(あるべき姿) です。

各呼び出しから「終了ポインター」を返すように要求した場合、ポインターが入力文字列の文字をstrtod指していることがわかります(同じことがandにも当てはまります)。'd''d''a''f'

異なる結果が得られた場合、それは使用している実装の癖に違いありません。

于 2011-06-02T15:25:04.967 に答える
3

このコードをコンパイルするためにどのコンパイラ/ライブラリを使用していますか? Visual Studio を使用していると仮定すると、次の動作が予想されます (MSDN からテキストを引用)。

strtod は、nptr が次の形式の文字列を指すことを想定しています。

[空白] [符号] [数字] [.数字] [ {d | D | e | E}[符号]数字]

ここで完全なドキュメントを見つけることができますstrtod

ライブラリの他の実装は、おそらく同様のものをサポートするでしょう。strtodただし、 found hereのマンページにdは、変換目的で有効な文字として認識されるとは記載されていません。このような場合、入力文字列の解析が停止し、その時点までに解析された文字のみが変換されます ( と を含む文字列についても同じことが起こりますa) f

strtodおそらく、ライブラリ実装のドキュメントを見て、特定のケースで解析できる形式を見つける必要があります。

于 2011-06-02T15:27:23.937 に答える
1

E の代わりに D を使用することは、double( の代わりに) データをマークアウトする Fortran の方法floatです。おそらく、それを拡張機能として受け入れる標準ライブラリを使用しています。

于 2011-06-02T15:32:40.190 に答える
0

どのプラットフォームとコンパイラ? Linux と Mac OS XI の両方で、次の結果が得られます。

::: [1.000000] [10.000000] [1.000000] [1.000000]

つまり、機能しただけeです。エラーをチェックしなかったことに注意してください...

于 2011-06-02T15:26:34.353 に答える