sscanf() - 从一个字符串中读进与指定格式相符的数据:
函数原型:
int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
int scanf( const char *format [,argument]... );
与scanf类似都是用于输入,只不过scanf用于从屏幕(stdio)输入,而sscanf则是从一个字符串中获取输入内容,且按照一定格式输入fmt:输入的格式是以字符串形式呈现,例如可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}
注:
1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)例如sscanf("1234acc","%*d%s",str)输出即为acc
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的任意字符,贪婪性
注意:在读入的字符串是空字符串时,sscanf函数并不改变待读入到的字符串的值。
常见用法:
1.赋值:
char buf[256];
sscanf("1234acc","%s",buf);//buf为1234acc
sscanf("12345acc","%*d%s",str);//strt为acc
2.取指定长度
sscanf("123456 ", "%4s", buf); //buf为1234
3.取到指定字符或者字符串集为止
sscanf("1234 www","%[^ ]",buf);//取到空格为止,1234
sscanf("1234+acc","%[^+]",buf);//取到加号为止,1234
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); //取到A-Z的大写字母为止,123456abcdef
sscanf("123aa111","%[^a-z]",buf);//取到小写字母为止,123
4.取仅仅包含指定字符串
sscanf("123456abcdedfBCDEFg","%[1-9a-z]",buf);//只取1-9、a-z的字符,123456abcdef
5.仅仅取指定范围内的字符
一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,%*[^/]/,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); //12DDWDFF
sscanf("1try234delete5" , "1%[^2]234%[^5]", buf, buf1); //buf为try,buf1为delete
提取用户个人资料中邮件地址
sscanf("email:[email protected];","%*[^:]:%[^;]");
6.取由空格隔开的若干干小字符串组成的字符串中某一个字符串,注意要有空格隔开,如果没有空格则结果为NULL。
sscanf("heal huot","%*s%s",buf);//huot
7.分割以某字符标记的字符串
sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);
几个小知识:
%*[^x ],例如x取:z则%*[^:] ,即在第一次遇见:之前的所有字符全部忽略不读入,x取=:
%*[^=] 前面带 * 号表示不保存变量。跳过符合条件的字符串。
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
%[^x],例如x取:,则%[^;],则第一次遇见:之前所有字符读入一直到:x取=:
%[^=] 读取字符串直到碰到’=’号,’^’后面可以带更多字符,如:
char s[]="notepad=1.0.0.1001" ;
char szfilename [32] = "" ;
int i = sscanf( s, "%[^=]", szfilename ) ; // szfilename=notepad
%[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
sprintf() - 按照指定格式相符的数据存入字符串:
函数原型:
int sprintf( char *buffer, const char *format [, argument] … );
与printf()类似,都是用于输出,只不过printf()输出结果显示于屏幕,而sprintf()输出结果存于一字符串
常见应用:
1.类itoa函数把整数打印在字符串
char *buf[256];
sprintf(buf,"%d",1234);//“1234”
sprintf(buf,"%5d","1234");" 1234";
sprintf(buf,"%05d","1234");//"01234"
sprintf(buf,"%3d","1234");//"1234",如果数字长度超出时,输出完整的数字
sprintf(buf,"%-5d","1234");//"1234 "左对齐,如数字没有5位时左另用空格补满,超出时输出所有数字
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
对于十六进制也类同于十进制
sprintf(s, "%5x", 3915); // " f4b"右对齐,小写16 进制,宽度占5 个位置
sprintf(s, "%5X", 3915); // " F4B"右对齐,大写16 进制,宽度占5 个位置
2.浮点数打印在字符串
浮点数的打印和格式控制是sprintf 的又一大常用功能,浮点数使用格式符”%f”控制,默认保 留小数点后6 位数字
sprintf(buf,"%f","3.131592627");//"3.131593"
有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m 表 示打印的宽度,n 表示小数点后的位数
sprintf(s, "%10.3f", 3.1415626); //产生:" 3.142"
sprintf(s, "%-10.3f", 3.1415626); //产生:"3.142 "
sprintf(s, "%.3f", 3.1415626); //不指定总宽度,产生:"3.142"
3.处理字符串
sprintf(buf,"%s","good");//"good",直接copy
sprintf(str,"%6s","guoke"); // " guoke" 右对齐,超出时,输出全部字符串
sprintf(str,"%.3s","guoke"); // " guo" 只读取字前三个字符,如果字符串不足3个取全部
sprintf(str,"%-6s","guoke"); // "guoke " 左对齐,超出时,输出全部字符串
sprintf(str,"%6.3s","guoke"); // " guo" 右对齐,宽宽6,只取字符串前3个字符.如果字符串不足3个取全部
sprintf(str,"%-6.3s","guoke"); // "guo " 左对齐,宽宽6,只取字符串前3个字符.如果字符串不足3个取全部
sprintf(str,"%3.6s","guoke"); // "guoke" 这样感觉好像没什么大的作用,当所取的字符串长度大于3是还是会输出全部字符串的.
sprintf(buf,"%d->%d",x,y);//“x->y”
char* who = "I"; char* whom = "csdn";
sprintf(s, "%s love %s.", who, whom); //产生:"I love csdn. "
4.打印变量等地质
sprintf(s, "%u", &i);
sprintf(s, "%08X", &i);
sprintf(s, "%p", &i);