2014-11-25 33 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

请注意,这是总是一个好主意,检查这些表达式的结果,你永远不知道输入是否符合你要读取的模式,特别是如果这种模式很复杂,比如当你读取浮点数时......