Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我的while循环在我<;0?_C++_Loops_Recursion_While Loop - Fatal编程技术网

C++ 为什么我的while循环在我<;0?

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()); 典型的运行将是: 输入一个字符串: 八

对不起,我的问题是noob。 我的课堂作业代码如下(包括作业说明):

编写一个程序,要求用户输入一个字符串,然后将其传递给一个void递归函数,该函数反向显示该字符串。该功能的原型是:

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)
{
如果(ios这是因为您试图同时执行递归和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);
}