C++錯誤:s.size()與int混用


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

??現(xiàn)有如上程序,其功能是遍歷字符串前s.size()-3個字符。運(yùn)行程序發(fā)現(xiàn)s1可以正常打印,但s2字符個數(shù)不足3個,本不應(yīng)該被打印的,但結(jié)果是打印出一串未知的字符串。

2. 分析與修改

??s.size()函數(shù)返回值的實際類型是string::size_type,該類型是一個無符號整型數(shù)。在表達(dá)式中混用unsigned intint可能產(chǎn)生意想不到的結(jié)果。
??例如s.size()-3,由于s.size()返回?zé)o符號數(shù),故當(dāng)s.size()<3時,s.size()-3依舊是正數(shù),而非負(fù)數(shù)。

#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作加減或比較,應(yīng)盡量先將其轉(zhuǎn)換成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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容