簡體   English   中英

使用 getc 從控制台讀取 \r(回車)與 \n(換行符)?

[英]Reading \r (carriage return) vs \n (newline) from console with getc?

我正在寫一個 function 基本上等待用戶點擊“輸入”然后做一些事情。 我發現在測試時有效的是:

#include <stdio.h>

int main()
{
        int x = getc(stdin);
        if (x == '\n') {
                printf("carriage return");
                printf("\n");
        }
        else {
                printf("missed it");
                printf("\n");
        }
}

我的問題是,我最初嘗試的是: if (x == '\r')但在測試中,程序沒有發現我按下回車鍵。 '\n'似乎對應於我從控制台按回車鍵。 有人可以解釋其中的區別嗎? 另外,為了驗證,把它寫成if... == "\n"意味着字符串文字? 也就是說,用戶實際上必須從控制台輸入"\n" ,對嗎?

\n是換行符,而\r是回車符。 它們的用途不同。 Windows 使用\r\n表示按下回車鍵,而 Linux 和 Unix 使用\n表示按下回車鍵。

因此,我總是使用\n因為它被所有人使用; if (x == '\n')是測試字符相等性的正確方法。

'\n' 是“換行”,'\r' 是回車。 不同的操作系統會以不同的方式處理新行,例如

Windows

期望換行符是兩個字符的組合,'\r\n'。

Linux\Unix 和現代 Mac OS

使用單個 '\n' 換行。

經典 Mac 操作系統

使用單個 '\r' 換行。

基本上,我會使用if (x == '\n')因為它目前被所有現代操作系統使用。

表示新行有多個抽象級別 - 編程語言運行時、文本編輯器和操作系統。 CR(回車)和 LF(換行)是 ASCII 中定義的兩個控制字符。 其他一些字符編碼也可能定義“換行”字符。 任何鍵盤上的回車鍵都傳達了“到下一行的開頭”的意思。 鍵盤決定如何將 map 回車鍵輸入到其對應的一個或多個控制字符。 有些鍵盤還區分 Enter 和 Return 鍵 - 讓 Enter 鍵換行,Return 鍵回車。 在標准的 ANSI 鍵盤中,只有 Enter 鍵,它映射到 ASCII 中的回車符 (13)。 所以這是設備發送給操作系統的實際內容。 但是,不同的操作系統決定以不同方式解釋 Enter 鍵。 因此,在類 Unix 系統中,任何回車符在交給接收輸入的程序之前都會被轉換為換行符(ASCII 中的 10)。 在 Windows 上,一個 CR 被翻譯成兩個字符——一個 CR 后跟一個 LF。 但是,您可以將輸入 stream 設置為原始模式,在這種情況下,程序會獲取鍵盤實際發送的內容。 現在編輯器開始發揮作用了。 當編輯器以原始模式從標准輸入接收到 CR 時,它知道 CR 對應於鍵盤上的 Enter 鍵(關於鍵盤的假設)並且它應該在屏幕上顯示一個新行。 在原始模式下,它應該調用寫入系統調用 output 一個 CR + LF。 如果 output stream 不在原始模式下,文本編輯器應該 output 操作系統特定的序列,例如 linux 上的 LF。

最后,語言運行時也可以用自己的方式解釋新行。 例如,C 標准說當以文本模式寫入文件時,'\n' 被透明地轉換為系統使用的本機換行符序列,它可能長於一個字符。 在文本模式下閱讀時,本機換行符序列被轉換回“\n”。 在二進制模式下,不進行翻譯,'\n'產生的內部表示直接為output。 請注意,'\n' 和 '\r' 是特定於語言的字符,分別表示 LF 和 CR,它們在類 C 語言中很流行。 但並非每種語言都必須使用這種表示法。

對於第二個問題,“\n”是“\n”后跟一個“\0”終止符。 無法從控制台輸入“\0”。

還要記住,如果您輸入 25 個字符並按 Enter,第一個getc將不會返回,直到輸入所有 25 個字符並按 Enter。 在輸入字符時讀取字符需要特定於平台的代碼。 因此,您最好通過對字符串執行fgets 、修剪換行符並將輸入行作為一個整體來處理來讀取整行。

暫無
暫無

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

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