繁体   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