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

C語言 scanf 輸入格式匹配題:%d%c%d%c 正確輸入形式分析

     編輯:C 語言問答

題目還原

scanf("%d%c%d%c", &a1, &c1, &a2, &c2);

欲使 a1=10, c1='X', a2=20, c2='Y',以下輸入形式正確的是?

(A) 10 X 20 Y⏎ (空格分隔)

(B) 10 X20 Y⏎

(C) 10 X⏎ 20 Y⏎ (分行)

(D) 10X⏎ 20Y⏎ (無分隔符)

格式串 %d%c%d%c 掃描語義

  1. %d:跳過空白,讀取整數,停在第一個非數字字符 (留在緩衝區)。
  2. %c:**不跳過空白**,直接讀取下一字符 (含空格、換行)。
  3. %d:跳過空白,讀取整數...
  4. %c:直接讀取下一字符。

各選項逐一模擬

選項輸入流 (可見字符用 · 表示空格, ⏎ 表示換行)掃描過程結果
(A)10·X·20·Y⏎1.%d→10 留·
2.%c→· (空格!)
3.%d→跳過· 讀20
4.%c→Y
c1=' ' ❌
(B)10·X20·Y⏎1.%d→10 留·
2.%c→· (空格!)
3.%d→跳過· 讀20
4.%c→Y
c1=' ' ❌
(C)10·X⏎20·Y⏎1.%d→10 留·
2.%c→· (空格!)
3.%d→跳過⏎· 讀20
4.%c→Y
c1=' ' ❌
(D)10X⏎20Y⏎1.%d→10 留 X
2.%c→X ✅
3.%d→跳過⏎ 讀20
4.%c→Y ✅
全部匹配 ✅

關鍵洞察

  • %d 後**不需要顯式分隔符**,因為下一個 %d 會自動跳過空白;但 %c **不跳過空白**,所以 %d 後**必須緊跟目標字符**,中間不能有空格/換行。
  • 選項 (D) 10X⏎20Y⏎ 正好滿足:10 後直接是 X,20 後直接是 Y。

補充:為何原帖測試 (D) 顯示「不輸出」?

/* 原帖測試代碼可能缺少輸出語句或格式錯誤 */
printf("%d%c%d%c\n", a1, a2, b1, b2);  // 變量名錯誤、缺少 \n 刷新緩衝區
/* 正確輸出 */
printf("a1=%d, c1=%c, a2=%d, c2=%c\n", a1, c1, a2, c2);

最佳實踐建議

  1. 避免混用 %d 和 %c:改用 %d %d 讀兩數,單獨 scanf(" %c", &c) 讀字符 (前置空格跳過空白)。
  2. 或用 fgets + sscanf:整行讀取後解析,完全控制格式。
  3. 考試技巧:遇到 %c 立即想到「不跳過空白」,檢查前一格式符留下的字符是否為目標字符。

總結

格式串 %d%c%d%c 要求 %d 後**緊跟**目標字符 (無空白)。唯有選項 (D) 10X⏎20Y⏎ 滿足條件,使 a1=10, c1='X', a2=20, c2='Y' 正確賦值。實際編程中建議分離數值與字符輸入,避免此類格式匹配陷阱。

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