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

VS2013 C 語言 scanf_s 讀取字符跳過輸入:緩衝區殘留換行符導致

     編輯:程式設計綜合問答

問題代碼

int a, b; char c;
scanf_s("%d", &a);
scanf_s("%d", &b);
scanf_s("%d", &c);  // 讀取運算符,但用了 %d 且緩衝區有換行符
// 程序直接跳過,不等待輸入

根因:緩衝區殘留 \n

  • scanf_s("%d", &a) 讀取整數,**留下換行符 \n 在標準輸入緩衝區**。
  • 後續 scanf_s("%d", &c) 遇到 \n 非數字,**匹配失敗立即返回**,不阻塞等待,導致「跳過輸入」。
  • 且運算符應用 %c 讀取字符,而非 %d。

修正代碼

int a, b; char op;
printf("請輸入第一個操作數: ");
scanf_s("%d", &a);
printf("請輸入第二個操作數: ");
scanf_s("%d", &b);

// 關鍵:消耗緩衝區殘留換行符
getchar();  // 或 scanf_s("%*c");  // * 表示讀取但不賦值

printf("請輸入您的運算符 (+ - * /): ");
scanf_s(" %c", &op, 1);  // 格式串前加空格,自動跳過空白字符(含\n)
// MSVC scanf_s 讀字符需指定寬度:%c 後跟緩衝區大小 1

// 計算邏輯...
int result = (op == '+') ? a+b : (op == '-') ? a-b : (op == '*') ? a*b : a/b;
printf("結果: %d\n", result);

關鍵點總結

問題解決
換行符殘留導致後續 scanf 跳過getchar() 或 scanf_s("%*c") 消耗一個字符
運算符用 %d 讀取改用 %c,且 scanf_s("%c", &op, 1) 指定寬度
scanf_s 讀字符不跳過空白格式串 " %c" 前加空格,自動跳過 \n/空格/制表符
除零無保護除法前判斷 b != 0

VS2013 scanf_s 特有要求

  • %c、%s、%[ 格式**必須緊跟緩衝區大小參數**:scanf_s("%c", &ch, 1)、scanf_s("%s", buf, sizeof(buf))。
  • 這是 MSVC 安全增強,標準 scanf 不需要。

總結

C 語言 scanf 系列讀取後留下換行符,導致後續字符讀取跳過。**每次讀字符前加 getchar() 清理緩衝區,格式串用 " %c" 跳過空白,scanf_s 記得加寬度參數**。

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