不學 JAVA 換學 C# 之覺得心累 - L1:ch1 Console 類別的輸入和輸出方法
介紹
Console
一般又稱主控台、控制台,是僅以文字顯示訊息和結果的介面,像是一種特殊的終端機、命令提示字元。在 C# 中是 System 命名空間
底下的一個 Class (類別)。
1 | using System; |
WriteLine、Write 方法
WriteLine
是 Console 類別
底下的一個 method (方法),可以將 ()
中的參數 (這裡是字串),輸出到螢幕,在 () 輸入的參數,是以 "" (雙引號)
包住的字串 (想要輸出到螢幕被使用者閱讀的字串),並且將游標移動到下一行 (換行)。另外 Write
也是常用的同樣功能 method,差別是不換行。
所以下面的這行的意思是,在主程式中呼叫 Console 類別底下的 WriteLine 方法,並傳入字串參數,用法是使用 .(點)
連接。
1 | Console.WriteLine("Hello"); |
; 在程式中是句號的意思,一定要加
程式碼的執行順序是:
- 呼叫 method (WriteLine)
- 傳入參數
- 執行 method (WriteLine) 的內部功能 (這邊是在主控台中輸出 Hello)
記得呼叫 method 時,後方一定要加 (),括弧內可能需要,也可能不需要放入參數
ReadLine、ReadKey、Read 方法
在 Windows 系統下,如果在 Main method 只有一行程式碼 Console.WriteLine("Hello");
,使用者其實只能看到主控台閃現一下,隨即消失,因為主控台在輸出 Hello 後,程式隨即結束,主控台跟著關閉。因此使用者想要真的看到 Hello,記得在結尾加 ReadLine
或 ReadKey
。
ReadLine
是讀取輸入的一串字串直到按下 enter,ReadKey
是讀取一個字元,程式和主控台必須停下來等使用者輸入後,才會有後續動作,因此畫面停下來的時候,使用者就能看到 Hello。
Mac 系統中,主控台裡自帶一行 Press any key to continue...
。所以即使不加 ReadLine
,主控台也會暫停在畫面中,等待使用者輸入,使用者自然也就看得到 Hello 了。但是我的習慣還是會加 ReadLine
。
這邊要特別注意的是,有另一個叫做 Read
的方法:
Console.ReadKey()
:每次等待輸入新的字元。Console.Read()
:是從緩衝區之中讀取一個字元,若緩衝區之內,已經有之前輸入過的字,則不會讓使用者輸入新字元,會直接依序讀取之前輸入過的字元;若緩衝區之內沒有字元,則等待輸入新的字元們,直到使用者按下 enter,但是只會讀取第一個字元,其他字元繼續待在緩衝區。
Windows 系統中
使用者輸入字串,按下 enter 之後,其實是將輸入的字串暫存在系統的一塊記憶體空間之中,俗稱緩衝區 (buffer),並且會在結尾做處理。
當呼叫 Console.Read() 時,它其實是從緩衝區之中,逐一讀取一個字元。
如下圖中:
- 如果使用者輸入 enter:第一次
Read
會停下,等待使用者輸入,如果使用者輸入 enter,會讀取到 ASCII 為 13 的回車符號 (也就是 enter,\r),第二次Read
不會停下,直接取讀取到 ASCII 為 10 的換行符號 (也就是 \n)。此時,如果還有下一個Read
,就會停下等使用者輸入,因為 buffer 中已經沒有字元。 - 如果使用者輸入 r:第一次
Read
會停下,等待使用者輸入,如果使用者輸入 r -> enter,會讀取到 ASCII 為 114 的 r,第二次Read
不會停下,直接取讀取到 ASCII 為 13 的 \r,第三次Read
不會停下,直接取讀取到 ASCII 為 10 的 \n。此時,如果還有下一個Read
,就會停下等使用者輸入,原因同上。 - 如果使用者輸入 er:第一次
Read
會停下,等待使用者輸入,如果使用者輸入 er -> enter,會讀取到 ASCII 為 101 的 e,第二次Read
不會停下,直接取讀取到 ASCII 為 114 的 r,第三次Read
不會停下,直接取讀取到 ASCII 為 13 的 \r,第四次Read
不會停下,直接取讀取到 ASCII 為 10的 \n。如果還有下一個Read
,就會停下,原因同上。
所以就算使用者只輸入一次,也並不是每一次的 Read
都會停下來等使用者輸入。
Mac 系統中
每一次的 Read
一定會停下來等使用者輸入,如下圖中:
- 如果使用者輸入 enter:
Read
會讀取到 ASCII 為 10 的換行符號 (也就是 \n)。 - 如果使用者輸入 r -> enter:
Read
會讀取到 ASCII 為 114 的 r,下一個Read
會停下等待使用者輸入,使用者輸入後,會讀取到 ASCII 為 10 的 \n。
會有這樣的差異是因為,Windows 系統和 Mac 系統在字串結尾,加入不同的符號的關係。
總結
常用來要求使用者輸入或輸出在 Console 螢幕的函式/方法。
命名空間 Namespace: System
。
Console.Write(指定資料): Writes the text representation of the specified value or values to the standard output stream. (將指定資料顯示在 Console 螢幕上,不換行。)
Console.WriteLine(指定資料): Writes the specified data, followed by the current line terminator, to the standard output stream. (將指定資料顯示在 Console 螢幕上,並且換行。)
Write("An example\n");
等於 WriteLine("An example");
。
Console.Read(): Reads the next character from the standard input stream. (從標準輸出流,讀取一個字元。)
Console.ReadKey(): Obtains the next character or function key pressed by the user. The pressed key is displayed in the console window. (從標準輸出流,讀取一個字元。)
Windows 電腦之中,在輸入字元,再按下 enter 之後,其實是將你輸入的字串暫存在系統的一塊記憶體空間之中,俗稱緩衝區 (buffer),當你呼叫 Console.Read()
時,它其實是從緩衝區之中讀取一個字元,若緩衝區之內,已經有之前輸入過的字,就會依序先讀取之前輸入過的字,否則等待輸入新的字元。Console.ReadKey()
則是每次等待輸入新的字元。
Console.ReadLine(): Reads the next line of characters from the standard input stream. (讀取使用者輸入的,一串字元形成的字串,直到輸入 enter 鍵。)