【发布时间】:2012-10-24 08:44:45
【问题描述】:
代码:
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
using std::cerr;
using std::cout;
using std::stringstream;
using std::string;
using std::for_each;
void convert(const string& a_value)
{
unsigned short i;
if (stringstream(a_value) >> i)
cout << a_value << " converted to " << i << ".\n";
else
cerr << a_value << " failed to convert.\n";
}
int main()
{
string inputs[] = { "abc", "10", "999999999999999999999", "-10", "0" };
for_each(inputs, inputs + (sizeof(inputs)/sizeof(inputs[0])), convert);
return 0;
}
Visual Studio 编译器(v7、v8、v9、v10)的输出:
abc 转换失败。 10 转换为 10。 999999999999999999999 转换失败。 -10 转换为 65526。 0 转换为 0。g++ 的输出(v4.1.2,v4.3.4):
abc 转换失败。 10 转换为 10。 999999999999999999999 转换失败。 -10 转换失败。 0 转换为 0。我预计 "-10" 无法转换为 unsigned short 但它在 VC 编译器中成功。这是一个:
- VC 编译器中的错误?
- GNU 编译器中的错误,我的预期不正确?
- 实现定义的行为?
【问题讨论】:
-
它换行了。您的无符号短是 16 位。 stackoverflow.com/questions/2760502/…
-
垃圾输入/垃圾输出——如果你关心字符串的有效性,那么在转换之前测试它。
-
@paddy 是定义的行为。找到了一个比第一次重复更多信息的更好的 SO 问题stackoverflow.com/questions/50605/…
-
@paddy,我的期望是什么都没有,并被告知失败。该程序测试其他垃圾输入,但未能按预期转换。
-
@paddy 在这种情况下的基本理念是使用
istream进行测试。他可能应该在 if 之前声明std::istringstream,并使用if ( stream >> i >> std::ws && stream.get() == EOF )之类的东西,但是应该就足够了。
标签: c++