C++ 为什么我的while循环在我<;0?
对不起,我的问题是noob。 我的课堂作业代码如下(包括作业说明): 编写一个程序,要求用户输入一个字符串,然后将其传递给一个void递归函数,该函数反向显示该字符串。该功能的原型是:C++ 为什么我的while循环在我<;0?,c++,loops,recursion,while-loop,C++,Loops,Recursion,While Loop,对不起,我的问题是noob。 我的课堂作业代码如下(包括作业说明): 编写一个程序,要求用户输入一个字符串,然后将其传递给一个void递归函数,该函数反向显示该字符串。该功能的原型是: void reverse(string s, int i); reverse(strIn, strIn.length()); 函数调用将是: void reverse(string s, int i); reverse(strIn, strIn.length()); 典型的运行将是: 输入一个字符串: 八
void reverse(string s, int i);
reverse(strIn, strIn.length());
函数调用将是:
void reverse(string s, int i);
reverse(strIn, strIn.length());
典型的运行将是:
输入一个字符串:
八十七年前
。。oga sraey neves dna erocs ruoF
我搞不清楚我做错了什么。非常感谢您的帮助 此函数
void reverse(std::string input, int i) {
while (i >= 0) {
std::cout << input.at(i);
i--;
reverse(input, i);
}
}
请注意,当向函数传递空字符串时,这些语句可能会调用未定义的行为
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>
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;
}
#包括
#包括
std::ostream和reverse(const std::string和s,
std::string::size_type i=0,
std::ostream&os=std::cout)
{
如果(i os这是因为您试图同时执行递归和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);
}
//实际代码
#包括
#包括
无效反向(std::string,int);
int main(){
std::字符串输入;
std::循环是否终止…问题是程序的逻辑需要if
而不是,而使用时不需要循环recursion@EduardoPascualAseff谢谢,这解决了我的问题!虽然它是递归的…因为它调用自己。只是糟糕的逻辑。只是将while
更改为e> if
在OP的函数中同样有效,而且简单得多。@AdrianMole它并不简单。它需要指定字符串的长度。谢谢你,我很欣赏清理后的代码。我正在尝试学习最佳实践,但我自己却很难!(我没有从教授那里得到太多的信息——事实上我没有得到任何信息)在OP的赋值中,这样说:“函数调用将是:reverse(strIn,strIn.length());
”是什么导致函数继续输出字符?我正在试图弄清楚它是如何输出这些字符的,但很难想象。@bbchan这是因为您正在尝试执行递归,但仍处于一个while循环中,我建议您尝试使用笔和纸来查看错误所在这是最好的学习方法
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;
}
// 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);
}