在c++中反转字符串

Reversing a string in c++

本文关键字:字符串 c++      更新时间:2023-10-16

我刚刚开始学习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;

}

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

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

在此循环中

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

有几个错误。

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

counter >= lengthOfString

将被评估为true。

第二个问题是像一样评估指数

(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() );
}

大体上,该函数将像一样被调用

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;
}

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

output[counter] = input[opposite];

除了固定循环条件之外。

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

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

您的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

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

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

生成counter < lengthOfString对您也不起作用的原因是.length()返回字符串中的字符数。因此,一个由5个字符组成的字符串返回5,有效索引为0-4。因此,您需要开始查看lengthOfString-counter-1,以确保当counter=0时,您真正看到的是最后一个字符。

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