简单的递归 C++ 代码不断崩溃

Simple recursive C++ code keeps crashing

所以我正在自学 C++,并且我正在努力理解为什么这段代码总是崩溃。我发现这一行:string str = to_string(n) 可能不正确。但是我没有看到它崩溃的其他错误。

#include <iostream>
#include <string>

using namespace std;

void write_vertically(int n)
{
    string str = to_string(n);

    if (str.length()>=0) 
    {
        cout<<stoi(str.substr(0,1))<<endl;
        write_vertically(stoi(str.substr(1,str.length())));
    }

}

int main( ) 
{
    write_vertically(1234567890);
    return 0;
}

你遇到了 Stack Overflow!而你在完美的网站上找到了解决方案。

在行string str = to_string(n); 无论 n 的值如何,to_string 都会 return 一个非空字符串,可以是“0”、“6”或“1653”,随便什么。

递归的结束条件是 (str.length() >= 0) 为假。 但是,如上所述,这绝不是错误的。

您希望递归的结束条件是什么?也许我们可以帮助您。

编辑:事实证明,代码应该在进入堆栈溢出之前崩溃,因为它最终会用空字符串调用 stoi,这使得它抛出 std::invalid_argument。不过还是有无限递归的问题,所以我会继续回答。

您必须按如下方式更改递归条件:

if (str.length()> 0) {

cout<<stoi(str.substr(0,1))<<endl;
if(str.length() > 1)
write_vertically(stoi(str.substr(1,str.length())));
     }


}

演示:http://coliru.stacked-crooked.com/a/ecd26e57c45cea2b

你是在stoi("")结束时拨打

#include <iostream>
#include <string>

using namespace std;

void write_vertically(int n){
    string str = to_string(n);
    cout<<stoi(str.substr(0,1))<<endl;
    if (str.length()>1) 
         write_vertically(stoi(str.substr(1,str.length())));

}

int main( ) {
    write_vertically(1234567890);
    return 0;
}

https://ideone.com/YfYhZw

您正在进行大量(不必要的)类型转换。这是一种无需使用字符串即可实现目标的方法。

#include <iostream>

using namespace std;

void write_vertically( unsigned int n ) {
    unsigned int d = n % 10;
    n /= 10;
    if( n )
        write_vertically( n );
    cout << d << endl;
}

int main() {
    write_vertically(1234567890);
    return 0;
}