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

How to print this manually made string

本文关键字:字符串 何打印 打印      更新时间:2023-10-16

我只需要反转一个字符串,所以我声明了一个新的字符串变量并迭代复制元素。现在我想通过cout << reversed;打印反转的字符串,但这什么也没打印。我可以通过 for 循环打印它reverse[i]直到尺寸,但有没有更好的方法?

#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] = ''; //last value as null
    cout << "original string = " << original << endl;
    cout << "reversed string = " << reverse  << endl;
    system("pause");
    return 0;
}

更好的解决方案是使用 std::reverse

std::string original = "whatever";
std::string rev = original;
std::reverse(rev.begin(), rev.end());

您可以使用反向迭代器从原始字符串实例化反向字符串:

string original = "hello";
string reverse(original.rbegin(), original.rend());

然后

std::cout << "reversed string = " << reverse << std::endl;

注意:避免using namespace std;。有一种算法叫做 std::reverse ,您可能无意中将其名称拉入全局命名空间。而且您确实有一个具有该名称的变量。

请参阅此工作演示。

代码的主要问题是reverse是空的,因此使用任何索引都会导致索引超出界限和未定义的行为。

作为旁注,您不必终止std::string对象,它们会自动终止。

你应该注意到字符串反向没有大小,所以当你做这样的事情时

for (i = size - 1; i >= 0; i--) // original's last as reversed's first
{
    reverse[j] = original[i]; 
    j++;
}

在这里,您正在访问一个在字符串反向中找不到的索引,因为它的大小为 0 。你应该照顾这样的事情。

关于这个问题,你收到了很多答案,我只是想让你注意到这个错误

相反,你可以使

reverse+=original[i];

您甚至不需要创建一个新字符串来保存反转的字符串。只是对原始字符串进行迭代。

void print_reversed(const std::string& str)
{
    std::copy(str.crbegin(), str.crend(), std::ostream_iterator<char>(std::cout));
}