在c++中如何从另一个字符串赋值未初始化的字符串值

how to assign uninitialized string value from another string in C++

本文关键字:字符串 赋值 初始化 另一个 c++      更新时间:2023-10-16

我对编程很陌生。我的问题可能很傻,但如果有人能指导我,那将是有帮助的。

请参阅下面我的代码:

#include <iostream>
#include <string>
using namespace std;
    int main()
    {
        cout << "you have choose to Reverse the text" << endl;
        string inputstring;
        string outputstring;
        cout << "Enter the string you want to reverse" << endl;
        getline(cin, inputstring);
        int n = inputstring.length();
        for (int i = 0; i < n; i++)
        {
            outputstring[i] = inputstring[n - 1 - i]; // problem in this line
        }
}

直到这里它工作良好的inputstring[n - 1 - i],但当我试图将其值分配给outputstring

outputstring是空的,所以你在越界访问它:

outputstring[i] = inputstring[n - 1 - i];

您必须确保在进入循环时outputstring的长度至少为n。有不同的方法可以达到这个目的。

一个解决方案是在读入inputstring后创建大小为n。这里,我们用*: 填充它
std::string outputstring(n, '*');

你也可以在创建后调整字符串的大小:

outputstring.resize(n);

现在您可以访问N[0, n)范围内的outputstring[N]。这使得循环有效。请看这个工作示例。

或者,您可以考虑就地反转inputstring。请注意,在实际代码中,可以使用std::reverse:

轻松完成此操作。
std::reverse(inputstring.begin(), inputstring.end());

使用std::stringassign成员函数

 outputstring.assign(inputstring);

或者你可以更简单地使用它的operator =,比如

outputstring = inputstring;

或者,如果你只想分配字符串的部分,你可以插入、替换、追加和使用resize来调整字符串

的大小

作为一个经验法则,总是阅读与你正在使用的任何c++特性相关的文档,所以如果你使用std::string,你必须在开始编码之前阅读它的文档(以便能够为工作选择正确的函数)

在输入任何c++代码之前,阅读一本关于c++编程的好书的前几章将会非常有帮助。

当然要学习c++ 11或c++ 14,而不是一些旧版本的标准

outputstring为空。因此,在访问它的第i个元素时,程序会导致未定义的行为(链接,异常安全节)。修改最后几行

        for (int i = 0; i < n; i++)
        {
            outputstring[i] = inputstring[n - 1 - i]; // problem in this line
        }

        outputstring.reserve(n);  // reserve is optional. Use it just for memory allocating optimization..
        for (int i = 0; i < n; i++)
        {
            outputstring += inputstring[n - 1 - i]; // problem in this line
        }

操作符+=在初始字符串后追加字符或字符串。