递归调用应该输出反向字符串

时间:2014-11-25 12:36:27

标签: c++ stringstream

你好在一起

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语句,例如&#34;在完全读取字符串后停止&#34;。因此,如果有任何你不知道的流,该函数就知道何时必须停止。是否有可能不首先计算字符串元素?

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

所有字符串文字都以空字符(\0)结尾,因此您可以使用它来确定何时到达任意字符串的末尾。但是,is >> a;一旦达到该点就会失败,因此您不希望在最后一次递归通话中执行cout << a;,但这很容易避免。您可以改为使用字符串流的失败状态来确定何时停止。

答案 1 :(得分: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.
}

答案 2 :(得分:0)

我相信这应该有用,但是没有经过考验。

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

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

基本上,您在尝试输出之前检查是否已到达流的末尾。如果你还没到最后一个,那么输出会在你回到堆栈时出现。

答案 3 :(得分: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

请注意,检查此类表达式的结果总是是一个好主意,因为您永远不知道输入是否与您尝试读取的模式匹配,特别是如果此模式很复杂比如你在读浮点数时......