【问题标题】:c++ string constructed as char array [duplicate]c ++字符串构造为char数组[重复]
【发布时间】:2020-09-18 08:42:43
【问题描述】:

目前正在学习字符串,我有以下:

string s;
s[0]='a'; s[1]='b';
cout<<s;

string s; s.clear();
s+='a'; s+='b';
cout<<s;

我得到空字符串作为第一个示例的输出,第二个工作正常。我知道第一个是 undef 行为,我们第二次“推送”一个元素而不是分配一个值。 任何更多的澄清将不胜感激

【问题讨论】:

  • @UnholySheep 对于一个刚接触 cpp 的人来说可能有点吓人。你想要的是构造一个字符串,点击method functions: (constructor)部分的链接,并检查示例。
  • @M.A 他们要求提供文档,而 cppreference 是提供上述文档的最可靠的网站。显然,一本好书是初学者的正确选择
  • string s; 声明不为任何字符保留空间,通过operator[] 访问此空字符串是未定义的行为,您需要先为s.resize(3); 之类的字符创建空间。这是一些不那么令人生畏的文档cplusplus.com/reference/string/string
  • @anastaciu 我不能说 cplusplus 不那么令人生畏.. 它 90-ness 的网页设计让我毛骨悚然 c_c

标签: c++ arrays string char


【解决方案1】:
string s;

创建空字符串

s[0]='a'; s[1]='b';

这是未定义的行为,因为空字符串的大小为零,因此可能不存在所需的缓冲区。 它“有效”,因为所有主要编译器都在使用小字符串优化 (SSO)。在字符串对象的这种优化大小中,允许将小字符串保留在该对象内部而不是堆上。因此,std::string 中的最小 capacity 不为零(如果我没记错的话,在 gcc 中是 15)。

cout<<s;

现在了解这个流操作符是如何实现的,它可以打印空字符串(字符串大小为零)或“ab”或“ab”。

开启gcc it prints nothing

要修复它,您可以:

  • 首先调整字符串大小s.resize(2)
  • 使用push_back API

【讨论】:

  • 谢谢,我想可能是这样,是的,结果我得到了空字符串。现在:字符串 s; s.clear(); s+='a'; s+='b'; cout
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 2021-05-03
  • 2021-05-23
  • 2013-02-04
  • 1970-01-01
  • 2015-04-14
  • 1970-01-01
相关资源
最近更新 更多