字符串中消失的字符,但使用索引访问

Disappeared characters in String But Accessed with index

本文关键字:索引 访问 消失 字符 字符串      更新时间:2023-10-16

在下面的程序中,

int main()
{
int i;
string a;//unallocated string;
for( i=0;i<26;i++)
{
a[i]=i+97;// trying to write a char at index i of a
}
cout<<" a[i] : ";
for(i=0;i<26;i++)
{
cout<<a[i];// printing the characters 
}
cout<<"n a as string : "<<a; // the string disappeared
}

输出:

A[i] : abcdefghijklmnopqrstuvwxyz

a 作为字符串:

我的问题是

  • 字符串 a 的索引处存储的字符在哪里?

  • 为什么当我尝试写入未分配的字符串时没有错误?

  • 有人可以解释发生了什么吗?

  • 我正在使用带有 c++11 的 gcc

当你做a[i]你正在使用string::operator[]它明确说:

返回对指定位置位置处的字符的引用。 不执行边界检查

a是默认构造的,因此它的大小为 0。您正在尝试在这些边界之外进行索引,因此您在那里读取或写入的任何内容都是未定义的。

看起来您正在使用 26 作为循环上限的幻数。而是使用size(a)(或在 C++17 之前使用a.size())。然后,如果你想执行循环 26 次,只需像这样初始化astring a(26, '')

实时(略有改进)示例

编辑:

正如AndyG所指出的C++在这种情况下确实为我们提供了更好的初始化string的方法iota是一个很好的选择。除了初始化 for 循环之外

,您可以使用:
iota(begin(a), end(a), 'a')

我已经更新了示例以包含此内容。