你好在一起
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;。因此,如果有任何你不知道的流,该函数就知道何时必须停止。是否有可能不首先计算字符串元素?
感谢您的帮助!
答案 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 强>
请注意,检查此类表达式的结果总是是一个好主意,因为您永远不知道输入是否与您尝试读取的模式匹配,特别是如果此模式很复杂比如你在读浮点数时......