为啥我不能以此结束我的输入?

Posted

技术标签:

【中文标题】为啥我不能以此结束我的输入?【英文标题】: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 处的输入来终止我的输入?

【问题讨论】:

【参考方案1】:

查看以下讨论:

read() from stdin doesn't ignore newline How can I make the word count program (from K&R) terminate after just one application of Control-D How to simulate EOF without preceding newline in C

在 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 时不能终止我的输入?

以上是关于为啥我不能以此结束我的输入?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我输入某个形状区域的测量值后程序没有结束?

为啥我不能在我的 jQueryUI 模式对话框中输入 TinyMCE?

为啥我不能在我的 pygame 文本框中输入超过 1 个字母? [复制]

JAVA如何判断输入结束

为啥我的命令提示符界面只能输入中文而不能输入英文!十分感谢!

为啥我的电脑按ctrl+shift不能切换输入法