【问题标题】:cin ignores eof character ? !!! and returns -0 value of ignored eof charactercin 忽略 eof 字符? !!!并返回 -0 被忽略的 eof 字符的值
【发布时间】:2011-06-19 08:26:42
【问题描述】:

这是我的递归程序,它反转在 eof 之前输入的数字,但是当找到 eof 字符 ^Z 时它不会停止。直到我按回车并在新行中写入 eof 字符。

示例图片:http://www.imageupload.org/?d=F9D743081

#include <iostream>
using namespace std;
void recursive()
{
    long double n;
    if((cin>>n))
        recursive();
        
    cout<<n<<endl;
}
int main()
{
    recursive();
    return 0;
}

怎么了?

【问题讨论】:

  • 您也可以在ideone.com 发布演示代码
  • 这就是 windows 命令行的工作方式。 ^Z 不是一个神奇的字符,它只是用来告诉cmd 关闭当前前台进程的输入的东西。 cmd 仅在它是一行的第一个字符时才解释它,并且它会在此发生之前等待您输入整行。

标签: c++ character cin eof


【解决方案1】:

您应该将代码编写为:

void recursive()
{
    long double n;
    if(cin>>n) // extra parens aren't necessary.
    {
       recursive();
       cout<<n<<endl;
   }
}

它现在只打印成功读取的值。您的程序也会打印不成功的读取;最后一次读取不成功,但您的cout 无论如何都会尝试打印n

顺便说一句,你不需要按^Z 来停止递归。您可以按一些字母或其他一些非数字字符来停止递归。

演示:http://www.ideone.com/D4XT1

【讨论】:

  • 如果我输入:13 21 22 ^Z ^Z ^Z ^Z 递归不会停止 .. 直到换行我在换行中写 ^Z .... 见附图 我的第一篇文章...
  • @David:我不知道 Windows 和流如何解释 ^Z。我认为这是不标准的。这就是为什么我建议你使用一些定义明确的字符。
  • Ctrl+Z 是 Linux Ctrl+D 的 Windows 等效项,表示输入结束。但是,在您按 Enter 之前,控制台输入不会读取任何内容。在旧系统上,终端直到线路完成后才会将输入发送到计算机。
  • 很好的答案,但我不禁觉得这是家庭作业。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多