簡體   English   中英

C中的EOF不起作用

[英]EOF in C doesnt work

我在從輸入中讀取字符時遇到問題。 當我按 ENTER 或 CTRL + Z 時,程序應該結束。

示例輸入:LoreCTRL+Z .... 正在循環,但是當我按 CTRL+Z 並且它之前沒有文本時,它可以工作。 有人可以幫我嗎? 謝謝

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

這可能與您的程序無關,而是與負責該行為的終端子系統(在內核中)有關。

您的終端通常處於“線路紀律”狀態。 請注意,您的程序不會直接接收“Lore”,而只會在您按回車鍵時接收。 (輸入是行緩沖的)。

另一個問題是,您通常不應該期望 Ctrl+Z (ASCII 26) 作為輸入,因為它在大多數終端狀態下被終端子系統攔截,這會暫停您的程序並將其發送到后台。

您可以從 Linus Akesson 的文章The TTY demystified 中獲得更多有趣的信息。

函數getchar()使用緩沖輸入。 在 Windows 中, Ctrl-Z僅在newline條目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

當我按 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 信號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM