原型: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); // 分割逗號
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("abc") | 3 | 運行期計數至 '\0' |
sizeof("abc") | 4 | 編譯期常量大小(含 '\0') |
char a[]="abc"; sizeof(a) | 4 | 陣列大小 |
char *p="abc"; sizeof(p) | 4/8 | 指標大小 |
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; }