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 掃描語義%d:跳過空白,讀取整數,停在第一個非數字字符 (留在緩衝區)。%c:**不跳過空白**,直接讀取下一字符 (含空格、換行)。%d:跳過空白,讀取整數...%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 後**必須緊跟目標字符**,中間不能有空格/換行。10X⏎20Y⏎ 正好滿足:10 後直接是 X,20 後直接是 Y。/* 原帖測試代碼可能缺少輸出語句或格式錯誤 */
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);
%d 和 %c:改用 %d %d 讀兩數,單獨 scanf(" %c", &c) 讀字符 (前置空格跳過空白)。fgets + sscanf:整行讀取後解析,完全控制格式。%c 立即想到「不跳過空白」,檢查前一格式符留下的字符是否為目標字符。格式串 %d%c%d%c 要求 %d 後**緊跟**目標字符 (無空白)。唯有選項 (D) 10X⏎20Y⏎ 滿足條件,使 a1=10, c1='X', a2=20, c2='Y' 正確賦值。實際編程中建議分離數值與字符輸入,避免此類格式匹配陷阱。