#include <iostream> using namespace std; void print(char *s); void print(char *s){ if(*s) { print(++s); cout<<*s<<endl; } } int main(int argc,char **argv) { print(argv[1]); cout<<endl; return 0; }
[disda@disdader bin]$ ./revStr abcd
d
c
b
這段代碼時逆序輸出字符串,然而仔細觀察,我們發現字符a呢?爲什麼沒有輸出?那下面來仔細說說:1.*s爲a,執行print(b),print(b)被壓入堆棧倒數第一層.
2.*s爲b,執行print(c),print(c)被壓入堆棧倒數第二層. 3.*s爲c,執行print(d),print(d)被壓入堆棧倒數第三層. 4.*s爲d,執行print(\0),print(\0)被壓入堆棧倒數第四層.
5.開始跳出print,從上到下彈出堆棧中的內容.得到結果\0dcb.因次a並沒有入棧,所以自然不會輸出a;
如果此時你想到的是把++i改成i++的話!
#include <iostream> using namespace std; void print(char *s); void print(char *s){ if(*s){ print(s++); cout<<*s<<endl; } } int main(int argc,char **argv) { print(argv[1]); cout<<endl; return 0; }
這是一個段錯誤,因爲在當*s爲d時壓入print(d)後s++會指向字符串的空間之外,自然會引起段錯誤.
想想如果我們將i++改成i+1能得到正確的結果嗎?
#include <iostream> using namespace std; void print(char *s); void print(char *s){ if(*s) { print(s+1); cout<<*s<<endl; } } int main(int argc,char **argv) { print(argv[1]); cout<<endl; return 0; }
[disda@disdader bin]$ ./revStr abcd
d
c
b
a
這次我們得到終於正確的逆序字符串了!但這時我們就有可能有點混亂了.那先解釋一下i+1的意義.i+1沒有傳遞這個過程!加過去就結束了,後面i原來是多少還是多少!這點在遞歸中的時候特別值得注意!而我們如果利用指針的引用也可以解決這道題.
#include<iostream> using namespace std; void print(char* &s) { if(*s){ p(++s); //if條件成立,即進行遞歸 注意不能進行s++會溢出 cout<<*s; //按反序輸出字符串中的各個字符 } s--; } int main(int argv,char **argc) { char *str = "iloveyou"; print(str); cout<<endl; return 0; }