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

C 語言 scanf_s 讀取字元後程式卡住:緩衝區殘留換行符與尺寸參數陷阱

     編輯:程式設計綜合問答

問題程式碼

char ch;
scanf_s("%c", &ch);  // VC++ 專用安全版本
scanf_s("%d%d", &n, &m);

輸入字元按 Enter 後,程式似乎卡住或跳過後續輸入。

根本原因

  1. 緩衝區殘留換行符:第一次 scanf_s("%c") 讀取字元,換行符 '\n' 留在 stdin。第二次 scanf_s("%d") 遇到 '\n' 視為空白略過,但若格式不匹配則失敗。
  2. scanf_s 要求緩衝區大小:MSVC scanf_s("%c", &ch) 需第三參數 sizeof(ch),否則編譯警告/執行時錯誤。

修正寫法

// 方法 1:加空白吃掉空白字元(推薦)
scanf_s(" %c", &ch, sizeof(ch));  // 格式字串前加空格

// 方法 2:額外讀取換行符
scanf_s("%c", &ch, sizeof(ch));
getchar(); // 吞掉 '\n'

// 方法 3:改用 fgets + sscanf 完整讀行解析(最穩健)
char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%c", &ch);

scanf_s 與 scanf 差異速查

特性scanfscanf_s (MSVC)
標準C99/C11Microsoft 擴充 (C11 Annex K)
%c/%s/%[無需大小必須提供緩衝區大小
跨平台是否 (需 _CRT_SECURE_NO_WARNINGS)

最佳實踐建議

  • 教學/競賽環境優先用標準 scanf,避免尺寸參數困擾。
  • 正式專案啟用 scanf_s 並嚴格傳遞大小,或改用 fgets/sscanf 組合完全掌控輸入流。
  • 讀取字元前在格式字串加空格 " %c",自動跳過所有空白字元(含換行、空格、Tab)。

理解 stdin 緩衝區機制與 scanf_s 介面契約,是避免 C 輸入處理「卡住」的關鍵。

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