C中的EOF不起作用

时间:2016-03-12 19:09:31

标签: c eof

我从输入中读取字符时遇到问题。当我按ENTER或CTRL + Z时,程序应该结束。

示例输入: LoreCTRL + Z ....正在骑自行车 但是当我按下CTRL + Z并且之前没有文字时,它可以工作。 有人能帮助我吗?感谢

int intFromConsole = getchar();
if((intFromConsole == EOF) || (intFromConsole == '\n')){
    //code
}

3 个答案:

答案 0 :(得分:2)

这可能与您的程序无关,而是与负责该行为的终端子系统(在内核中)无关。

您的终端通常处于"线路纪律"州。请注意,您的程序没有收到" Lore"直接,但只有当你按回车。 (输入是行缓冲的)。

另一个问题是,您通常不应期望Ctrl + Z(ASCII 26)作为输入,因为它在大多数终端状态下被终端子系统拦截,这会暂停您的程序并将其发送到后台。

您可以从Linus Akesson的文章The TTY demystified获取更多有趣的信息。

答案 1 :(得分:1)

函数getchar()使用缓冲输入。在Windows中,Ctrl-Z仅在newline条目后才会被识别。但在Windows中,您可能在库中可以使用conio.h。如果是这样,这里有一些东西供你试验。它立即接受每次击键,并以十六进制格式打印。它会在按下Ctrl-Z时退出。

#include <stdio.h>
#include <conio.h>

#define ENDOF 0x1A      // Ctrl-Z

int main(void) {
    int ch;
    do {
        ch = _getch();
        printf("%02X\n", ch);
    } while(ch != ENDOF);
} 

节目输入

1234<Ctrl-Z>

节目输出

31
32
33
34
1A

答案 2 :(得分:0)

  

当我按ENTER或CTRL + Z时,程序应该结束。

如果符合您的要求,您可以执行以下操作:

int main(void)
{
        char ch;

        do
        {
                while(ch!='\n')
                        getchar(); // waste the buffer

                /* Do the useful stuff here */

                ch=getchar();
        }while(ch!=EOF && ch!='\n'); 

        /* Note the logical operator is && . It says if the key pressed
         * is neither Enter nor Ctrl -Z do some stuff.
         * The program exits only when you directly press Enter key or
         * Ctrl -Z / Ctrl -D. Okay ! Now it is time to take a nice walk
         * thru the Grand Central Park.
         */ 

        return 0;
}

对于Linux机器,Ctrl-Z生成无法捕获的SIGSTOP。因此,要发出EOF信号,您应该使用Ctrl-D。

参考文献:

Linux Signals