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;
}