2012-04-07 123 views
17

我正在寫一個函數,基本上等待用戶點擊「輸入」,然後做一些事情。什麼我發現,當測試是下面的作品:使用getc從控制檯讀 r(回車)與 n(換行符)?

#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",對嗎?

+0

相關:http://stackoverflow.com/questions/1355095/what-is-the-difference-between-r-and-n – Mysticial 2012-04-07 23:20:32

+1

C對單引號和雙引號文字應用轉義,所以「\ n」是字符串長度爲兩個字符,第一個是ASCII碼10(\ n本身),第二個是ASCII NUL(空終止符)。 – toriningen 2012-04-07 23:30:38

+1

(我希望你不介意編輯標題,他們在那裏,使之更加搜索) – 2012-04-07 23:32:14

回答

26

\n是換行符,而\r是回車符。他們在使用它們的方面有所不同Windows使用\r\n來表示按下回車鍵,而Linux和Unix使用\n表示回車鍵被按下。

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

13

'\ n'是「換行符」,'\ r'是回車符。不同的操作系統將處理以不同的方式新的生產線,如

的Windows

需要一個換行符是兩個字符「\ r \ n」組合。

的Linux \ Unix和現代的Mac OS

用單一的 '\ n' 的新行。

經典的Mac OS

採用了新的生產線一個單一的 '\ R'。

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

+0

Mac取決於版本[新行](http://en.wikipedia.org/wiki/Newline)。 – 2012-04-07 23:27:15

+3

我想你的意思是經典的Mac OS爲'\ r'換行符,因爲現代Mac OS X是UNIX並使用'\ n'換行符。 – toriningen 2012-04-07 23:27:43

+0

你們都是正確的,我應該更具體。 – josephthomas 2012-04-07 23:29:31

2

還請記住,如果您鍵入25個字符並輸入,則在輸入所有25個字符並且您按Enter鍵後,第一個getc將不會返回。在輸入字符時讀取字符需要特定於平臺的代碼。因此,通過在字符串中執行fgets,修整換行符和處理整個輸入行,可能會更好。

0

使用gets()可以解決緩衝區溢出漏洞以及可能的shell代碼攻擊。您應該使用fgets()並傳入緩衝區大小。

+3

這應該是一個評論,而不是一個答案 – Pranjal 2016-06-03 17:43:09

0

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

最後,語言運行時也能夠解釋自己的方式的新的生產線。例如,C標準規定,當以文本模式寫入文件時,'\ n'會透明地轉換爲系統使用的本地換行符序列,該序列可能比一個字符長。在文本模式下閱讀時,本地換行符序列被轉換回'\ n'。在二進制模式下,不執行翻譯,並且由'\ n'生成的內部表示直接輸出。請注意,'\ n'和'\ r'是特定於語言的字符,它們分別代表在C語言中很受歡迎的LF和CR。但並非每種語言都必須使用這種表示法。

對於你的第二個問題, 「\ n」 是 '\ n' 後 '\ 0' 終止。沒有辦法從控制檯輸入'\ 0'。