scanf 格式字串中鮮為人知但極實用的轉換字元:掃描集。它允許精確控制輸入字元的接受範圍,解決標準 %s 無法讀取空白字元的痛點。
| 格式 | 行為 | 範例輸入 → 結果 |
|---|---|---|
%[字元集合] |
僅提取屬於集合內的字元,遇不屬於者停止 | 輸入 1234werew → scanf("%[1234567890]", s) 得 "1234" |
%[^字元集合] |
提取不屬於集合的字元,遇屬於者停止 | 輸入 abc123 → scanf("%[^0-9]", s) 得 "abc" |
兩者皆會自動在提取結果後附加 \0 結束符。
scanf("%[ 1234567890 ]", s); // 錯誤:空格會被視為掃描集成員
scanf("%[^ 1234567890]", s); // 錯誤:同理
若需包含空格,請直接在集合中書寫空格字元(如 %[a-z ])。
char line[100];
scanf("%[^\n]", line); // 讀取換行符前的所有字元,含空格、Tab
此技巧完美替代 gets(不安全)與 fgets(需處理換行符),是讀取整行輸入的標準做法。
#include <stdio.h>
int main() {
char strings[100];
// 僅讀取數字
scanf("%[1234567890]", strings);
printf("Result: %s\n", strings);
return 0;
}
掃描集是 scanf 家族中最靈活的輸入解析工具,善用它能優雅處理各類格式化輸入場景,尤其擅長「讀取直到特定分隔符」的需求。下次面對複雜輸入格式時,請優先考慮 %[...] 與 %[^...]。