我是编程新手。我的问题可能很愚蠢但如果有人可以指导我会有所帮助。
请参阅下面的代码:
#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
时。我收到了错误。
答案 0 :(得分:3)
outputstring
为空,因此您可以在此处访问界限:
outputstring[i] = inputstring[n - 1 - i];
进入循环时,您必须确保outputstring
的长度至少为n
。有不同的方法来实现这一目标。
一种解决方案是在读入n
后创建大小为inputstring
的文件。在这里,我们创建了*
:
std::string outputstring(n, '*');
您还可以在创建后调整字符串大小:
outputstring.resize(n);
现在,您可以在outputstring[N]
范围内访问N
的{{1}}。这使您的循环有效。请参阅this working example。
或者,您可以考虑就地撤销[0, n)
。请注意,在实际代码中,可以使用inputstring
:
std::reverse
答案 1 :(得分:1)
您只需使用std::string
assign
成员函数
outputstring.assign(inputstring);
或者你甚至可以更简单地使用它的operator =
outputstring = inputstring;
或者,如果您只想分配字符串的部分,可以insert,replace,append并使用resize调整字符串的大小
根据经验,请务必阅读与您正在使用的任何C ++功能相关的文档,因此如果您使用std::string
,则必须在之前阅读its documentation >开始编码(能够为工作选择合适的功能)
在输入任何C ++代码之前,阅读C++ programming上一本好书的前几章将非常有帮助。
当然要学习C++11或C ++ 14,而不是标准的旧版本。
答案 2 :(得分:0)
outputstring 为空。因此,在访问其第i个元素时,您的程序会导致未定义的行为(link,异常安全部分)。 只需更改最后一行
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
}
运算符+ = 将char或string附加到初始字符串。