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

C 語言 sscanf 深度掌握:格式字串、掃描集、寬度控制與實戰技巧全解析

     編輯:關於C語言

函數原型與核心參數

int sscanf(const char* src, const char* format, ...);
int scanf(const char* format, ...); // 從 stdin 讀取
  • src:輸入源字串(scanf 為標準輸入)
  • format:格式控制字串,包含轉換規範(%d)、空白字元、非空白字元
  • ...:接收結果的指標變數地址
  • 返回值:成功賦值的引數個數;失敗返回 EOF(-1)

格式字串完整語法

%[*][width][{h|l|ll|L}]type
  • *:抑制賦值,跳過匹配項不存入變數(如 %*d)
  • width:最大讀取字元寬度(如 %5s 只讀 5 字元)
  • h/l/ll/L:引數大小修飾(h=short, l=long/double, ll=long long, L=long double)
  • type:轉換類型(d,i,u,o,x,f,e,g,s,c,p,n,[...])

掃描集 %[...]:sscanf 的殺手鐧功能

類似正則字元類別,支援範圍、排除、貪婪匹配:

格式含義範例輸入結果
%[a-z]匹配小寫字母"abc123""abc"
%[^ ]匹配非空白字元(至空格停止)"hello world""hello"
%[^/]/%[^@]跳過 iios/,取 @ 前內容"iios/12DDWDFF@122""12DDWDFF"
%*s%s跳過第一個詞,取第二個詞"hello, world""world"

經典實戰範例集

1. 基本字串讀取

char buf[512];
sscanf("123456", "%s", buf); // buf="123456"

2. 限制長度


sscanf("123456", "%4s", buf); // buf="1234"

3. 讀取至指定字元


sscanf("123456 abcdedf", "%[^ ]", buf); // buf="123456"

4. 只保留特定字元集


sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); // buf="123456abcdedf"

5. 讀取至指定字元集停止


sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); // buf="123456abcdedf"

6. 提取分隔符間內容(核心技巧)


// 取 / 和 @ 之間
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); // buf="12DDWDFF"

7. 處理日期時間格式


// 2006:03:18 - 2006:04:18 (有空格)
char t1[16], t2[16];
sscanf(str, "%s - %s", t1, t2);

// 2006:03:18-2006:04:18 (無空格)
sscanf(str, "%[0-9,:]-%[0-9,:]", t1, t2);

掃描匹配流程與注意事項

  1. 格式字串遇空白字元:跳過輸入中任意數量空白(含換行、製表)。
  2. 格式字串遇非空白字元:輸入必須精確匹配該字元,不存入變數。
  3. 格式字串遇轉換規範:按規範從輸入讀取並轉換存入對應指標地址。
  4. 匹配失敗:sscanf 立即停止並返回已成功賦值的個數。
  5. width 限制最大讀取字元數;掃描集讀取至首個不匹配字元。

進階技巧:結合 %n 獲取已讀取字元數


int n;
sscanf("123abc", "%d%n", &val, &n); // val=123, n=3 (指向 'a')

可用於手動解析後續內容或錯誤恢復。

總結

sscanf 是 C 語言字串解析的瑞士軍刀。掌握抑制賦值(*)、掃描集(%[...])、寬度控制 三大核心功能,能以極簡潔代碼處理複雜文本解析任務,避免手寫狀態機解析器的繁瑣與易錯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved