如何打印此手动制作的字符串

时间:2014-02-17 14:47:33

标签: c++ string

我只需要反转一个字符串,所以我声明了一个新的字符串变量并迭代地复制了这些元素。现在我想通过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;
}

5 个答案:

答案 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的算法,其名称可能会无意中进入全局命名空间。你确实有一个具有该名称的变量。

请参阅this working demo

答案 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));
}