首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 scanf/fscanf %[] 掃描集與 %n 字元計數完整指南

     編輯:關於C語言

%[] 掃描集 —— 突破空白字元限制

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 字元計數 —— 獲取已讀取/輸出字元數

%n 不消耗輸入,將目前已成功讀取/輸出的字元數存入對應的 int* 參數。

scanf 範例

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 字元)

printf 範例

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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved