【问题标题】:Why can't I end my input by this?为什么我不能以此结束我的输入?
【发布时间】:2014-11-14 01:39:55
【问题描述】:

我想通过输入终止我的输入,EOF(windows中的^Z),这是程序:

#include<stdio.h>
#include<conio.h>
int main(void)
{
    int c;
    while ((c = getchar()) != EOF)
    {
        if (c == '\t')
        {
            putchar('\\');
            putchar('t');
        }
        else if (c == '\b')
        {
            putchar('\\');
            putchar('b');
        }
        else if (c == '\\')
        {
            putchar('\\');
            putchar('\\');
        }
        else if (c == '\r')
        {
            puts("\\n");
          //  putchar('\n');
        }
        else{
            putchar(c);
        }
    }
    return 0;
}

这是我的输入和输出: 所以我问:为什么我不能通过第一个 ^Z 来终止我的输入?否则,为什么我必须输入 enter 来创建一个新行才能通过 ^Z 处的输入来终止我的输入?

【问题讨论】:

    标签: c++ c visual-c++


    【解决方案1】:

    查看以下讨论:

    在 Unix 上,Control-D(默认情况下)等同于 Windows 上的 Control-Z

    都指出第一次输入Control-Z时,输入中已经积累的输入被发送到程序中(不带换行符);发送的字符数非零,因此它还不是 EOF。第二次,您在行首键入 Control-Z,程序读取零字节,这被解释为 EOF。

    【讨论】:

      【解决方案2】:

      除了“这就是它的工作原理”之外,没有其他真正的理由。不过,您可以直接按 F6 。这将被视为文件结束的信号,即使它前面没有 enter

      你必须同时按F6 回车的原因很简单:这里涉及到两段独立的代码。操作系统有一个小的(有点残缺的)编辑例程,可以让你输入一行数据。它有处理退格的代码和一些类似的东西,所以你可以在输入数据时使用它们,即使你的代码根本不包含任何编辑功能。该例程将一行文本返回到您的程序,但当您输入了它被编程为“认为”为完整行的内容时 - 并且仅在 enter 被按下。

      一旦操作系统读入充满数据的缓冲区,它就会被发送到您的程序。您的程序查看内容,当/如果找到 ctrl+Z 时,它会将其读取为文件结束的信号。但是,由于文件处理的结束是由您的程序完成的,而不是操作系统的编辑例程,所以在您按下 enter 之前,它没有任何意义。

      如果您真的不喜欢这种行为,大多数操作系统确实提供了一些方法来进行非缓冲读取。确切的方式因操作系统而异。一个Windows,你可以使用_getch。大多数基于 Unix 的系统在 Curses 库中提供了大致相同的功能(如果您想使用它,至少还有一个针对 Windows 的免费 curses 实现)。

      【讨论】:

      • 当我使用F6的时候,我还得换行再输入^Z来终止我的输入,这意味着getchar()没有得到之前的^Z,否则会终止我的输入...但是,为什么?
      • @zhenganyi:直接按F6,然后回车。根本不需要输入 ^Z(直接)。
      • 然后我还必须输入两次 F6(相当于输入 ^Z,我的意思是)来终止我的输入,我还必须换行来终止它。我的问题是为什么我不能只在第一行的末尾键入 F6(或 ^Z,whatever)来终止我的输入?或者为什么程序在第一次遇到 ^Z 时不能终止我的输入?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      相关资源
      最近更新 更多