C/C++中sscanf && sprintf()

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:zyjss@163.com;","%*[^:]:%[^;]");

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);

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值