代碼如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
int a;
char ch;
scanf_s("%d", &a);
printf("a=%d\n", a);
scanf_s("%c", &ch); // 這裡未能讀取到預期的字符
printf("ch=%c\n", ch);
system("pause");
return 0;
}
輸入 1a 後,a 正確輸出 1,但 ch 卻沒有讀到 a。
scanf_s("%d", &a) 讀取整數 1 後,緩衝區仍殘留換行符 \n(或輸入的 a 之後的換行)。隨後的 scanf_s("%c", &ch) 直接讀取了這個換行符,導致 ch 成為 \n,顯示為空行。
scanf_s(" %c", &ch); // %c 前的空格會跳過所有空白字符(含 \n、空格、\t)
getchar(); // 讀走殘留的 \n
scanf_s("%c", &ch);
char buf[32];
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &a);
fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%c", &ch);
%c、%[、% 等不跳過空白的格式前加空格。scanf_s 需要緩衝區大小參數,讀字符串時必須傳入長度。