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

C 語言 sscanf/sprintf 進階用法、strlen 與 memset 陷阱完全解析

     編輯:關於C

sscanf:從字串解析格式化資料

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

核心格式字元

格式說明
%s讀單詞(跳空白,遇空白停)
%[chars]掃描集合:僅讀取集合內字元(貪婪)
%[^chars]掃描補集:讀取非集合內字元
%*s跳過匹配項,不儲存
%nc讀固定 n 字元(含空白)

實戰範例

char buf[64];
sscanf("123456", "%4s", buf);           // "1234"
sscanf("123456 abc", "%[^ ]", buf);     // "123456" (遇空格停)
sscanf("abc123DEF", "%[a-z]", buf);     // "abc" (僅小寫)
sscanf("abc123DEF", "%[^A-Z]", buf);    // "abc123" (非大寫)
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); // "12DDWDFF"
sscanf("hello, world", "%*s%s", buf);   // "world" (跳過 hello,)
sscanf("1try234delete5", "1%[^2]234%[^5]", s1, s2); // s1="try", s2="delete"
sscanf("222,333,444", "%[^,],%[^,],%[^,]", s1,s2,s3); // 分割逗號

sprintf / snprintf:格式化寫入字串

int sprintf(char *buf, const char *fmt, ...);
int snprintf(char *buf, size_t size, const char *fmt, ...); // 安全版,限制長度

返回值:格式化後字串長度(不含結尾 '\0'),snprintf 若截斷仍返回完整長度。

範例

char buf[32];
sprintf(buf, "Value: %d, Hex: %04X", 42, 255); // "Value: 42, Hex: 00FF"
snprintf(buf, sizeof(buf), "%.2f", 3.14159);   // "3.14"

strlen 陷阱:與 sizeof 混淆

運算式結果說明
strlen("abc")3運行期計數至 '\0'
sizeof("abc")4編譯期常量大小(含 '\0')
char a[]="abc"; sizeof(a)4陣列大小
char *p="abc"; sizeof(p)4/8指標大小

memset 陷阱:逐位元組填充,非逐元素

int arr[4] = {0};
memset(arr, 1, sizeof(arr)); // 每位元組設為 0x01
// arr[0] = 0x01010101 = 16843009 (非 1!)

正確用法:memset(ptr, 0, size) 清零(全位元 0 對所有型別皆為 0 值)。
非零填充僅適用 char/unsigned char 陣列。

完整驗證程式

#include 
#include 
#include 

int main(void) {
    // strlen vs sizeof
    char s[] = "hello";
    printf("strlen=%zu sizeof=%zu\n", strlen(s), sizeof(s)); // 5 6

    // memset 陷阱
    int a[2] = {0};
    memset(a, 1, sizeof(a));
    printf("a[0]=%d (0x%X)\n", a[0], a[0]); // 16843009 0x01010101

    // sscanf 進階
    char *src = "email:user@example.com;";
    char addr[64];
    sscanf(src, "%*[^:]:%[^;]", addr);
    printf("email: %s\n", addr); // user@example.com

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