我只需要反转一个字符串,所以我声明了一个新的字符串变量并迭代地复制了这些元素。现在我想通过cout << reversed;
打印反向字符串,但这不打印任何内容。我可以通过reverse[i]
的for循环打印它直到大小但是有更好的方法吗?
#include <iostream>
#include <string>
using namespace std;
int main()
{
string original = "hello";
string reverse;
int i, j = 0, size = original.length();
for (i = size - 1; i >= 0; i--) // original's last as reversed's first
{
reverse[j] = original[i];
j++;
}
reverse[j] = '\0'; //last value as null
cout << "original string = " << original << endl;
cout << "reversed string = " << reverse << endl;
system("pause");
return 0;
}
答案 0 :(得分:5)
更好的解决方案是使用std::reverse
:
std::string original = "whatever";
std::string rev = original;
std::reverse(rev.begin(), rev.end());
答案 1 :(得分:2)
您可以使用反向迭代器来实例化原始反转字符串:
string original = "hello";
string reverse(original.rbegin(), original.rend());
然后
std::cout << "reversed string = " << reverse << std::endl;
注意:避免using namespace std;
。有一种名为std::reverse
的算法,其名称可能会无意中进入全局命名空间。你确实有一个具有该名称的变量。
答案 2 :(得分:1)
您的代码的主要问题是reverse
为空,因此使用任何索引会导致索引越界和未定义的行为。
作为旁注,您不必终止std::string
个对象,它们会自动终止。
答案 3 :(得分:1)
你应该注意到字符串反向没有大小,所以当你做这样的事情时
for (i = size - 1; i >= 0; i--) // original's last as reversed's first
{
reverse[j] = original[i];
j++;
}
在这里,您正在访问在字符串反向中找不到的索引,因为它的大小为 0 。你应该照顾好这样的事情。
你收到的关于这个问题的答案很多,我只是想让你注意到这个错误
相反,你可以做
reverse+=original[i];
答案 4 :(得分:0)
您甚至不需要创建一个新字符串来保存反向字符串。只是原始字符串上的迭代器。
void print_reversed(const std::string& str)
{
std::copy(str.crbegin(), str.crend(), std::ostream_iterator<char>(std::cout));
}