小心stringstream使用时的一个陷阱
2011-10-16 09:56
141 查看
前几天在调试程序时发现一个bug,和对stringstream的不当使用有关,代码如下:
char number = 0;
std::stringstream str_number;
str_number << number;
.....
这段代码的目标是把一个8位整数转换成一个字符串,但实际上不能达到这个效果。
如果在转换后加入打印信息:
std::cout << "the number is " << str_number.str() << "\n"
会打印出一个空字符串,而不是数字0。
问题出在number的类型是char上,stringstream 看到char类型,并不把它视作一个8位整数来对待,而是作为字符类型对待,
这样在保存过程中没有把对应的数字转换成ascii码,而是直接保存为0,这样就会得到一个以0为结尾的空字符串。
为了得到我们期望的结果,需要把代码改成:
str_no << (int) number;
对number做强制类型转换,使得stringstream把它看做一个整数,然后转换成对应的ascii码,这样就可以得到预期的结果了。
char number = 0;
std::stringstream str_number;
str_number << number;
.....
这段代码的目标是把一个8位整数转换成一个字符串,但实际上不能达到这个效果。
如果在转换后加入打印信息:
std::cout << "the number is " << str_number.str() << "\n"
会打印出一个空字符串,而不是数字0。
问题出在number的类型是char上,stringstream 看到char类型,并不把它视作一个8位整数来对待,而是作为字符类型对待,
这样在保存过程中没有把对应的数字转换成ascii码,而是直接保存为0,这样就会得到一个以0为结尾的空字符串。
为了得到我们期望的结果,需要把代码改成:
str_no << (int) number;
对number做强制类型转换,使得stringstream把它看做一个整数,然后转换成对应的ascii码,这样就可以得到预期的结果了。
相关文章推荐
- 使用Ubuntu12.04的时候遇到的一个小陷阱
- PHP相关系列 - PHP缓存使用的一个陷阱
- map使用时的一个小陷阱
- vector使用中可能出现的一个陷阱
- 使用数组做参数的一个陷阱(sizeof)
- 在使用C语言指针时的的一个不容易发现的陷阱
- scanf使用的一个小陷阱
- java中DelayQueue的一个使用陷阱分析
- 提防iostream使用中的一个“陷阱”
- Java并发编程:CountDownLatch的使用以及一个容易踩到的陷阱
- Generic for中使用pairs和ipairs的一个陷阱
- gcc中使用scanf的一个小陷阱
- 函数返回值为指针的一个陷阱(使用inet_ntoa函数时遇到的问题)
- Gson使用心得(二):Map反序列化的一个陷阱
- Wireshark "The NPF driver isn’t running…"(可见的驱动本质上是一个系统服务,使用net start 启动)
- 一个图片轮换显示的实现,使用DIV+JS,支持Firefox,IE,Safiri
- ipc连接时出来这个提示: 不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接。中断与此服务器或共享资源的连接,然后在试一次...
- 使用Oracle sys_guid()生成的ID更新列值时遇到的一个问题
- android中很多情况下我们需要会使用多个fragment,我们这时就需要一个showFragment来实现fragment之间的切换
- 使用use语句来导入一个命名空间