关于string的成员函数substr
在LKSNAPSHOT.cpp中解析接收串口的字符串時有一句:
string cmd = msg.substr(cmdstr.length()+1,cmdstr.length()-cmdstr.length()-1);
懷疑substr的參數寫錯了,然后查到相關資料,發現當長度大于字符串的長度或者小于0時,其默認至字符串末尾,因此該行語句能正常工作。
?
具體的說法如下:
這個函數的原型是substr(size_type off,size_type count)
第一個參數表示在string的char數組中的偏移量,count是從這個偏移的位置開始,字串的長度。
這兩個參數的錯誤使用將導致程序crash或者獲得錯誤的結果。
主要兩種錯誤情況,off大于數組的長度或者小于0,和count大于字符串的長度或者count小于0
對于off的錯誤,當其大于數組的長度是,即是數組越界錯誤,程序crash。
當提供的off小于0時,由于參數類型為unsigned int,所以將做強制轉化,off變為一個很大的整數,因而還是導致越界錯誤,程序crash。
對于count的錯誤,當 count + off大于數組的長度時,substr內部會先判斷是否其超過數組的長度,如果超過,其將按照數組的最大下標處理。因而其等同于substr(off,string.size()-off);
同理,當count小于0時,其將轉化為一個很大的整數,結果還是等同于substr(off,string.size()-off);
綜上,在使用該函數時,一定要注意傳入的參數,以防止程序crash,或者獲得錯誤的結果。
轉載于:https://www.cnblogs.com/ph829/p/4146860.html
總結
以上是生活随笔為你收集整理的关于string的成员函数substr的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android-Activity的执行流
- 下一篇: DiscuzX2.5视频教程