[英]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.