我正在尝试不使用任何存储容器.我不知道是否有可能.这是我到目前为止所拥有的.(我遇到了分段错误).
#include#include using namespace std; void foo(string s) { size_t pos; pos = s.find(' '); if(pos == string::npos) return; foo(s.erase(0, pos)); cout << s.substr(0, pos) << " "; } int main() { foo("hello world"); return 0; }
我知道这段代码可能有很多问题.撕掉了.我渴望学习.我正在尝试模仿订单打印,就像在单个链接列表的反向打印中一样.谢谢.
编辑:一个例子:"你是惊人的"成为"你是惊人的"
段错误是堆栈溢出.
foo( "hello world" )
将所有内容删除到第一个空格(" world"
)并递归.
foo( " world" )
将所有内容删除到第一个空格(" world"
)并递归.
foo( " world" )
......你明白了.
此外,一旦你调用foo( s.erase( 0, pos ) )
,s.substr( 0, pos )
在递归返回后尝试打印没有意义.你需要在删除它之前将子字符串保存在某个地方,这样你以后仍然可以打印它.
void foo(string s) { size_t pos = s.find(' '); // declare-and-use in one line string out = s.substr( 0, pos ); // saving the substring if ( pos != string::npos ) { foo( s.erase( 0, pos + 1 ) ); // recurse, skipping the space... cout << " "; // ...but *print* the space } cout << out; // print the saved substring }