简单的递归 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())));
}
}
你是在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;
}
您正在进行大量(不必要的)类型转换。这是一种无需使用字符串即可实现目标的方法。
#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;
}
所以我正在自学 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())));
}
}
你是在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;
}
您正在进行大量(不必要的)类型转换。这是一种无需使用字符串即可实现目标的方法。
#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;
}