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

C語言sscanf函數完全指南:格式化字串解析七大實戰模式

     編輯:關於C語言

C語言 sscanf 函數完全指南:格式化字串解析七大實戰模式

sscanf 從字串讀取格式化資料,原型:

int sscanf(const char *str, const char *format, ...);

回傳成功匹配的項目數。掌握其格式字串技巧,能輕鬆完成複雜字串切割與提取。

七大核心用法模式

1. 基本字串讀取 %s

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

遇空白字元(空格、換行、Tab)停止。

2. 限制長度 %4s

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

3. 排除字元集 %[^a-z] —— 讀到小寫字母停止

sscanf("123456abcd", "%[^a-z]", buf); // buf = "123456"

4. 僅接受字元集 %[1-9a-z]

sscanf("123abcDEF", "%[1-9a-z]", buf); // buf = "123abc"

5. 截取分隔符之間內容 %*[^/]/%[^@]

sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
// %*[^/] 忽略 "iios/",%[^@] 讀取 "@" 前內容 → buf = "12DDWDFF"

* 表示「讀取但不儲存」(抑制賦值)。

6. 跳過第一欄取第二欄 %*s%s

sscanf("hello, world", "%*s%s", buf); // buf = "world"
// 注意:%s 遇空格停,故 "hello," 被 %*s 吃掉,"world" 給 buf

7. 多欄位分割 %s%s%s (Tab/空格分隔)

sscanf("str1\tstr2\tstr3", "%s%s%s", b1, b2, b3);
// b1="str1", b2="str2", b3="str3"

完整可執行範例

#include <stdio.h>
#include <string.h>
#define N 512
int main() {
    char buf[N], buf2[N], buf3[N];
    memset(buf, 0, N); memset(buf2, 0, N); memset(buf3, 0, N);

    sscanf("123456", "%s", buf);           puts(buf);      // 123456
    sscanf("123456", "%4s", buf);          puts(buf);      // 1234
    sscanf("123456abcd", "%[^a-z]", buf);  puts(buf);      // 123456
    sscanf("123abcDEF", "%[1-9a-z]", buf); puts(buf);      // 123abc
    sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); puts(buf); // 12DDWDFF
    sscanf("hello, world", "%*s%s", buf);  puts(buf);      // world
    sscanf("a\tb\tc", "%s%s%s", buf, buf2, buf3);
    printf("%s | %s | %s\n", buf, buf2, buf3); // a | b | c
    return 0;
}

避坑指南

  • 緩衝區溢位:永遠給 %s / %[...] 加寬度,如 %511s,或改用 snprintf 組合。
  • %[^...] 不會自動跳過分隔符,需在格式串顯式寫出(如 /、@)。
  • 回傳值檢查:若回傳 EOF 或少於預期項目數,表示解析失敗。

總結

sscanf 的格式字串支援 %[] 掃描集與 * 抑制賦值,組合起來能處理絕大多數結構化字串解析需求,是 C 語言字串處理的利器。

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