// 方法 1:直接拿 scanf 返回值比較
for (i = 0; i < 100; i++) {
if ((scanf("%c", &a[i])) == '\n') // ❌ 錯誤
break;
}
// 方法 2:先讀取,再判斷數組元素
for (i = 0; i < 100; i++) {
scanf("%c", &a[i]); // ✅ 正確
if (a[i] == '\n')
break;
}
scanf("%c", &a[i]) 的返回值是 成功匹配並賦值的項目數(此處為 1),不是 讀取到的字符本身。因此 (scanf(...)) == '\n' 實際是在比較 1 == 10(ASCII 換行符),永遠為假。
| 格式串 | 成功返回 | 失敗/EOF 返回 |
|---|---|---|
%d | 1 | EOF (-1) |
%c | 1 | EOF |
%d %c | 2 | EOF 或 0/1(部分匹配) |
%s | 1 | EOF |
int i = 0;
while (i < 100) {
scanf("%c", &a[i]); // 讀取單字符(含空格、換行)
if (a[i] == '\n') break; // 判斷數組內容
i++;
}
a[i] = '\0'; // 可選:轉為 C 字符串
char line[101];
if (fgets(line, sizeof(line), stdin)) {
// line 包含換行符,長度 ≤ 100
// 可直接處理 line[0..len-2]
}
✅ 避免逐字符 scanf 開銷,自動處理緩衝區,防溢出。
char buf[101];
scanf("%100[^\n]", buf); // 讀取最多 100 個非換行字符
getchar(); // 吞掉殘留的 \n
// buf 已是以 \0 結尾的字符串
⚠️ 若輸入首字符即換行,scanf 返回 0,需檢查返回值。
int x; char c;
scanf("%d", &x); // 用戶輸入 "42\n",scanf 吃掉 42,\n 留在緩衝區
scanf("%c", &c); // 直接讀到 \n,c == '\n',看似「跳過」輸入
解決:scanf(" %c", &c) 格式串前加空格,跳過所有空白字符(含 \n、空格、Tab)。
scanf 返回 賦值項目數,不是 讀取的數據值。fgets 讀行,再用 sscanf/手動解析,最穩健。scanf 讀數值和讀字符時,注意 格式串前加空格 吃掉殘留換行。