4

{float}{single-letter-identifier}たとえば15.6E、またはのフォームの入力を受け入れたいプロジェクトに取り組んでい10Wます。

これを行うには、入力文字列を取得し、最後の文字を削除してから、を使用して浮動小数点数に変換できるかどうかを確認できると思いましたstd::stof。これはブロックにネストされ、try-catch無効な入力をユーザーに通知できるようになります。

ここでのSTLのオープンスタンダード(653ページ)は、次のように述べていますstd::stof

invalid_argumentwcstodまたはwcstoldが、変換を実行できなかったと報告した場合。

ただし、変換できないものが渡された場合はスローされません"48East"。この動作を再現するためのコードサンプルを以下に示します。

std::wstring szString = L"48East";
try{
     float f = std::stof(szString);
} catch( ... )
{
     std::cout << "test" << std::endl;
}

これは、MSVC10でデバッグモードでコンパイルされて/Odいるため、呼び出しが最適化されていないと想定しています。

助けていただければ幸いです(または、仕様をどこで誤解/誤解したかについてのガイダンスです!)。

4

2 に答える 2

7

私が読んでいると、stof変換できないものが見つかるまで、入力文字列をできるだけ多く変換します。何も変換できない場合は、スローしinvalid_argumentます。

于 2012-07-11T23:43:27.507 に答える
2

MSVC実装は、有効な文字を最初から解析して正常に変換するため48F、上記の場合の結果になります。代わりに"East48"、期待どおりに無効な引数の例外が発生する場合。

編集:さらに、オプションのindex outパラメーターを渡すと、関数は変換に使用されなかった重要でない文字のインデックスを報告します。上記の例では、これにより次のようなことができます。

std::wstring szString = L"48East";
try{
     size_t i(0);
     float f = std::stof(szString, &i);
     std::cout << f << szString.substr(i).c_str() << std::endl;
} catch( ... )
{
     std::cout << L"test" << std::endl;
}

出力を生成します48East

于 2012-07-11T23:43:21.080 に答える