char a, b;
printf("Please input the first character: ");
scanf("%c", &a);
printf("Please input the second character: ");
scanf("%c", &b); // 直接讀到殘留的 '\n',無等待輸入
printf("The two characters are %c, %c", a, b);
輸入 X Enter 後,第一個 %c 讀到 'X',緩衝區留下 '\n';第二個 %c 直接讀走 '\n',導致程式看起來「跳過」第二次輸入。
char a; int b;
scanf("%c", &a); // 讀 'X',留 '\n'
scanf("%d", &b); // %d 自動跳過空白字元(含 \n),正常等待輸入數字
%d、%f、%s 等格式自動略過前導空白,因此不受殘留換行影響。
scanf(" %c", &b); —— 空白會吞噬任意數量空白字元。getchar() 清除殘留:scanf("%c", &a); getchar(); scanf("%c", &b);fgets 讀整行再解析:避免掃描函數殘留問題,較健壯。std::cin:cin >> a >> b; 同樣自動略過空白。%c 是唯一不略過空白字元的掃描格式,專門用於逐字元讀取(含空白)。其他格式均以空白為分隔符,故會自動跳過。
fgets/std::getline 讀行,再以 sscanf/stringstream 解析。scanf 讀字元時,格式字串前加空白 " %c"。scanf 回傳值確認成功賦值個數。