簡體   English   中英

為什么 cout 不打印這個字符串?

[英]why cout is not printing this string?

所以,我是 C++ 的新手,我不知道為什么會這樣。 我有一個包含所有字母的字符串,我將其中的 10 個字符復制到一個新字符串s2中,使用如下的 for 循環逐個字符,當我執行它時, cout function 正在打印一個空行。

#include <iostream>

using namespace std;

int main(){
    string s = "abcdefghijklmnopqrstuvwxyz";
    string s2;
    for(int i=0; i<10; i++){
        s2[i] = s[i];
    }
    cout << s2 << endl;
    return 0;
}

但是當我逐字符打印這個字符串s2時,我得到了正確的 output

#include <iostream>

using namespace std;

int main(){
    string s = "abcdefghijklmnopqrstuvwxyz";
    string s2;
    for(int i=0; i<10; i++){
        s2[i] = s[i];
    }
    
    for(int i=0; i<10; i++){
        cout << s2[i];
    }
    return 0;
}

任何幫助,將不勝感激!

您的兩個代碼都有未定義的行為 string s2; 只需將s2初始化為不包含任何元素的空std::string 嘗試以s2[i]的方式訪問元素會導致 UB,這意味着一切皆有可能。 (即使它似乎在您的第二個代碼片段中給出了正確的 output 。)

您可以使用push_back到 append 元素作為

for(int i=0; i<10; i++){
    s2.push_back(s[i]);
}

或者

for(int i=0; i<10; i++){
    s2 += s[i];
}

或者您可以預先制作包含 10 個元素的s2

string s2(10, '\0'); // or... string s2; s2.resize(10);
for(int i=0; i<10; i++){
    s2[i] = s[i];
}

創建一個空字符串s2 s2[i] = s[i]; 不會調整字符串的大小,但會導致未定義的行為。 解決問題的一種方法是 append 每個字符。 這將改變大小並且可能涉及多個 memory 分配。

另一種方法是創建一個大小正確的字符串或保留 memory :

  1. 創建大小為 10 的“空”字符串:

     string s2(10, '\0'); for(int i=0; i<10; i++){ s2[i] = s[i]; }
  2. 預留memory

     string s2; s2.reserve(10); for(int i=0; i<10; i++){ s2 += s[i]; }
  3. 使用 substring 初始化字符串

     string s2 = s.substr(0, 10);

    或者

     string s2(s.begin(), s.begin() + 10);

    或者

     string s2(s, 0, 10);

有人可能會感到困惑,因為

for(int i=0; i<10; i++){
    cout << s2[i];
}

提供正確的 output。 std::string是帶有函數和重載運算符的 class 。 std::string[]-operator符顯示與char-array類似的行為。 “數組元素”是用這段代碼定義的:

for(int i=0; i<10; i++){
        s2[i] = s[i];
    }

如果問題的代碼被執行了幾次,可以看到這個snipped的未定義行為。

如果您嘗試使用字符串迭代器,您將看到字符串s2仍然是一個空字符串。

string::iterator si;
    for (si=s2.begin(); si!=s2.end(); si++)
    {
        cout << *si ;
    }

暫無
暫無

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

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