簡體   English   中英

為什么我不能通過這個結束我的輸入?

[英]Why can't I end my input by this?

我想通過輸入,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來終止我的輸入?

請參閱以下討論:

在Unix上, Control-D (默認情況下)等同於Windows上的Control-Z

所有人都指出,第一次鍵入Control-Z時 ,已經在輸入中累積的輸入被發送到程序(沒有換行符); 發送的字符數非零,因此還沒有EOF。 第二次,在行的開頭鍵入Control-Z ,程序獲取零字節以進行讀取,這被解釋為EOF。

沒有真正的理由超越“它的工作原理”。 你可以按F6而不是。 這將被視為發出文件結束的信號,即使它沒有輸入

你必須同時按下F6 輸入的原因很簡單:這里涉及兩個獨立的代碼片段。 操作系統有一個小的(有些癱瘓的)編輯例程,可以讓您輸入一行數據。 它具有處理后退空間的代碼和一些類似的東西,因此您可以在輸入數據時使用它們,即使您的代碼根本不包含任何編輯功能。 該例程會向您的程序返回一行文本,但只有在您輸入的程序被“編程”為完全行時才會返回 - 並且僅在按下enter時才會發生。

一旦操作系統讀入了滿載數據的緩沖區,就會將其發送到您的程序。 你的程序查看內容,當它/如果找到ctrl + Z時 ,它會將其視為發送文件結尾的信號。 但是,由於文件處理的結束是由您的程序完成的,而不是操作系統的編輯程序,因此在您按下回車之前無法感知它。

如果你真的不喜歡這種行為,大多數操作系統確實提供了一些無緩沖讀取的方法。 確切的方式因操作系統而異。 一個Windows,你可以使用_getch 大多數基於Unix的系統在Curses庫中提供大致相同的功能(如果你想使用它,那么至少還有一個免費的Windows curses實現)。

暫無
暫無

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

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