我正在学习如何从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。
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。
你的问题: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;
}