scanf("%c%c", &word[0], &word[1]);
的行為與輸入緩沖區的內容密切相關。你提到輸入ab
后,word[0]
是\n
,這通常是因為輸入緩沖區中殘留了換行符(\n
)。
一、原因分析
- 換行符殘留
- 若在輸入
ab
之前有其他輸入操作(如輸入整數或字符串)且按了回車鍵,回車鍵會向輸入緩沖區插入一個換行符(\n
)。 scanf("%c%c", &word[0], &word[1]);
會讀取輸入緩沖區中的第一個字符(可能是殘留的\n
)并賦值給word[0]
,b
則被賦值給word[1]
。
- 若在輸入
%c
格式說明符的特性%c
會讀取輸入緩沖區中的任何字符,包括空格和換行符,不像%d
或%s
那樣自動跳過空白字符。
二、解決方法 為避免換行符被讀取,可在scanf
的格式字符串中加入一個空格,忽略前面的空白字符(包括換行符):
scanf(" %c%c", &word[0], &word[1]);
這里的空格" "
會讓scanf
跳過輸入緩沖區中的所有空白字符(包括空格、制表符和換行符),直至遇到非空白字符。
三、示例代碼
#include <stdio.h>int main()
{char word[2] = { '\0' };printf("請輸入兩個字符:");scanf(" %c%c", &word[0], &word[1]);printf("word[0] = %c, word[1] = %c\n", word[0], word[1]);return 0;
}
四、輸入輸出示例
- 輸入:
ab
- 輸出:
word[0] = a, word[1] = b
五、總結
- 問題原因:輸入緩沖區中殘留的換行符被
%c
讀取。 - 解決方法:在
scanf
格式字符串中加入空格,忽略前面空白字符。 - 注意事項:
%c
會讀取任何字符,包括空白字符,所以要特別小心處理輸入緩沖區內容。