scanf 預設以空白字元(空格、換行、Tab)為分隔符。若需讀取「逗號分隔」或「含空格的字串」,需使用 掃描集。
%[掃描列表] // 只接收列表內字元,其餘為分隔符 %[^掃描列表] // 排除列表內字元,其餘皆接收
char buf[100];
// 只讀取小寫字母,遇到非字母停止
scanf("%[a-z]", buf);
// 輸入 "hello123" → buf="hello","123" 留在緩衝區
// 讀取非逗號字元(適合 CSV 單欄位)
scanf("%[^,]", buf);
// 輸入 "apple,banana" → buf="apple",逗號留在緩衝區
// 限制長度防溢位
scanf("%10[^,]", buf); // 最多讀 10 字元
]:若需包含 ],置於 [ 或 [^ 之後:%[]abc]、%[^]abc]-:置於首尾視為字面字元;中間視為範圍(如 a-z)^:僅在 [ 緊接時為排除符號,其他位置為字面字元%n 不消耗輸入,將目前已成功讀取/輸出的字元數存入對應的 int* 參數。
int i, j, cnt;
scanf("%d %d%n", &i, &j, &cnt);
// 輸入 "434 6434" → i=434, j=6434, cnt=8(含空格)
char ch; int cnt2;
scanf("%c%n", &ch, &cnt2);
// 輸入 "sbcdefdg" → ch='s', cnt2=1(%c 只讀 1 字元)
int i=343, j=123, cnt;
printf("i=%d, j=%d%n", i, j, &cnt);
// 輸出 "i=343, j=123",cnt=12(不含 %n 本身)
// printf 返回值仍為 12,不受 %n 影響
fscanf(fd, "%*[^\n]\n"); // %* 為抑制賦值,讀取並丟棄整行
%[] 不會自動加上結束符 \0? 會,scanf 會在結果字串末尾加 \0%n 不計入 scanf 返回值(返回值僅為成功轉換的項目數)\n 等轉義序列,需用字面換行字元或改用 fgets