int main()
{
string a;
a[0] = '1';
a[1] = '2';
a[2] = '\0';
cout << a;
}
为什么这段代码不起作用?为什么不打印字符串?
答案 0 :(得分:7)
因为a
为空。如果您尝试使用空数组执行相同的操作,则会遇到相同的问题。你需要给它一些尺寸:
a.resize(5); // Now a is 5 chars long, and you can set them however you want
或者,您可以在实例化a
时设置大小:
std::string a(5, ' '); // Now there are 5 spaces, and you can use operator[] to overwrite them
答案 1 :(得分:3)
首先,我认为你的意思是std::string
。
其次,你的字符串是空的。
第三,虽然您可以使用operator []更改字符串中的元素,但您不能使用它来插入不存在的元素:
std::string a = "12";
a[0] = '3'; //a is now "32"
a[2] = '4'; //doesn't work
为了做到这一点,你需要确保你的字符串首先分配了足够的内存。 Therfore,
std::string a = "12";
a[0] = '3'; //a is now "32"
a.resize(3); //a is still "32"
a[2] = '4'; //a is now "324"
第四,你可能想要的是:
#include <string>
#include <iostream>
int main()
{
std::string a = "12";
std::cout << a;
}
答案 2 :(得分:2)
不支持使用operator[]
向字符串添加字符。出现这种情况的原因有多种,但其中一个是:
string a;
a[1] = 12;
a[0]
应该是什么?
答案 3 :(得分:1)
在C ++中,字符串是一个对象,而不是一个数组。尝试:
string a = "12";
cout << a;
如果您愿意,您仍然可以使用旧式C字符串,所以:
char a[3];
a[0] = '1';
a[1] = '2';
a[2] = '\0';
...
你要做的是混合这两种模式,这就是为什么它不起作用。
编辑:正如其他人所指出的那样,订阅std::string
对象可以正常工作,只要该字符串已经初始化并具有足够的容量即可。在这种情况下,字符串为空,因此所有下标都超出范围。
答案 4 :(得分:1)
通过std :: string上的下标运算符的定义:
const char& operator[] ( size_t pos ) const;
char& operator[] ( size_t pos );
非const下标是可能的。所以以下应该可以正常工作:
std::string a;
a.resize(2);
a[0] = '1';
a[1] = '2';
std::cout << a;
虽然看起来像是一种圆润的方式。