我正在学习如何从C ++的第一个原理反转字符串(即,向后写)。我设计了以下代码,旨在从用户那里接收字符串,将其反转并打印出来。但是,它无法编译-Visual Studio给我一个错误“字符串子集超出范围”。怎么了?
using namespace std;
int main()
{
string example;
getline(cin, example);
int i = 0;
while (example[i] != '\0')
{
i++;
}
int n=0;
string reverse;
while (n < i)
{
reverse[n] = example[i - n - 1];
n++;
}
cout << reverse << endl;
return 0;
}
我的目标是C ++ 17。
答案 0 :(得分:2)
reverse[n]
导致字符串超出索引问题。您刚刚创建了字符串,其大小为零。解决方法如下:
#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::getline;
int main()
{
string example;
getline(cin, example);
int i = 0;
while (example[i] != '\0')
{
i++;
}
int n=0;
string reverse(example.size(), 0);
while (n < i)
{
reverse[n] = example[i - n - 1];
n++;
}
cout << reverse << endl;
return 0;
}
但是,此代码仍然存在很多错误。例如,将字符串的大小存储在int
中是一个坏主意。请改用std::string::size_type
。并且std::string::size
已经为您提供了大小,无需计算。另外,请考虑在此处使用for循环:
#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::getline;
int main()
{
string example;
getline(cin, example);
string reverse(example.size(), 0);
for (string::size_type n = 0; n != example.size(); ++n)
{
reverse[n] = example[example.size() - n - 1];
}
cout << reverse << endl;
return 0;
}
话虽如此,这是我的实现方式:
#include <string>
#include <iostream>
using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::getline;
int main()
{
auto example = string();
getline(cin, example);
auto reverse = string(example.crbegin(), example.crend());
cout << reverse << endl;
return 0;
}
如果还没有熟悉reverse iterators,请确保自己熟悉。
答案 1 :(得分:0)
您的问题:reverse[n] = example[i - n - 1];
因为您已经使用字符串作为数据类型,但是正在使用字符数组语法;
将其更改为:
`reverse += example[i - n - 1];
完整的代码供参考:`
#include <iostream>
using namespace std;
int main()
{
string example;
getline(cin, example);
int i = 0;
while (example[i] != '\0')
{
i++;
}
int n=0;
string reverse;
//cout << i << endl;
while (n < i)
{
reverse += example[i - n - 1];
n++;
}
cout << reverse << endl;
return 0;
}