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

sscanf 進階用法大全:格式化字串解析技巧

     編輯:VC 教學

基本回顧

char str[512] = {0};
sscanf("123456", "%s", str);   // 讀取至空白字元
printf("str=%s\n", str);        // 輸出: 123456

進階格式控制

需求格式字串範例輸入結果
固定長度%4s1234561234
遇指定字元停止%[^ ]123456 abcd123456
僅接受字元集合%[1-9a-z]123456abcDEF123456abc
遇字元集合停止%[^A-Z]123456abcDEF123456abc

關鍵語法說明

  • %[set]:掃描集合,僅讀取集合內字元,遇非集合字元停止。
  • %[^set]:反向掃描集合,讀取直到遇到集合內字元。
  • 集合支援範圍 a-z、0-9、單一字元;^ 必須緊跟 [ 表示反向。
  • 寬度限制 %4s、%4[...] 可防止緩衝區溢位。

實用組合範例

// 解析 "key=value",值可含空白
char key[64], val[256];
sscanf(line, "%63[^=]=%255[^\n]", key, val);

// 解析 IPv4
int a,b,c,d;
sscanf(ip, "%d.%d.%d.%d", &a,&b,&c,&d);

// 解析日期 "2024-05-18"
int y,m,d;
sscanf(date, "%4d-%2d-%2d", &y,&m,&d);

常見坑點

  1. 未檢查回傳值:sscanf 回傳成功賦值個數,必須驗證。
  2. 緩衝區未留終止符空間:陣列大小至少 寬度+1。
  3. 集合中包含 ] 或 -:] 放首位 []...],- 放首尾或轉義。
  4. 跨平台換行差異:%[^\n] 在 Windows 可能殘留 \r,建議後續處理。

安全替代方案

C11 sscanf_s、C++ std::istringstream、std::from_chars(C++17)提供更強型別安全與邊界檢查。

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