sscanf()的使用

函数原型:

int sscanf( const char *buffer, const char *format [, argument ] ... );

...表示是一个多参函数,其实就和scanf是一样的,只是从命令行变成了从str中读取

 

针对于第二个const char*format参数有如下变化:

%s或%d跳过数据
%[width]s 读指定宽度的数据
%[a-z] 匹配a到z中任意字符(尽可能多的匹配)
%[aBc] 匹配a、B、c中一员,贪婪性
%a 匹配非a的任意字符,贪婪性
%a-z 表示读取除a-z以外的所有字符

 

具体实现代码如下

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #include<stdio.h>
 3 //sscanf的使用
 4 //%*s或%*d 跳过数据
 5 void test_tiaoguoNum()
 6 {
 7     const char *str = "1234asd5abcde";
 8     char buf[1024] = { 0 };
 9     sscanf(str,"%*d%s", buf);
10     printf("%s\n", buf);
11 }
12 //区间跳过%*[]
13 void test_tiaoguoSection()
14 {
15     const char* str = "asdbczs12345";
16     char buf[1024] = { 0 };
17     sscanf(str, "%*[a-z]%s", buf);
18     printf("%s\n", buf);
19 }
20 //指定读取宽度%[width]s
21 void test_SpecifiesWidthRead()
22 {
23     const char* str = "sadhjnkxz";
24     char buf[100] = { 0 };
25     sscanf(str, "%3s", buf);
26     printf("%s\n", buf);
27 }
28 //%[a-z] 匹配到a到z中任意字符
29 void test_MatchingRangeChar()
30 {
31     const char* str = "asdxzc1231a";
32     char buf[100] = { 0 };
33     sscanf(str, "%[a-z]s", buf);
34     printf("%s\n", buf);
35 }
36 //匹配具体的字符
37 //%[abc]
38 void test_Appoint() 
39 {
40     const char* str = "asdxzc1231a";
41     char buf[100] = { 0 };
42     sscanf(str, "%[asdx]", buf);
43     printf("%s\n", buf);
44 }
45 //匹配除了特殊字符以外的字符
46 void test_Matching_not()
47 {
48     const char* str = "asdxzc1231a";
49     char buf[100] = { 0 };
50     sscanf(str, "%[^d]", buf);
51     printf("%s\n", buf);
52 }
53 //匹配除了区间外的所有字符
54 void test_Matching_Not_Range()
55 {
56     const char* str = "asdxzc1231a";
57     char buf[100] = { 0 };
58     sscanf(str, "%[^0-9]", buf);
59     printf("%s\n", buf);
60 }
61 void Section_ip()
62 {
63     const char* str = "172.0.0.1";
64     int num1, num2, num3, num4;
65     sscanf(str, "%d.%d.%d.%d", &num1, &num2, &num3, &num4);
66     printf("%d %d %d %d", num1, num2, num3, num4);
67 }
68 //练习获取指定字符串
69 void test_ex1()
70 {
71     const char* str = "sadasd#zhangtao@1234";
72     char buf[100] = { 0 };
73     sscanf(str, "%*[^#]#%[^@]", buf);
74     printf("%s\n",buf);
75 }
76 void test_ex2()
77 {
78     //匹配出myname字符串
79     const char* str = "123abcd$myname@DDDqwe";
80     char buf[100] = { 0 };
81     sscanf(str, "%*[^$]$%[^@]", buf);
82     printf("%s\n", buf);
83 }
84 //只要有一个匹配失败就不会再匹配了
85 
86 int main(void)
87 {
88     //test_tiaoguoSection();
89     //test_SpecifiesWidthRead();
90     //test_MatchingRangeChar();
91     //test_Matching_not();
92     //test_Matching_Not_Range();
93     //Section_ip();
94     //test_ex1();
95     test_ex2();
96     return 0;
View Code
 1 //查找字串
 2 #define _CRT_SECURE_NO_WARNINGS
 3 #include<stdio.h>
 4 
 5 
 6 int Get_son_string(char* str, char* Tarstr)
 7 {
 8     while (*str != '\0')
 9     {
10         if (*str != *Tarstr)//判断能否匹配上子串的第一个数
11         {
12             str++;
13             continue;
14         }
15         char* temp1= ++str, * temp2=++Tarstr;//如果第一个匹配成功
16         while (1)
17         {
18             if (*temp2 == '\0')    //如果字串取完说明匹配成功
19             {
20                 return 1;
21             }
22             if (*temp1 != *temp2)    //如果不等于就退出循环
23             {
24                 break;
25             }
26             //如果下一个还是成功就继续后移
27             temp1++;
28             temp2++;
29         }
30     }
31     return 0;
32 
33 }
34 
35 void main(void)
36 {
37     char str[] = "sadasddnfaxzcz";
38     char Tarstr[] = "dnf";
39     int ret = Get_son_string(str, Tarstr);
40     if (ret == 1)
41     {
42         printf("有字串\n");
43     }
44     else
45     {
46         printf("没有这字串\n");
47     }
48 }
View Code