2014-11-25 32 views
-1

你好一起遞歸調用應該輸出反向串

void rev_out(istream& is){ 
char a; 
is >> a; 
if(a!='g')rev_out(is); 
cout << a; 
} 


int main() 
{ 
stringstream is("abcdefg"); 
rev_out(is); 
return 0; 
} 

現在的輸出是gfedcba,但我有一個問題。我想給出一個普遍有效的if語句,比如「在字符串被完全讀取後停止」。所以如果有任何你不知道的數據流,函數就會知道它何時必須停止。有沒有可能不先計算字符串元素?

感謝您的幫助!

+0

你真的想做什麼? – Caduchon 2014-11-25 12:40:42

回答

1

只要停止時,你不能閱讀更多:

void rev_out(istream& is){ 
    char a; 
    if (is >> a)   // If we could read a character... 
    { 
     rev_out(is);  // ... keep reversing ... 
     cout << a;  // ... and print the character. 
    } 
    // Otherwise, nothing happens. 
} 
+0

謝謝!你能解釋我另一件事嗎?我想知道<< - 運算符是如何工作的,如果你有:stringstream是(「abc」)並且是<<「xyz」會發生什麼?我認爲第一個字母會被y覆蓋,等等。真的嗎?因爲我也讀了解釋:<<向stringstream對象添加一個字符串。 – Susliks 2014-11-25 14:19:16

0

我相信這應該有效,但它沒有經過測試。

void rev_out(istream& is){ 
    char a; 
    is >> a; 

    if(is.bad() || is.eof()){ 
     return; 
    } 
    rev_out(is); 
    cout << a; 
} 

基本上,你在檢查輸出之前是否已經達到了流的末尾。如果你還沒有完成它,那麼得到下一個,然後當你從堆棧中回落時輸出就會出現。

+0

把這個檢查放在輸入之後......如果我沒有錯誤,你當前的代碼打印出一個字符太多(無法讀取的字符)......並且應該包含對你的代碼的解釋。 – leemes 2014-11-25 12:46:19

+0

添加了解釋。很確定你錯了,請參閱編輯。 – David 2014-11-25 12:51:31

+0

http://ideone.com/VZmqaY - 查看垃圾字符? (這裏是'|') – leemes 2014-11-25 12:53:05

1

所有字符串文字結束與空字符(\0),所以你可以用它來確定當你到達一個任意字符串的結尾。但是,一旦達到該點,is >> a;就會失敗,因此在最後一次遞歸調用中您不會想要執行cout << a;,但這很容易避免。您可以使用字符串流的故障狀態來確定何時停止。

0

in >> a嘗試in讀取一個字符。它可能會失敗。 in >> a的結果可以轉換爲bool來檢查它是否成功。

,才應執行遞歸調用和輸出一個字符可以被讀出。這可以通過使用in >> a作爲一個條件在if表達式來進行檢查:

void rev_out(istream& is) { 
    char a; 
    if (is >> a) { 
     rev_out(is); 
     cout << a; 
    } 
} 

Live demo

請注意,這是總是一個好主意,檢查這些表達式的結果,你永遠不知道輸入是否符合你要讀取的模式,特別是如果這種模式很複雜,比如當你讀取浮點數時......