![](/img/trans.png)
[英]Why scanf(“%d”, […]) does not consume '\n'? while scanf(“%c”) does?
[英]Why does the Linux(?)-Terminal not “consume” '\n' EOF?
根據我的閱讀,Linux終端(默認設置)將緩沖輸入,並且僅在接收到EOF
或'\\n'
之后才發送輸入。
當我循環c = getchar();
並檢查每個c
是否為EOF
(結束然后中斷),我需要做兩次 CTRL-D以停止讀取,因為第一個EOF
總是被終端消耗(我知道一個人可以將終端更改為raw,但是也許這是有點矯kill過正)。
但是,當我檢查c
是否為'\\n'
(也會發送輸入)時,它不會被使用。
例:
'a'
, 'b'
, 'c'
, '\\n'
'a'
, 'b'
, 'c'
'a'
, 'b'
, 'c'
, EOF
'a'
, 'b'
, 'c'
, '\\n'
, EOF
這不是很矛盾嗎? 還是背后有任何理由?
我想解析包含空格的輸入,因此無法檢查'\\n'
而是檢查EOF
在不將終端更改為raw的情況下是否可行?
我也嘗試過feof(stdin)
,但是顯然這也不起作用:/
您誤解了Ctrl-D的功能。 Ctrl-D不會發送EOF,而是將終端緩沖區的當前內容發送到文件描述符,因此它將在下一個read
調用中返回。
另一方面,EOF是read
調用返回0個字符時。 因此,當終端緩沖區為空時,ctrl-D僅會導致EOF。
那不是它的工作原理。 ^D
在當前緩沖的行上發送,因此,如果您在換行符之后沒有立即擊中它,則您的程序將不會看到空讀取,並且也不知道輸入已結束。 因此,您需要另一個^D
來不發送任何內容。 但是您的程序永遠不會看到^D
實際上,您可以使用stty
更改終端的EOF
字符,例如, ^N
將結束輸入; 您的程序將完全相同地運行,因為它不依賴於EOF鍵盤字符的值。
PS。 由於您正在嘗試編寫C程序,因此當它們嘗試讀取文件時,輸入調用將返回EOF
,並獲得一個空緩沖區(0個字符)。 事實上, EOF
不是^D
如你想象,但-1
:之所以選擇這個值,因為它不適合在一個字節,而read()
可以合法地返回任何可能的字節(是的,甚至'\\04' aka ^D
)。 這就是為什么getchar()
的簽名說它返回一個int
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.