C#控制臺輸入(Read()、ReadKey()和ReadLine())

下面我們來詳細講解 C# 中三種控制臺輸入方法Console.Read()Console.ReadKey()Console.ReadLine()區別、原理、使用場景,并配上清晰的代碼例子和運行結果說明


? 一、三者的根本區別(一句話總結)

方法返回值讀取方式是否等待回車是否顯示字符讀什么內容
Console.Read()int讀一個字符(ASCII碼)? 需要按回車? 顯示第一個字符 + \r\n 也會被讀到
Console.ReadKey()ConsoleKeyInfo讀一個按鍵? 不需要回車? 顯示(默認)按下的任意鍵(包括功能鍵)
Console.ReadLine()string讀一整行? 需要按回車? 顯示回車前的所有字符(自動去掉 \r\n

我們通過 代碼 + 詳細解釋 + 運行結果 來逐個說明。


1. Console.Read() —— 讀一個字符的 ASCII 碼

🔹 特點:

  • 返回的是 字符的 ASCII 碼(int 類型),不是字符本身。
  • 必須按 Enter 鍵才會觸發讀取。
  • 它只讀輸入緩沖區中的第一個字符,但 \r\n 也會留在緩沖區里,后續還能讀到。

🔹 代碼示例:

Console.Write("請輸入一個字符: ");
int x = Console.Read();
Console.WriteLine($"你輸入的字符是: {(char)x}");
Console.WriteLine($"ASCII 碼(十進制): {x}");
Console.WriteLine($"十六進制: {x:X}");// 再讀兩次,看看回車換行符
x = Console.Read();
Console.WriteLine($"第2次讀: 十進制={x}, 字符='{(char)x}'");  // 應該是 \r (13)x = Console.Read();
Console.WriteLine($"第3次讀: 十進制={x}, 字符='{(char)x}'");  // 應該是 \n (10)

🔹 運行過程(你輸入 A + 回車):

請輸入一個字符: A ?
你輸入的字符是: A
ASCII 碼(十進制): 65
十六進制: 41
第2次讀: 十進制=13, 字符='
第3次讀: 十進制=10, 字符='

💡 解釋:

  • A 的 ASCII 是 65。
  • 按回車后,系統自動加了 \r(13)和 \n(10),它們也被 Console.Read() 讀到了。

“Enter 鍵此動作也會產生回車(carriage return)字符‘\r’(十進制 13 或是十六進制 0xD)和換行(new line)字符‘\n’(十進制 10 或十六進制 0xA),這兩個字符會遺留在輸入緩沖區。”


🌟 1.1、什么是“輸入緩沖區”?

想象你敲鍵盤的時候,電腦不是立刻處理每一個鍵,而是先把所有你按下的鍵暫時存起來,就像一個“臨時小倉庫”,這個倉庫就叫 輸入緩沖區(Input Buffer)

當你按了 Enter 鍵后,程序才開始從這個“倉庫”里一個一個地讀取你之前按過的鍵。


🌟 1.2、按一次 Enter 鍵,到底發生了什么?

你可能覺得:我只是按了一下“回車”鍵,應該只產生一個“回車”的動作。

但在計算機世界里,“按回車”這個動作會被表示成兩個特殊的字符

字符名稱說明十進制十六進制轉義寫法
\r回車(Carriage Return)光標回到行首130xD\r
\n換行(New Line)光標下移一行100xA\n

💡 小知識:這個習慣來自打字機時代。“回車”是把打字頭拉到最左邊,“換行”是紙往上滾一行。

所以,當你按一次 Enter 鍵,系統會自動往輸入緩沖區里塞兩個字符:\r\n


🌟 1.3、我們來看例子

你運行了這段代碼:

int x;
Console.Write("請輸入字符 : ");
x = Console.Read();  // 第1次讀
Console.WriteLine($"字符十六進制 :{x:x}");
Console.WriteLine($"字符十進制  :{x}");x = Console.Read();  // 第2次讀
Console.WriteLine($"字符十六進制 :{x:x}");
Console.WriteLine($"字符十進制  :{x}");x = Console.Read();  // 第3次讀
Console.WriteLine($"字符十六進制 :{x:x}");

你輸入了:A,然后按了 Enter

那么,輸入緩沖區里就變成了這樣:

輸入順序:   A      \r      \n
ASCII碼:   65     13      10
十六進制:  0x41   0x0D    0x0A

🌟 1.4、程序是怎么讀的?
  • 第1次 Console.Read()

    • 從緩沖區讀第一個字符 'A'
    • 返回它的 ASCII 碼:65
    • 輸出:字符十六進制 :41(41 是 65 的十六進制)
  • 第2次 Console.Read()

    • 讀下一個字符 \r(回車)
    • 返回 13
    • 輸出:字符十六進制 :d(13 的十六進制是 0xD)
  • 第3次 Console.Read()

    • 讀再下一個字符 \n(換行)
    • 返回 10
    • 輸出:字符十六進制 :a(10 的十六進制是 0xA)

? 所以,總結一下:

你做了什么計算機怎么理解
輸入 A緩沖區加一個 'A'(65)
Enter緩沖區再加 \r(13)和 \n(10)
Console.Read() 讀3次分別讀到 65 → 13 → 10

這就是為什么你只輸入了一個字母 A,但程序能讀出三個值


🌟 1.5、Console.Read()Console.ReadLine() 的區別
方法行為
Console.Read()一個一個字符地讀,包括 \r\n,你需要自己處理這些“回車換行”字符。
Console.ReadLine()一次性讀一整行,并且自動把 \r\n 去掉,只返回你輸入的文字(比如 "A"),不會讓你看到 13 和 10。

? 推薦:如果你只是想讀一個字符或一行文字,優先用 Console.ReadLine(),更安全、更簡單。


? 舉個生活中的比喻:

想象你在點餐:

  • 你說:“我要一杯咖啡。”(相當于輸入 A
  • 然后你按下“提交”按鈕(相當于按 Enter

后臺系統記錄的是:

[你說的話]:我要一杯咖啡
[動作]:提交訂單(這個動作被記為 \r\n)

如果你用 Console.Read(),就像一個機器人一個字一個字地讀記錄:

  • “我” → 讀
  • “要” → 讀
  • \r → 讀(這是“提交”動作)
  • \n → 讀(還是“提交”動作的一部分)

Console.ReadLine() 就像聰明的服務員,只關心你說的內容,自動忽略“提交”動作。


? 總結一句話:

Enter 鍵不只是“確認”,它本身也會變成兩個看不見的字符 \r\n 存進輸入區。Console.Read() 會把它們當普通字符讀出來,所以你要小心處理;而 Console.ReadLine() 會自動幫你去掉它們。


2. Console.ReadKey() —— 讀一個按鍵(不需回車)

🔹 特點:

  • 不需要按回車,按下任意鍵立即返回。
  • 返回類型是 ConsoleKeyInfo,包含按鍵的字符、鍵名、是否按了修飾鍵(Ctrl、Alt、Shift)。
  • 默認會在控制臺顯示你按的字符(可關閉)。

🔹 代碼示例:

Console.Write("請按一個鍵: ");
ConsoleKeyInfo key = Console.ReadKey();Console.WriteLine(); // 換行
Console.WriteLine($"你按的字符: '{key.KeyChar}'");
Console.WriteLine($"對應的ASCII碼: {key.KeyChar}");
Console.WriteLine($"鍵名: {key.Key}");
Console.WriteLine($"是否按了Shift: {key.Modifiers.HasFlag(ConsoleModifiers.Shift)}");
Console.WriteLine($"是否按了Ctrl: {key.Modifiers.HasFlag(ConsoleModifiers.Control)}");

🔹 運行結果(你按 A):

請按一個鍵: A
你按的字符: 'A'
對應的ASCII碼: 65
鍵名: A
是否按了Shift: False
是否按了Ctrl: False

🔹 如果你按 Ctrl+C

請按一個鍵: 
你按的字符: ''
對應的ASCII碼: 3
鍵名: C
是否按了Shift: False
是否按了Ctrl: True

? 優勢:可以識別功能鍵(如 F1, , Ctrl+S 等),適合做快捷鍵。


3. Console.ReadLine() —— 讀一整行字符串

🔹 特點:

  • 讀取用戶從鍵盤輸入的一整行文本,直到按回車為止。
  • 返回 string 類型。
  • 自動去掉末尾的 \r\n,你拿到的是“干凈”的字符串。
  • 必須按回車才能結束輸入。

🔹 代碼示例:

Console.Write("請輸入你的名字: ");
string name = Console.ReadLine();Console.Write("請輸入你的年齡: ");
string ageStr = Console.ReadLine();// 轉成整數(安全方式)
if (int.TryParse(ageStr, out int age))
{Console.WriteLine($"你好,{name}!你今年 {age} 歲。");
}
else
{Console.WriteLine("年齡輸入無效!");
}

🔹 運行結果:

請輸入你的名字: 小明
請輸入你的年齡: 20
你好,小明!你今年 20 歲。

? 優點:最常用、最安全、自動處理 \r\n,適合大多數輸入場景。


? 三者對比總結(表格)

方法是否需要回車返回類型能讀什么典型用途
Console.Read()? 是int(ASCII碼)單個字符(包括 \r \n少用,容易出錯
Console.ReadKey()? 否ConsoleKeyInfo任意按鍵(含功能鍵)快捷鍵、菜單選擇
Console.ReadLine()? 是string一整行文本大多數輸入場景(推薦)

? 使用建議

你想做什么推薦方法
輸入名字、年齡、文本? Console.ReadLine()
做一個菜單,按任意鍵繼續? Console.ReadKey()
Y/N 確認? Console.ReadKey()(可判斷 key.KeyChar == 'Y'
讀一個數字? Console.ReadLine() + int.TryParse()
讀一個字符(且不能按回車)? Console.ReadKey()
一般情況? 優先使用 Console.ReadLine()

? 完整推薦寫法(安全讀整數)

Console.Write("請輸入一個數字: ");
if (int.TryParse(Console.ReadLine(), out int num))
{Console.WriteLine($"你輸入的是: {num}");
}
else
{Console.WriteLine("輸入的不是有效數字!");
}

? 總結一句話

  • 安全、簡單地讀輸入?用 Console.ReadLine()
  • 立即響應按鍵(比如游戲、菜單)?用 Console.ReadKey()
  • Console.Read() 很少用,除非你在處理底層字符流。

希望這個講解讓你徹底搞懂了這三個輸入方法的區別!如果有疑問,歡迎繼續提問 😊

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95714.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95714.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95714.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows的Roaming文件夾的作用和Local/LocalLow的區別

📁 Roaming 文件夾的核心意義? 什么是“漫游”(Roaming)?跨設備同步:當用戶登錄到同一域內的不同 Windows 設備(如公司或學校的辦公電腦)時,Roaming 文件夾中的數據會自動通過網絡同…

【Java Web 快速入門】十一、Spring Boot 原理

目錄Spring Boot 原理配置優先級Bean 管理獲取 BeanBean 的作用域第三方 BeanSpring Boot 底層原理起步依賴自動配置核心原理實例說明例 1:自定義一個 “日志 starter”例 2:SpringBoot 自帶的 spring-boot-starter-web關鍵總結Spring Boot 原理 配置優…

基于Redisson的分布式鎖原理深度解析與優化實踐

基于Redisson的分布式鎖原理深度解析與優化實踐 分布式環境下,鎖的實現至關重要。本文將從技術背景與應用場景出發,結合核心原理、關鍵源碼、實際示例,深入剖析Redisson分布式鎖的實現機制,并給出性能優化建議,幫助后端…

室外 3DVG 基準

室外 3DVG基準(按重要性與被引用頻率) Talk2Car / Talk2Car-3D (2019 / 衍生) — 對象 referral(駕駛場景) 說明:最早的自然語言 → 駕駛場景對象引用數據集之一(原 Talk2Car 是以 nuScenes 為底并提供自然…

Jenkins安裝部署(Win11)和常見配置鏡像加速

一、安裝前準備 本文使用的Jenkins Windows一鍵安裝包,JDK事先配置好環境變量,Jenkins版本: Jenkins下載地址:jenkins一鍵安裝包v2-479-1.msi資源-CSDN下載 二、Jenkins安裝部署 1、下載Jenkins ,點擊下一步下一步…

Windows MCP.Net:革命性的 .NET Windows 桌面自動化 MCP 服務器

📋 目錄 項目概述 核心技術架構 功能特性詳解 技術實現亮點 安裝與配置 實戰應用場景 代碼示例與API詳解 性能優化與最佳實踐 未來發展規劃 總結 項目概述 在人工智能快速發展的今天,AI 助手與操作系統的深度集成成為了一個重要趨勢。Window…

Java ArrayList的介紹及用法

十分想念順店雜可。。。ArrayList 是 Java 集合框架中最常用的類之一,實現了 List 接口,底層基于動態數組實現,支持動態擴容,相比普通數組更靈活。以下是其詳細介紹及用法:一、核心特性動態大小:無需預先指…

Docker 命令大全及使用場景總結

一、容器生命周期管理1. 創建并運行容器docker run [選項] 鏡像名 [命令]常用選項:-d:后臺運行(detached)-it:交互式終端(如 -it ubuntu bash)--name:指定容器名稱-p 主機端口:容器端…

簡單的 HTTPS 學習

簡單的 HTTPS 學習 1. 需求 現在使用的服務是HTTP調用形式,服務可能會有調用外圍https形式的服務,簡單了解了一下,然后寫了一個簡單的例子進行記錄。 HTTP(超文本傳輸協議) 是一種用于傳輸超文本的應用層協議&#…

[系統架構設計師]系統質量屬性與架構評估(八)

[系統架構設計師]系統質量屬性與架構評估(八) 一.軟件系統質量屬性 1.基本概念 軟件系統質量屬性:可測量或可測試的屬性 開發期質量屬性,運行期質量屬性面向架構評估的質量屬性:1.可用性: 提升策略 錯誤檢測…

【R語言】R 語言中 gsub 與正則表達式詳解(含 POSIX 與 Perl 風格實例)

R 語言中 gsub 與正則表達式詳解(含 POSIX 與 Perl 風格實例) 在 R 語言中,字符串處理是非常常見的需求,R 語言中的 gsub() 函數則具有字符串替換的功能。本文將通過兩個實例,幫助你深入理解 R 的 gsub()、POSIX 字符…

EN55035多媒體設備電磁兼容性抗干擾要求標準

EN55035 是一項由歐洲標準化委員會制定的電磁兼容性(EMC)標準,全稱為《多媒體設備的電磁兼容性要求》。該標準主要針對多媒體設備的電磁輻射和抗干擾能力進行規范,確保這類設備在電磁環境中能夠正常工作,同時不對其他設…

計算分組內時間列的最大差值

計算分組內時間列的最大差值 在 Pandas 中,要計算每個分組內 time 列的最大值與當前行值的差值,需結合 groupby() 和 transform() 方法。核心步驟如下:分組計算最大值 使用 transform(max) 獲取每個分組中 time 列的最大值,結果會…

CUDA 編程筆記:CUDA延遲隱藏

一、核心概念:延遲隱藏(Latency Hiding)是 GPU 通過多線程機制掩蓋指令延遲的關鍵技術。當某些線程束(warp)因指令延遲(如內存訪問或算術計算)而等待時,其他就緒線程束會立即被調度執…

MySQL工具包中的其他程序

雖然有很多不同的程序,但有些選項是公共的,比兔用戶名和密碼,使用方法和MySQL相同,在這里統一列出,后面我們介紹不同的工具時,只討論個性的選項以及作用以下是常用的MySQL程序:程序名作用mysqld…

C#WPF實戰出真汁09--【消費開單】--選擇菜品

1、功能介紹當選擇一個空桌時,必須先開臺才能開單,可以先開臺,再開單,也可以開臺的同時開單當選擇一個用餐中的餐桌時,必須顯示該桌前面已經點好的菜品,同時可以繼續點餐或結賬所以無論哪個功能都涉及選擇菜…

大廠語音合成成本深度對比:微軟 / 阿里 / 騰訊 / 火山 API 計費拆解與技術選型指南

在 AI 配音、智能客服、教育音頻等場景爆發的當下,語音合成 API 已成為企業技術棧中的核心組件。然而,不同云廠商的計費規則差異顯著,短文本 / 長文本計費分離、預付費 / 后付費價格梯度懸殊、音色授權費暗藏成本陷阱等問題,常導致…

Flutter開發 網絡請求

HttpClient&#xff08;dart自有&#xff09; 1.get 點擊請求按鈕獲取數據&#xff0c;解析數據獲取單詞展示到屏幕上。class MyState extends State {String info "暫無數據";List<Widget> texts [];overridevoid initState() {super.initState();}override…

vscode中用python調用matlab的函數(環境安裝)

本實踐適用于WIN11-x64和ubuntu22.04-x64系統&#xff0c;其余系統和架構未驗證。 效果展示 1.環境要求 MATLAB Engine API for Python 的系統要求&#xff1a;參閱此官方文檔MATLAB 與 Python 的版本兼容性&#xff1a;參閱此官方文檔 2.安裝步驟 安裝Vscode&#xff08;不…

【數據分享】大清河(大慶河)流域上游土地利用

而今天要說明數據就是大清河&#xff08;大慶河&#xff09;流域上游土地利用。數據介紹大清河&#xff0c;又稱大慶河&#xff0c;作為海河流域的重要支流&#xff0c;其流域上游地區不僅是區域水資源調控的關鍵節點&#xff0c;更是生態保護與經濟發展的重要載體。以下從地理…