簡體   English   中英

為什么使用默認構造函數構造時的 std::string object 行為不同?

[英]Why std::string object when constructed with default constructor behaves differently?

我嘗試了以下程序:

#include <iostream>
#include <string>

int main ()
{
  std::string str;
  str[0] = 'o';
  str[1] = 'k';
  std::cout << str.length();
  std::cout << "as a whole :";
  std::cout << str << std::endl;
  std::cout << "character by character :";
  std::cout << str[0] << str[1] << std::endl;      
  return 0;
}

我不明白為什么我不能使用 object 變量作為一個整體打印字符串,以及為什么長度返回為0 ,因為很明顯我已經使用下標運算符添加了字符,因為這將返回 char 引用,所以我知道這是合法的。

此外,我沒有得到任何異常。 所以就是這樣。 顯然, std::string class 的幕后發生了很多事情,我知道我遺漏了一些東西。 有人可以幫我解決這個問題嗎?

我不明白為什么我不能將整個字符串打印出來 [...] ...

因為您正在經歷未定義的行為

這個

std::string str;

構造一個帶有0個 memory 分配的默認字符串。 意思是通過std::string::operator[]進行修改將導致asses out of bounds undefined behavior 因此,任何事情都可能發生。 在您的情況下,長度返回0


[...] 顯然我已經使用下標運算符添加了字符,因為這將返回 char 引用,所以我知道這是合法的。

,由於上述原因,您沒有。 作為參考, std::string::operator[]

返回對指定位置 pos 的字符的引用。 執行邊界檢查。 如果 pos > size(),則行為未定義。


作為可能的修復,您可能希望在訪問元素之前std::string::resize

#include <string>

std::string str;
str.resize(2);
str[0] = 'o';
str[1] = 'k';
// ... now it has defined behaviour

std::string::push_back每個字符到字符串中。

#include <string>

std::string str;
str.push_back('o');
str.push_back('k');
// ... now it has defined behaviour

您有一個長度為0的字符串,然后您嘗試使用下標運算符修改其內容。 這是未定義的行為,因此在這一點上,不能保證特定的結果。 如果您使用at()代替,它會暴露錯誤並引發異常。

為什么長度返回為 0

它從0開始,你沒有做任何事情來添加它(例如push_back+= )。 但是話又說回來,由於您之前所做的是未定義的行為,因此這里可能發生任何事情。

此外,我沒有得到任何異常。

您可以嘗試使用std::string::at ,當您嘗試時會拋出std::out_of_range異常。

您沒有向空字符串str添加任何內容。 相反,您正在嘗試編輯空字符串的不存在元素。 std::string的下標運算符不會自動添加元素。 (與std::map不同)此外,不能保證下標運算符會引發一些異常。 如果你想要安全下標操作,你可以使用std::string::at function。

您可以使用+=運算符將 append 用於您的字符串。

str += 'o';
str += 'k';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM