我玩了字串函式,我寫了以下一個,顯然我將 ret 字串中的第一個字符設定為寫在越界的地方,但不是例外,我得到了一個有一個額外位置的字串.
std::string StringManipulations::rev(std::string s)
{
std::string ret(s.size(), ' ');
for (int i = 0; i < s.size(); i )
{
std::string ch;
ch.push_back(s[i]);
int place = s.size() -i;
ret.replace(place,1,ch);
}
return ret;
}
我錯誤地寫在與我在函式開頭分配的原始字串大小大一的位置相對應的位置。
為什么我們沒有得到錯誤?
s = StringManipulations::rev("abcde");
std::cout << s.size();
std::cout << s;
output is : 6 _edcba
有什么幫助嗎?
uj5u.com熱心網友回復:
C 有一個零開銷規則。這意味著不應無意中執行任何開銷(例如檢查索引是否在邊界內)。您不會收到例外,因為 C 根本不會驗證索引是否有效。
對于額外的字符,這可能與(常規)c 字串有關。在 c 中,字串是沒有定義大小的 char (char*) 型別的陣列。字串的結尾用空終止符表示。C 字串向后兼容,這意味著它們也有一個空終止符。您可能用另一個字符替換了終止符,但下一個位元組也是零,這意味著您又添加了一個字符。
uj5u.com熱心網友回復:
除了上面關于空終止符的資訊之外,對您的問題的另一個答案是,檔案說它只會在位置大于字串大小時才會拋出,而不是超出字串的末尾。 字串替換api
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334521.html
上一篇:如何自己寫LINQ操作在哪里?
