很抱歉出现菜鸟问题。 我的班级有以下代码用于作业(包括作业说明):
编写一个程序,要求用户输入字符串,然后将其传递给void递归函数,该函数将反向显示字符串。该函数的原型为:
void reverse(string s, int i);
函数调用为:
reverse(strIn, strIn.length());
典型的运行是:
输入一个字符串:
四分和七年前..
.. oga sraey neves dna erocs ruoF
// Actual code
#include <iostream>
#include <string>
void reverse(std::string, int);
int main() {
std::string input;
std::cout << "Enter a string." << std::endl;
getline(std::cin, input);
int i = input.length() - 1;
reverse(input, i);
return 0;
}
void reverse(std::string input, int i) {
while (i >= 0) {
std::cout << input.at(i);
i--;
reverse(input, i);
}
}
我假设每次都减1会显示字符串中的最后一个字符,并将循环条件设置为i >= 0
会使字符串中没有更多字符时循环终止。但是我得到以下输出:
sleepy@mooncell ~/CMPSC121/Activities $ ./a.out
Enter a string.
help
plehhehhlehhehh
我无法弄清楚我在做什么错。非常感谢您的帮助!
答案 0 :(得分:1)
这是因为您正在尝试同时执行递归和while循环,只需摆脱while循环即可,它将起作用,代码应如下所示:
// Actual code
#include <iostream>
#include <string>
void reverse(std::string, int);
int main() {
std::string input;
std::cout << "Enter a string." << std::endl;
getline(std::cin, input);
int i = input.length() - 1;
reverse(input, i);
return 0;
}
void reverse(std::string input, int i) {
if(i <0)
return;
std::cout << input.at(i);
i--;
reverse(input, i);
}
答案 1 :(得分:0)
此功能
void reverse(std::string input, int i) {
while (i >= 0) {
std::cout << input.at(i);
i--;
reverse(input, i);
}
}
不是纯递归的,因为它使用while循环。
通过值传递字符串也是一个坏主意。字符串中的位置应为std :: string :: size_type。
第二个参数可以具有默认参数。在这种情况下,函数调用看起来会简单得多
reverse( input );
请注意,当将空字符串传递给函数时,这些语句会调用未定义的行为
int i = input.length() - 1;
reverse(input, i);
因为在这种情况下变量i将具有最大值。就是这个声明
int i = input.length() - 1;
实际上等同于
int i = std::string::size_type( -1 );
您需要的是以下
void reverse( const std::string &s, std::string::size_type i = 0 )
{
if ( i < s.size() )
{
char c = s[i];
reverse( s, i + 1 );
std::cout << c;
}
}
这是一个演示程序。
#include <iostream>
#include <string>
void reverse( const std::string &s, std::string::size_type i = 0 )
{
if ( i < s.size() )
{
char c = s[i];
reverse( s, i + 1 );
std::cout << c;
}
}
int main()
{
const char *s = "Hello bbchan";
std::cout << s << '\n';
reverse( s );
std::cout << '\n';
return 0;
}
其输出为
Hello bbchan
nahcbb olleH
更好的是,按照下面的演示程序中所示的方法来定义函数。在这种情况下,您可以例如以相反的顺序在文件中写入一个字符串。
#include <iostream>
#include <string>
std::ostream & reverse( const std::string &s,
std::string::size_type i = 0,
std::ostream &os = std::cout )
{
if ( i < s.size() )
{
char c = s[i];
reverse( s, i + 1, os );
os << c;
}
return os;
}
int main()
{
const char *s = "Hello bbchan";
std::cout << s << '\n';
reverse( s ) << '\n';
return 0;
}