4

我正在做一个项目,我想接受表单的输入{float}{single-letter-identifier},例如15.6E,或10W

为此,我认为我可以获取输入字符串,去掉最后一个字母,然后检查是否可以使用std::stof. 这将嵌套在一个try-catch块中,并允许我通知用户输入无效。

这里的 STL 的开放标准(第 653 页)指出std::stof

invalid_argument如果 wcstod 或 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 回答