【发布时间】:2012-01-07 21:11:13
【问题描述】:
我使用允许我将任何类型(int、double、float、char)转换为字符串的代码。我测试了程序并选择char作为类型值。
stringstream ss;
string s;
char c = '3';
ss << c;
ss >> s;
cout << "CHAR" << endl;
bitset<8> bs2( (char) c );
for( int i = (int) bs2.size(); i >= 0; i-- )
cout << bs2[i] << " ";
cout << endl;
bitset<8> bs1( (char) s.c_str()[0]);
cout << "STRING" << endl;
for( int i = (int) bs1.size(); i >= 0; i-- )
cout << bs1[i] << " ";
cout << endl;
输出是
CHAR
0 0 0 0 0 0 0 1 1
STRING
0 0 0 0 0 0 0 1 1
但我发现了一件奇怪的事情。我设置了char c = ' ',但值转换不正确。
CHAR
0 0 0 1 0 0 0 0 0
STRING
0 0 0 0 0 0 0 0 0
我找不到对此的解释以及我做错了什么。
【问题讨论】:
-
会不会是提取算子忽略了空格?
-
嗯,好问题。比我如何将任何类型转换为字符串和字符串转换为任何类型?你有什么建议吗?
-
另外你确定那是你的真实代码吗?您应该得到
bitsets 的“索引超出范围”错误,因为您从超出范围的bs2.size()开始,而不是bs2.size() - 1 -
嗯,您是否注意到您的代码打印的是 9 位而不是 8 位? :)
-
虽然它可能有效,但并不安全。
std::bitset::operator[]不执行边界检查,但是索引边界值的行为是未定义的。您可以使用std::bitset::test()来验证这一点,它会执行边界检查。此外,您可以查看输出并看到打印了 9 个数字,这对于其中包含 8 个元素的数组是不正确的。