需求:如上图为已经安装内存为8589934592Byte,字符串格式为string,需将其转换为GB显示给用户,格式依然为string;
问题:
//前部代码省略,通过命令行获取到str,这里直接将结果赋值给str
string str = "8589934592";
int n = atoi(str.c_str());
n=n/(1024*1024*1024);
char p[100]={0};
itoa(n,p,10);
str=p;
cout<<p<<endl;//输出结果为1,为什么?
分析:
通过单步调试,发现int越界,atoi处已经越界,int范围“-2147483648~2147483647”(32位),可看出最大2开头十位数,然而实际已经8开头十位数了,然而编译器并没有报错,直接给最大数,运算后为1
解决办法:
1、变量定义成float类型;
2、string转int用sscanf;
3、int转string用sprintf;
TIP:1、int超过十位数建议预判越界问题;
2、sprintf和sscanf在C++功能很强大,在某些情况下远远超过atoi等这类。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/96562.html