scanfsscanf %[]格式控制串的用法
- 格式:pdf
- 大小:10.57 KB
- 文档页数:3
C语⾔scanf,fscanf和sscanf的区别⽬录⼀.scanf,fscanf和sscanf1.scanf2.fscanf3.sscanf⼆.printf,fprintf和sprintf1.printf2.fprintf3.sprintf⼀.scanf,fscanf和sscanf1.scanf⾸先scanf我们的很熟悉,他就是从键盘上输⼊数据,准确的来说就是:从标准输⼊(键盘)读取格式化的数据。
int main(){int x = 0;scanf("%d", &x);return 0;}2.fscanf⽽fscanf就⽐scanf⾼级了⼀点,可以说是fscanf包含了scanf的功能,对于这个函数的定义是这样⼦的:从所有的输⼊流读取格式化的数据。
我们可以查看⼀下fscanf-cpulspuls中的解释和参数:释义:从流中读取数据,并根据参数格式将它们存储到附加参数所指向的位置。
附加参数应指向格式字符串中的相应格式说明符指定的类型已分配的对象。
int fscanf ( FILE * stream, const char * format, ... );这⾥的参数如果看不懂,我们就可以进⾏对⽐去学习,我们可以打开scanf的说明去看⼀下对⽐⼀下:实际上fscanf就多了⼀个FILE * 的参数,也就是打开的⽂件的地址参数,所有当我们进⾏使⽤的时候,我们可以先像scanf⼀样写出来,然后再在前⾯加上⼀个FILE * 的参数就好了。
例⼦:我们可以打开⽂件,在输⼊流中读取到数据,然后打印出来看看://fscanfstruct S{int n;double d;};int main(){struct S s = {0};FILE* pf = fopen("data.txt", "r");//⽂本⽂件data.txtif (NULL == pf){perror("fopen");return -1;}//读⽂件fscanf(pf, "%d %lf", &(s.n), &(s.d));printf("%d %lf\n", s.n, s.d);//关闭⽂件fclose(pf);pf = NULL;}3.sscanf⽼规矩,我们查⼀下这个函数的定义:这⾥的意思就是从字符串中读取到格式化的数据,也就是说我们输⼊进去的数据,sscanf会转化成字符串的形式。
sscanf 与scanfvc 2009-03-04 21:30:54 阅读894 评论0 字号:大中小sscanf名称:sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个{%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}注:1、* 亦可用于格式中, (即%*d 和%*s) 加了星号(*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值支持集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性[编辑本段]1. 常见用法。
char buf[512] = ;sscanf("123456 ", "%s", buf);printf("%s\n", buf);结果为:1234562. 取指定长度的字符串。
Sscanf 函数sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个{%[*] [width] [size]type | ' ' | '\t' | '\n' | 非%符号}注:1、* 亦可用于格式中, (即%*d 和%*s) 加了星号(*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、参数的size: 常用的有hh表示单字节size,h表示2字节size,其他详见man sscanf或msdn5、type :这就很多了,就是%s,%d之类。
控制字符说明%c 一个单一的字符%d 一个十进制整数%i 一个整数%e, %f, %g 一个浮点数%o 一个八进制数%s 一个字符串%x 一个十六进制数%p 一个指针%n 一个等于读取字符数量的整数%u 一个无符号整数%[] 一个字符集%% 一个精度符6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值支持集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性还是用例子说话:#include <stdio.h>int main(){char buf[512] = {0};//1. 常见用法。
sscanf功能详解(转)在处理字符串的程序当中,经常会分析字符串,从⼀⼤长串的字符串截取我们需要的数据,这如果通过⾃⼰⼿写函数来分析,虽然可以,但当你知道sscanf的功能,那就⾃⼰写函数分析就显得多此⼀举。
这些函数的使⽤都很简单,总结⼀下,等下次使⽤⼀⽬了然。
俗话说:好记性不如烂笔头,记录下来就是效率。
1/*****************************************************2** Name : sscanf.c3** Author : gzshun4** Version : 1.05** Date : 2011-126** Description : sscanf function7******************************************************/8 #include <stdio.h>9 #include <stdlib.h>10 #include <string.h>1112static void sscanf_test(void);1314static void sscanf_test(void)15 {16int ret;17char *string;18int digit;19char buf1[255];20char buf2[255];21char buf3[255];22char buf4[255];2324/*1.最简单的⽤法*/25string = "china beijing 123";26 ret = sscanf(string, "%s %s %d", buf1, buf2, &digit);27 printf("1.string=%s\n", string);28 printf("1.ret=%d, buf1=%s, buf2=%s, digit=%d\n\n", ret, buf1, buf2, digit);29/*30 **执⾏结果:31 **1.ret=3, buf1=china, buf2=beijing, digit=12332 **可以看出,sscanf的返回值是读取的参数个数33*/3435/*2.取指定长度的字符串*/36string = "123456789";37 sscanf(string, "%5s", buf1);38 printf("2.string=%s\n", string);39 printf("2.buf1=%s\n\n", buf1);40/*41 **执⾏结果:42 **2.buf1=1234543*/4445/*3.取到指定字符为⽌的字符串*/46string = "123/456";47 sscanf(string, "%[^/]", buf1);48 printf("3.string=%s\n", string);49 printf("3.buf1=%s\n\n", buf1);50/*51 **执⾏结果:52 **3.buf1=12353*/5455/*4.取到指定字符集为⽌的字符串*/56string = "123abcABC";57 sscanf(string, "%[^A-Z]", buf1);58 printf("4.string=%s\n", string);59 printf("4.buf1=%s\n\n", buf1);60/*61 **执⾏结果:62 **4.buf1=123abc63*/6465/*5.取仅包含指定字符集的字符串*/66string = "0123abcABC";67 sscanf(string, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);68 printf("5.string=%s\n", string);69 printf("5.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);70/*71 **执⾏结果:72 **5.buf1=123, buf2=abc, buf3=ABC73*/7475/*6.获取指定字符中间的字符串*/76string = "ios<android>wp7";77 sscanf(string, "%*[^<]<%[^>]", buf1);78 printf("6.string=%s\n", string);79 printf("6.buf1=%s\n\n", buf1);80/*81 **执⾏结果:82 **6.buf1=android83*/8485/*7.指定要跳过的字符串*/86string = "iosVSandroid";87 sscanf(string, "%[a-z]VS%[a-z]", buf1, buf2);88 printf("7.string=%s\n", string);89 printf("7.buf1=%s, buf2=%s\n\n", buf1, buf2);90/*91 **执⾏结果:92 **7.buf1=ios, buf2=android93*/9495/*8.分割以某字符隔开的字符串*/96string = "android-iphone-wp7";97/*98 **字符串取道'-'为⽌,后⾯还需要跟着分隔符'-',99 **起到过滤作⽤,有点类似于第7点100*/101 sscanf(string, "%[^-]-%[^-]-%[^-]", buf1, buf2, buf3);102 printf("8.string=%s\n", string);103 printf("8.buf1=%s, buf2=%s, buf3=%s\n\n", buf1, buf2, buf3);104/*105 **执⾏结果:106 **8.buf1=android, buf2=iphone, buf3=wp7107*/108109/*9.提取邮箱地址*/110string = "Email:beijing@";111 sscanf(string, "%[^:]:%[^@]@%[^.].%s", buf1, buf2, buf3, buf4);112 printf("9.string=%s\n", string);113 printf("9.buf1=%s, buf2=%s, buf3=%s, buf4=%s\n\n", buf1, buf2, buf3, buf4);114/*115 **执⾏结果:116 **9.buf1=Email, buf2=beijing, buf3=sina, buf4=117*/118119/*10.过滤掉不想截取或不需要的字符串--补充,120 **在%号后⾯加⼀*号,代表过滤这个字符串,不读取121*/122string = "android iphone wp7";123 sscanf(string, "%s %*s %s", buf1, buf2);124 printf("10.string=%s\n", string);125 printf("10.buf1=%s, buf2=%s\n\n", buf1, buf2);126/*127 **执⾏结果:128 **10.android wp7129*/130 }131132int main(int argc, char **argv)133 {134 sscanf_test();135136return0;137 }138139/*140**测试程序141**环境:142**Linux ubuntu 2.6.32-24-generic-pae #39-Ubuntu SMP Wed Jul 28 07:39:26 UTC 2010 i686 GNU/Linux 143**gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)144**145gzshun@ubuntu:~/c/sscanf$ gcc sscanf.c -o sscanf146gzshun@ubuntu:~/c/sscanf$ ./sscanf1471.string=china beijing 1231481.ret=3, buf1=china, buf2=beijing, digit=1231492.string=1234567891502.buf1=123451513.string=123/4561523.buf1=1231534.string=123abcABC1544.buf1=123abc1555.string=0123abcABC1565.buf1=0123, buf2=abc, buf3=ABC1576.string=ios<android>wp71586.buf1=android1597.string=iosVSandroid1607.buf1=ios, buf2=android1618.string=android-iphone-wp71628.buf1=android, buf2=iphone, buf3=wp71639.string=Email:beijing@1649.buf1=Email, buf2=beijing, buf3=sina, buf4= 16510.string=android iphone wp716610.buf1=android, buf2=wp7167*/。
sscanf 匹配表达式摘要:1.sscanf 简介2.sscanf 的使用方法3.sscanf 的匹配表达式4.示例代码正文:【1.sscanf 简介】sscanf 是一个C 语言库函数,用于从字符串中读取数据。
它可以读取多种数据类型,如整数、浮点数、字符串等。
相较于scanf,sscanf 更加强大和灵活,因为它可以指定匹配表达式来精确控制输入的格式。
【2.sscanf 的使用方法】sscanf 的函数原型为:```cint sscanf(const char *str, const char *format,...);```参数说明:- `str`:输入的字符串。
- `format`:匹配表达式,用于指定输入的格式。
- `...`:可变参数列表,用于存放读取到的数据。
返回值:成功读取的数据项数量,如果读取失败则返回EOF。
【3.sscanf 的匹配表达式】sscanf 的匹配表达式与正则表达式类似,但它们有一些区别。
以下是一些常用的匹配表达式:- `%d`:匹配整数。
- `%f`:匹配浮点数。
- `%s`:匹配字符串。
- `%c`:匹配单个字符。
- `%x`:匹配十六进制整数。
- `%X`:匹配大写十六进制整数。
- `%o`:匹配八进制整数。
- `%u`:匹配无符号整数。
- `%g`:匹配浮点数,如果小数部分为0 则不读取。
- `%G`:匹配浮点数,如果小数部分为0 则不读取,且不考虑精度。
- `%p`:匹配指针。
- `%n`:匹配一个换行符。
- `%[`:匹配方括号内的任意字符,如`%[0-9]`表示匹配0-9 之间的任意数字。
- `%]`:匹配方括号内的任意字符,并与`%[`匹配的字符进行比较。
【4.示例代码】```c#include <stdio.h>int main() {char str[] = "123 456.78 Hello, World!";int a, b, c;double d;char e[100];sscanf(str, "%d %f %s %lf %s", &a, &b, e, &d, e);printf("a: %d, b: %d, c: %s, d: %lf", a, b, e, d);return 0;}```该代码使用sscanf 从字符串中读取整数、浮点数、字符串和另一个字符串。
C 中scanf ( ) 函数用法心得我觉得,在输入输出函数中,scanf()函数,应该是最麻烦的,有时它给我们的结果很可笑,但是一定是一原因的....首先声明一下,这篇日志不是介绍scanf()中各种格式符用法的文章(没有这个必要,但是大家一定要会用).我尝试了很多种输入,包括一些错误的练习,曾经对scanf()由迷茫转向清醒,又由清醒再次转向迷茫......不知道何时是个尽头,谁让C如此高深呢?在这里贴出来,也是想让自己时而不时能看到,也想知道自己的理解是否有错,错在哪里(所以我就厚着脸皮,放在上面了).注意, 键盘缓冲区与输入有着密切的关系,并且, 类型匹配对输入也极为重要!!下面进入主题:scanf对流的操作遵从类型匹配操作原则,如果类型不匹配,它将不读取输入流。
因此输入流将滞留,如果输入流不空,scanf不会等待用户输入,直接从缓冲区中输入. 但是,scanf() 怎样匹配? stdin又是什么?在网上搜到的关于匹配的非常少,有些细节原因还是找不到.所以,我自作主张的下了点结论:例: scanf("%d,%d",&i,&j); 输入:12 ,13回车但是,j!=13. //注意,12后有一个空格,why?原因:我解释为,在scanf()中,格式字符串中普通字符(不包括空白字符)实行的是严格匹配,因为格式串中%d后面是一个 ',' ,因此输入中数字12后必须为一个','.scanf("1123%s",&str); 输入:1123aaabb 时str为aaabb,但是,输入24aabbdd时, 会出错,因为1123必须进行严格匹配.另外: scanf("%d\n",&i); printf("i=%d",i); 要怎么输入才能输出:i=12 ? 它不是你想像中的那样,有机会尝试一下吧!一些样例:scanf()是一个有返回值的函数,它的返回值是什么?怎么样利用这个特性?scanf()中的匹配原则: 在本文第五点具体说明...scanf()中各种数据格式匹配的开始条件,结束条件 .如: %d ,\n等类型输入结束条件.scanf("%d\n",&i);printf("%d",i); 输入 12回车,并无输出,why? scanf()函数的结束条件: 当各个格式符匹配完毕,且最后有一个回车时,函数结束. scanf("%s",str)连续输入127个就不能继续输入了. //TC中,VC好像是4000多..//说明键盘缓冲区长度为一个字节吗?但是 stdin->bsize(缓冲区大小)事实上为512,这又是为什么?stdin缓冲区中的数据残留 : scanf("%3s",str); c= getchar(); 输入: aaabbccc回车, 此时str="aaa",c='b'; //缓冲区中数据残留!getch()不经过缓冲区,直接接收键盘上输入的字符.//在上例中,加上一个 ch=getch(); 但是getch()并不能读取bbccc中的任何一个,说明getch()与getchar()并不一样,并且它们对Enter读取的值也不同! 一个不常用的格式符: %[] ,如 scanf("%[a-z]",str);输入: abcdefdsaABCDEF 输出:str="abcdefdsa" ;怎么用scanf()来输入一个有空格的字符串?scanf()处理时,一个Enter送到缓冲区中有两个值 : 一个回车(10) ,一个换行(13). 可以用getchar()来接收(但是,在只能接收到\n,即13).在一个scanf()函数之后加个fflush(stdin)可以清除输入数据残留?scanf("%3s",str); fflush(stdin); c=getchar();直接输入aaabbbddd回车, c还能取得值吗?下面是详细解释:scanf()函数执行成功时的返回值是成功读取的变量数 , 也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。
scanf和printf的用法C语言printf和scanf函数详细用法printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。
在编写程序时经常会用到此函数。
printf()函数的调用格式为:printf("<格式化字符串>", <参量表>);其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。
参量表是需要输出的一系列参数, 其个数必须与格式化字符串所说明的输出参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则将会出现意想不到的错误。
格式化字符串的格式是:%[标志][输出最小宽度][.精度][长度]格式字符1. 标志:标志字符为-、+、#、空格四种,其意义下表所示:标志意义- 结果左对齐,右边填空格+ 输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号# 对c,s,d,u类无影响;对o类,在输出时加前缀o;对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点()例1:#i ncludemain(){int a=100;float b=123.255;printf("a=%d ",a);printf("a=%10d ",a);printf("a=%-10d ",a);printf("a=%+d ",a);printf("a=% d ",a);printf("a=%#o ",a);printf("a=%#x ",a);printf("b=%#f ",b);}运行结果a=100a= 100a=100a=+100a= 100a=0144a=0x64b=123.254997 ()2.输出最小宽度:用十进制整数来表示输出的最少位数。
scanf格式控制的完整格式:% * m l或h 格式字符①格式字符与printf函数中的使用方式相同,以%d、%o、%x、%c、%s、%f、%e,无%u格式、%g格式。
②可以指定输入数据所占列宽,系统自动按它截取所需数据。
如:scanf(“%3d%3d”,&a,&b);输入:123456系统自动将123赋给a,456赋给b。
③%后的“*”附加说明符,用来表示跳过它相应的数据。
例如:scanf(“%2d%*3d%2d”,&a,&b);如果输入如下信息:1234567。
将12赋给a,67赋给b。
第二个数据”345”被跳过不赋给任何变量。
④输入数据时不能规定精度,例如:scanf(“%7.2f”,&a);是不合法的,不能企图输入:12345.67而使a的值为12345.67。
------------------相关-------------------输入数据流分隔①根据格式字符的含义从输入流中取得数据,当输入流中数据类型与格式字符要求不符时,就认为这一项结束。
如:scanf(“%d%c%f”,&a,&b,&c);如果输入如下信息:1234r1234.567则scanf函数在接收数据时发现”r”类型不匹配,于是把”1234”转换成整型赋值给a,把”r”赋给变量b,最后把”1234.567”转换成实型数据赋给c。
②根据格式项中指定的域宽分隔出数据项。
如语句:scanf(“%2d%3f%4f”,&a,&b,&c);如果输入如下信息:123456789012345则scanf函数在接收数据时根据域宽把12赋值给a,345赋值给b,6789赋值给c。
③隐示分隔符。
空格、跳格符(’\t’)、换行符(’\n’)都是C语言认定的数据分隔符。
④显示分隔符。
在scanf函数的两个格式说明项间有一个或多个普通字符,那么在输入数据时,在两个数据之间也必须以这一个或多个字符分隔。
sscanf名称:sscanf() - 从一个字符串中读进与指定格式相符的数据.函数原型:Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... );说明:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个{%[*] [width] [{h | l | I64 | L}]type | ' ' | ' \t' | '\n' | 非%符号}注:1、* 亦可用于格式中, (即%*d 和%*s) 加了星号(*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节size,L 表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值支持集合操作:%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)%[aB'] 匹配a、B、'中一员,贪婪性%[^a] 匹配非a的任意字符,贪婪性[编辑本段]例子:1. 常见用法。
char buf[512] = ;sscanf("123456 ", "%s", buf);printf("%c\n", buf);结果为:1234562. 取指定长度的字符串。
scanf/sscanf %[]格式控制串的用法
scanf中一种很少见但很有用的转换字符:[...]和[ ^...]。
#include
int main()
{
char strings[100];
scanf("%[1234567890]",strings);
printf("%s",strings);
return 0;
}
运行,输入:1234werew后,结果是:1234。
通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符,那么就提取该字符;如果一经发现不属于就结束提取。
该方法会自动加上一个字符串结束符到已经提取的字符后面。
scanf("%[^1234567890]",strings); 它的作用是:如果一经发现输入的字符属于方括号内字符串中某个字符,那么就结束提取;如果不属于就提取该字符。
该方法会自动加上一个字符串结束符到已经提取的字符后面。
注意:方括号两边不能空格,如:scanf("%[ 1234567890 ]",strings);
scanf("%[ ^1234567890 ]",strings); 不让空格也会算在里面的。
用这种方法还可以解决scanf的输入中不能有空格的问题。
只要用
scanf("%[^\n]",strings); 就可以了。
很神奇吧。
ANSI C 标准向scanf() 增加了一种新特性,称为扫描集(scanset)。
扫描集定义一个字符集合,可由scanf() 读入其中允许的字符并赋给对应字符数组。
扫描集合由一对方括号中的一串字符定义,左方括号前必须缀以百分号。
例如,以下的扫描集使scanf() 读入字符A、B 和C:
%[ABC]
使用扫描集时,scanf() 连续吃进集合中的字符并放入对应的字符数组,直到发现不在集合中的字符为止(即扫描集仅读匹配的字符)。
返回时,数组中放置以null 结尾、由读入字符组成的字符串。
用字符^ 可以说明补集。
把^ 字符放为扫描集的第一字符时,构成其它字符组成的命令的补集合,指示scanf() 只接受未说明的其它字符。
对于许多实现来说,用连字符可以说明一个范围。
例如,以下扫描集使scanf() 接受字母 A 到Z:
%[A-Z]
重要的是要注意扫描集是区分大小写的。
因此,希望扫描大、小写字符时,应该分别说明大、小写字母。
搜集一些特殊用法:
%[ ] 的用法:%[ ]表示要读入一个字符集合, 如果[ 后面第一个字符是”^”,则表示反意思。
[ ]内的字符串可以是1或更多字符组成。
空字符集(%[])是违反规定的,可导致不可预知的结果。
%[^]也是违反规定的。
%[a-z] 读取在 a-z 之间的字符串,如果不在此之前则停止,如
char s[]="hello, my friend” ; // 注意: ,逗号在不 a-z之间
sscanf( s, “%[a-z]”, string ) ; // string=hello
%[^a-z] 读取不在 a-z 之间的字符串,如果碰到a-z之间的字符则停止,如char s[]="HELLOkitty” ; // 注意: ,逗号在不 a-z之间
sscanf( s, “%[^a-z]”, string ) ; // string=HELLO
%*[^=] 前面带 * 号表示不保存变量。
跳过符合条件的字符串。
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%*[^=]", szfilename ) ;
// szfilename=NULL,因为没保存
int i = sscanf( s, "%*[^=]=%s", szfilename ) ;
// szfilename=1.0.0.1001
@c 读取40个字符
%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%[^=]", szfilename ) ;
// szfilename=notepad
如果参数格式是:%[^=:] ,那么也可以从 notepad:1.0.0.1001读取notepad。