/* sscanf用法詳解 */ #include <stdio.h> /* sscanf頭文件 */ #include <stdlib.h> #include <string.h> /* sscanf 讀取格式化的字符串中的數據。 swscanf 是 sscanf 的寬字符版本;swscanf 的參數是寬字符串。 swscanf不處理 Unicode 全角十六進制或"兼容性區"字符。 除此之外,swscanf 和 sscanf 的行爲徹底相同。 函數語法 int sscanf(const char *str, const char *format, ...); 參數 str 輸入源固定字符串 format 格式化參數,format能夠是一個或多個 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '/t' | '/n' | 非%符號} */ void test() { /* //* 亦可用於格式中, (即 %*d 和 %*s) 加了星號 (*) 表示跳過此數據不讀入. (也就是不把此數據讀入參數中) const char *p1 = "abcd123"; char buf1[32] = { 0 }; sscanf(p1, "%*[a-z]%s", buf1); //跳過字母 printf("-- buf1[%s]--\n", buf1); //[a|b|c]表示a,b,c中選一 const char *p2 = "3b"; char buf2_1[32] = { 0 }; char buf2_2[32] = { 0 }; sscanf(p2, "%[1|2|3]%c", buf2_1, buf2_2); //或運算符使用 printf("-- buf1[%s]--buf2_2[%s]---\n", buf2_1, buf2_2); //[d],表示能夠有d也能夠沒有d。 const char *p3 = "b"; char buf3_1[32] = { 0 }; char buf3_2[32] = { 0 }; sscanf(p3, "%[3]%c", buf3_1, buf3_2); //沒法提取任何數據 printf("-- buf1[%s]--buf2_2[%s]---\n", buf3_1, buf3_2); //[d],表示能夠有d也能夠沒有d。 const char *p4 = "b"; char buf4_1[32] = { 0 }; char buf4_2[32] = { 0 }; sscanf(p4, "%c%[3]", buf4_1, buf4_2); //能夠正常提取b printf("-- buf1[%s]--buf2_2[%s]---\n", buf4_1, buf4_2); //結論:sscanf提取字符串必須知道字符串的具體格式,使用上不如正則靈活 //width表示讀取寬度。 const char *p5 = "abcdef123"; char buf5_1[32] = { 0 }; char buf5_2[32] = { 0 }; sscanf(p5, "%3s%s", buf5_1, buf5_2); //%3s 表示提取3個字符的字符串 printf("-- buf1[%s]--buf2_2[%s]---\n", buf5_1, buf5_2); // h|I|I64 是配合%d提取整數使用 L 是配合%f提取浮點數使用,h表示short類型數據,I表示int類型數據,I64表示長整型數據 const char *p6 = "123578abc"; int buf6_1; char buf6_2[32] = { 0 }; sscanf(p6, "%Id%s", &buf6_1, buf6_2); printf("-- buf1[%d]--buf2_2[%s]---\n", buf6_1, buf6_2); //控制字符 // %c 一個單一的字符 // %d 一個十進制整數 // %i 一個整數 // %e, %f, %g 一個浮點數 // %o 一個八進制數 // %s 一個字符串 // %x 一個十六進制數 // %p 一個指針 // %n 一個等於讀取字符數量的整數 // %u 一個無符號整數 // %[] 一個字符集 // %% 一個精度符號 const char *p7 = "123578abc"; char ch7 = 0; char buf7_2[32] = { 0 }; sscanf(p7, "%c%s", &ch7, buf7_2); printf("-- buf1[%c]--buf2_2[%s]---\n", ch7, buf7_2); //sscanf函數遇到空格中止讀取字符串,全部須要特意註明空格 const char *p8 = "123 578a bc"; char buf8_1[32] = { 0 }; char buf8_2[32] = { 0 }; sscanf(p8, "%s%*[ ]%s", buf8_1,buf8_2); //格式化裏有空格,能夠提取 printf("-- buf1[%s]--buf2_2[%s]---\n", buf8_1, buf8_2); //^ 取到指定字符爲止的字符串 const char *p9 = "123abc"; char buf9_1[32] = { 0 }; char buf9_2[32] = { 0 }; sscanf(p9, "%[^2]%s", buf9_1,buf9_2); printf("-- buf1[%s]--buf2_2[%s]---\n", buf9_1, buf9_2); //截取到指定字符串 "3ab" const char *p10 = "12-3ab-c"; char buf10_1[32] = { 0 }; char buf10_2[32] = { 0 }; sscanf(p10, "%*[^-]-%[^-]%s", buf10_1, buf10_2); printf("-- buf1[%s]--buf2_2[%s]---\n", buf10_1, buf10_2); */ //%n的使用,返回前一個提取字符個數,通常 const char *p11 = "12345dfg"; int num = 0; sscanf(p11, "%*d%n%*s", &num); printf("-- buf1[%d]--buf2[%s]--\n", num, p11 + num);//注意其用法,節省內存,經過偏移量展現字符串 } int main() { test(); printf("-----ok------\n"); getchar(); return 0; }