C++错误:s.size()与int混用
2023-09-14 09:07:02 时间
1. 背景
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1="abcd";
for(int i=0; i<s1.size()-3; ++i) cout<<s1[i];
cout<<endl;
string s2="ab";
for(int i=0; i<s2.size()-3; ++i) cout<<s2[i];
cout<<endl;
return 0;
}
现有如上程序,其功能是遍历字符串前s.size()-3个字符。运行程序发现s1可以正常打印,但s2字符个数不足3个,本不应该被打印的,但结果是打印出一串未知的字符串。
2. 分析与修改
s.size()函数返回值的实际类型是string::size_type,该类型是一个无符号整型数。在表达式中混用unsigned int与int可能产生意想不到的结果。
例如s.size()-3,由于s.size()返回无符号数,故当s.size()<3时,s.size()-3依旧是正数,而非负数。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1="abcd";
cout<<s1.size()-3<<endl;
string s2="ab";
cout<<s2.size()-3<<endl;
return 0;
}
故在将s.size()与int作加减或比较,应尽量先将其转换成int。
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1="abcd";
int n1=s1.size();
for(int i=0; i<n1-3; ++i) cout<<s1[i];
cout<<endl;
string s2="ab";
int n2=s2.size();
for(int i=0; i<n2-3; ++i) cout<<s2[i];
cout<<endl;
return 0;
}
相关文章
- 经典游戏—贪吃蛇从C++代码实现[通俗易懂]
- C、C++ 成众矢之的,这群程序员发起编程语言“革命”!
- C++模板
- 初始化磁盘_c++怎么初始化
- 深入理解C++11_c++ string char
- python3.7错误ImportError: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found
- c++的链表-链表入门(C++)
- c++的链表-C++实现简单链表
- C/C++ 文件与指针操作笔记
- C/C++ 查找指定文件HEX特征
- 一步一步地完成题目——费解的开关(C/C++语言)递推、递归、顺序思维
- 【错误记录】Ubuntu 下 VSCode 编译报错 ( 无法生成和调试,因为活动文件不是 C 或 C++ 源文件。终端进程启动失败(退出代码: -1)。终端将被任务重用,按任意键关闭。 )
- C++输入流迭代器(STL输入流迭代器)详解
- 在什么情况下,Java比C++慢很多?
- 基于C++中sprintf的错误总结详解
- C++嵌套类与局部类详细解析
- C++基础入门教程(一):基础知识大杂烩
- C++回溯法实例分析