首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# if-else 巢狀陷阱:Console.ReadLine() 重複呼叫導致輸入異常

     編輯:程式設計綜合問答

錯誤程式碼

Console.WriteLine("你是否要繼續查看?yes/no");
if (Console.ReadLine() == "yes")
{
    Console.WriteLine("請查看相關內容。");
}
else if (Console.ReadLine() == "no")  // ❌ 第二次呼叫會再等待輸入
{
    Console.WriteLine("你放棄查看相關內容。程序退出。");
}

現象:輸入一次 "no" 無反應,第二次輸入 "no" 才進入分支。

原因分析

  • Console.ReadLine() 會**阻塞並消耗**一行標準輸入。
  • 第一個 if 條件判斷時已呼叫一次,若輸入 "no",條件為 false。
  • else if 再次呼叫 Console.ReadLine(),**等待下一行輸入**,導致使用者以為程式卡住。

正確寫法:暫存輸入結果

Console.WriteLine("你是否要繼續查看?yes/no");
string input = Console.ReadLine();  // ✅ 僅讀取一次
if (input == "yes")
{
    Console.WriteLine("請查看相關內容。");
}
else if (input == "no")
{
    Console.WriteLine("你放棄查看相關內容。程序退出。");
}
else
{
    Console.WriteLine("輸入無效,預設退出。");
}

進階:輸入驗證與迴圈

string input;
do
{
    Console.Write("請輸入 yes/no: ");
    input = Console.ReadLine()?.Trim().ToLower();
} while (input != "yes" && input != "no");
// 後續邏輯...

延伸:非阻塞單鍵檢測

若需即時單鍵響應 (無需 Enter),可用:

ConsoleKeyInfo key = Console.ReadKey(intercept: true); // 不回顯
if (key.Key == ConsoleKey.Y) { /* yes */ }
else if (key.Key == ConsoleKey.N) { /* no */ }

總結

每次呼叫 Console.ReadLine() 都會消耗一行輸入**。條件判斷中務必「一次讀取、多次比較」,避免邏輯與輸入流脫節。此原理同樣適用於 Scanner.nextLine() (Java)、input() (Python) 等阻塞式讀取 API。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved