如何在不定义目标变量大小的情况下将字符串变量按字符复制到另一个字符?

时间:2017-11-14 16:04:18

标签: c++ string

我正在编写一个程序,我需要将一个字符串(最初未知的长度)复制到另一个字符串的字符串。

我编写的代码运行完美。

string a = "Hello";
string b( a.length(), 'a');
for (int i = 0; i < a.length(); i++)
    b[i] = a[i];

但是,因为C ++中字符串的大小是动态计算的

string k = "Hello";
string l = "Hello World";
string m = k;
m = l;

没有给出任何错误。所以很明显,字符串变量的大小会根据需求动态变化。

所以我尝试了同样的方法而没有定义变量b的大小。

string a = "Hello";
string b;
for (int i = 0; i < a.length(); i++)
    b[i] = a[i];

但在这种情况下,我的程序崩溃并说字符串下标超出范围

为什么不在这种情况下变量b的大小正在增加? 错误的原因是什么?如何在不提及任何变量大小的情况下实现这一目标?

3 个答案:

答案 0 :(得分:4)

如果必须,您可以使用push_back

string a = "Hello";
string b;
for (int i = 0; i < a.length(); i++)
    b.push_back(a[i]);

甚至 1

string a = "Hello";
string b;
for (auto c : a)
    b.push_back(c);

但为什么?

参考:http://en.cppreference.com/w/cpp/string/basic_string/push_back

1 但如果以任何方式更改a,请不要这样做:基础迭代器将失效。

答案 1 :(得分:2)

您只需使用+=运算符:

for (auto el : a){
    b += el;
}

std::string::operator+=有一个接受字符的重载。

答案 2 :(得分:0)

字符串的大小是动态的,但它不会像您期望的那样自动更改。 operator []只返回第i个元素,如果字符串的当前大小小于i,则填充失败。这取决于你确保字符串的大小足够大。

如果您无法提前调整字符串大小,可以查询大小,将其增加1,请求字符串调整大小,并设置最后一个字符。

这就是push_back方法的工作原理