gpt4 book ai didi

c++ - 按索引更改字符串

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:10:09 24 4
gpt4 key购买 nike

我是 C++ 的初学者,目前正在处理字符串。

我的问题是为什么在编译下面提供的代码时,当我使用索引表示法时我可以获取字符串的字符,但不能使用 cout 获取字符串本身?

这是代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
string original; // original message
string altered; // message with letter-shift

original = "abc";
cout << "Original : " << original << endl; // display the original message

for(int i = 0; i<original.size(); i++)
altered[i] = original[i] + 5;

// display altered message
cout << altered[0] << " " << altered[1] << " " << altered[2] << endl;
cout << "altered : " << altered << endl;

return 0;
}

当我运行它时,字符串 altered 中的字符通过这一行正确显示:

cout << altered[0] << " " << altered[1] << " " << altered[2] << endl;

但是字符串本身并没有用这一行显示:

cout << "altered : " << altered << endl;

我想知道为什么会这样。

最佳答案

您还没有调整 altered 的大小适合 original 长度的字符串循环之前的字符串,因此您的代码表现出未定义的行为:

altered[i] = original[i] + 5; // UB -  altered is empty

要解决此问题,请调整大小 altered循环之前:

altered.resize(original.size());

或使用 std::string::operator+=或类似附加到 altered :

altered += original[i] + 5;

这样,它可以在循环之前为空,它会自动调整自身大小以包含附加字符。


说明

UB 在这里发生的方式是,您成功地将数据写入静态数组,即 std::string用于短字符串优化( std::string::operator[] 不检查您是否通过 std::string::size() 访问此数组),但是 std::string::size()遗迹 0 ,以及 std::string::begin() == std::string::end() .

这就是为什么您可以单独访问数据(再次使用 UB):

cout << altered[0] << " " << altered[1] << " " << altered[2] << endl;

但是cout << aligned不打印任何东西,考虑到简化 operator<< std::string 的定义看起来功能上是这样的:

std::ostream &operator<<(std::ostream &os, std::string const& str)
{
for(auto it = str.begin(); it != str.end(); ++it) // this loop does not run
os << *it;

return os;
}

一句话, std::string不知道您对其底层数组做了什么,也不知道您的意思是让字符串变长。


总而言之,<algoritm>进行这种转换的方式:

std::transform(original.begin(), original.end(),
std::back_inserter(altered), // or altered.begin() if altered was resized to original's length
[](char c)
{
return c + 5;
}

(必需的 header :<algorithm><iterator>)

关于c++ - 按索引更改字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33860356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com