在 C++ 中反转字符串

Posted

技术标签:

【中文标题】在 C++ 中反转字符串【英文标题】:Reversing a string in c++ 【发布时间】:2015-05-24 20:30:42 【问题描述】:

我刚刚开始学习 c++,我试图创建一个使用函数来反转字符串的简单程序,但这是我的尝试,它似乎不起作用。它只是以正确的方式输出字符串。只是为了澄清一下,我不是在寻找一个内置函数或类似的东西,它对我有用,但错误在我的逻辑中。如果有它的功能,虽然我很想知道。感谢您的帮助。

#include <iostream>
#include <string>

// A program to practice creating and calling a function to reverse a string


using namespace std;



//declaring the function before use
string reverseString(const string& input,string& output);



//main function
int main()

    string userInputStr;

    cout << "Please enter a string to be reversed: ";
    getline(cin,userInputStr);
    string reversedString = userInputStr;
    reverseString(userInputStr, reversedString);

    cout << userInputStr << " reversed is " << reversedString;

    return 0;


string reverseString(const string& input, string& output)

    char characterInString;
    int counter;
    int lengthOfString = input.length();


    for (counter = 0; counter >= lengthOfString; counter++)
    
        characterInString = input[(lengthOfString - counter)];
        output = output + characterInString;
    
    return output;



感谢所有提供帮助的人。对于那些有兴趣的人,我设法修复的更新代码如下。我知道我正在研究有更简单的方法,但我只学习了几天,所以这只是使用我目前的方法明白。

#include <iostream>
#include <string>

// A program to practice creating and calling a function to reverse a string


using namespace std;



//declaring the function before use
string reverseString(const string& input,string& output);



//main function
int main()

    string userInputStr;

    cout << "Please enter a string to be reversed: ";
    getline(cin,userInputStr);
    string reversedString = "";
    reverseString(userInputStr, reversedString);

    cout << userInputStr << " reversed is " << reversedString << endl;

    return 0;


string reverseString(const string& input, string& output)

    char characterInString;
    int counter;
    int lengthOfString = input.length();


    for (counter = 0; counter < lengthOfString +1; counter++)
    
        characterInString = input[(lengthOfString - counter)];
        output = output + characterInString;
    
    return output;



【问题讨论】:

首先,将counter &gt;= lengthOfString 更改为counter &lt; lengthOfString @barakmanos 我试过了,但它似乎并没有改变输出的内容。抱歉,感谢您的帮助。 即使你修复了索引,你认为output = output + characterInString; 会做什么,给定output 的初始值? @juanchopanza 我希望它会将每个字符添加到名为 output 的字符串中......不是这样吗? @JoeRickard 这不会反转字符串,因为您已将 output 设置为与输入字符串相同。无论如何,不​​需要所有这些低效的复杂性(请参阅我的答案。) 【参考方案1】:

学习 C++ 也是为了了解语言和标准库可以为您做什么。例如,学习一个字符串可以由两个迭代器构建,并且存在反向迭代器:

string reversedString(userInputStr.rbegin(), userIntput.rend());

【讨论】:

【参考方案2】:

在这个循环中

for (counter = 0; counter >= lengthOfString; counter++)

    characterInString = input[(lengthOfString - counter)];
    output = output + characterInString;

有几个错误。

第一个是循环永远不会迭代,除非字符串输入为空,因此它的长度等于零。仅在这种情况下

counter >= lengthOfString

将被评估为真。

第二个问题是索引的评估方式

(lengthOfString - counter)

当 counter 等于 0 时将超出索引的有效范围。

最后你在调用这个函数时已经用输入字符串初始化了输出

string reversedString = userInputStr;
reverseString(userInputStr, reversedString);

最好用下面的方式声明函数

string reverseString( const string& input );

可以这样定义

string reverseString( const string& input )

    return std::string( input.rbegin(), input.rend() );

在 main 中,函数会被调用

string reversedString = reverseString(userInputStr );

如果你想在不使用反向迭代器的情况下编写函数,那么你可以这样写

string reverseString( const string& input )

    std::string output;
    auto n = input.size();
    output.reserve( n );

    while ( n != 0 ) 
    
        output += input[--n];
    

    return output;

【讨论】:

抱歉,您介意解释一下为什么当 counter 等于 0 时它会超出索引范围吗?感谢其余的顺便说一句。很有用 @Joe Rickard 如果 lengthOfString 被定义为 int lengthOfString = input.length();那么索引的有效范围将为 0:lengthOfString - 1。 感谢您澄清这一点。我想我误解了“input.length()”作为输出给出的内容。 @Joe Rickard 我更新了我的帖子,因为最后一个函数实现不正确。 谢谢。我再次看了最后一部分,意识到它是多么简单。我很生气,一开始我没想过要那样做。我想我有点过于复杂了!【参考方案3】:

1 - 当您开始反转时,output 包含文本。您可能希望按照以下方式访问 output 中的元素

output[counter] = input[opposite];

除了修复循环条件。

2 - 使用字符串类型实现函数的合理方法可能是。

std::string reverse(const std::string& in)
     return std::string(in.rbegin(), in.rend());

【讨论】:

感谢您澄清这一点。虽然我还没有了解你的例子中的一些部分,但我会做一些调查。再次感谢【参考方案4】:

你的 for 循环必须从 1 开始:

for (counter = 1; counter <= lengthOfString; counter++)

    characterInString = input[(lengthOfString - counter)];
    output = output + characterInString;

你还有错误的字符:'>'而不是'

#include <iostream>
#include <string>

// A program to practice creating and calling a function to reverse a string


using namespace std;



//declaring the function before use
string reverseString(const string& input,string& output);



//main function
int main()

    string userInputStr;

    cout << "Please enter a string to be reversed: ";
    getline(cin,userInputStr);
    string reversedString = "";
    reverseString(userInputStr,reversedString);

    cout << userInputStr << " reversed is " << reversedString;

    return 0;


string reverseString(const string& input, string& output)

    char characterInString;
    int counter;
    int lengthOfString = input.length();


    for (counter = 1; counter <= lengthOfString; counter++)
    
        characterInString = input[(lengthOfString - counter)];
        output = output + characterInString;
    
    return output;



这里是提供结果的ideone:http://ideone.com/47A3y1

【讨论】:

这仍然不会反转字符串。 @Chris 我已经尝试过了,但它对输出没有任何作用。 @juanchopanza 你为什么这么说? @juanchopanza 抱歉。我没有看到那一点点。感谢您的帮助。【参考方案5】:

for (counter = 0; counter &gt;= lengthOfString; counter++)

这将创建一个循环,当计数器大于或等于字符串的长度时运行,因为计数器最初等于 0,这意味着它永远不会运行。

使counter &lt; lengthOfString 对您不起作用的原因是.length() 返回字符串中的字符数。因此,5 个字符的字符串返回 5,有效索引为 0-4。所以你需要从lengthOfString-counter-1开始看,以确保当counter=0你真正看到的是最后一个字符。

实际上,您可能正在使用当前代码复制字符串末尾的 NULL 字符,这意味着返回字符串的第一个字符是 \0,这就是字符串看起来为空的原因。

【讨论】:

以上是关于在 C++ 中反转字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用指针在 C++ 中反转字符串

如何在 C++ 中反转字符数组? [关闭]

如何使用交换函数和指针反转字符串数组? (C++)

反转字符串C++ [关闭]

C++:使用递归反转字符串

c++简单入门训练