ssprintf()函数和sscanf()函数的用法

ssprintf()函数和sscanf()函数的用法

1、ssprinf( )函数的用法

sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕,其原型为:
    int sprintf(char *str, char * format [, argument, ...]);
sprintf()会根据参数format 字符串来转换并格式化数据,然后将结果复制到参数str 所指的字符串数组,直到出现字符串结束('\0')为止。
【返回值】成功则返回参数str 字符串长度,失败则返回-1,
sprintf()最常见的应用之一莫过于把整数打印到字符串中,如:
    sprintf(s, "%d", 123);  //把整数123打印成一个字符串保存在s中
    sprintf(s, "%8x", 4567);  //小写16进制,宽度占8个位置,右对齐

2、sscanf( )函数的用法
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
函数原型:
int sscanf( string str, char *format, mixed var1, mixed var2 ... );
eg: sscanf(surBuf, "%[1-9]", dstBuf);
先说下%[]:其基本格式为 %[set],表示将接收一个由set指定格式的字符串,其中set表示可接受的字符集合。
set一般有两种情况:
一种是"^set"表示非, 即在输入的字符串中将匹配所有不在set中出现的字符,遇到set中的字符时停止匹配。
另一种是"set"表示在输入的字符串中将匹配所有在set中出现的字符,遇到非set中的字符时停止匹配。
eg:
sscanf("hello,world","%[^,]",buf); //当surBuf字符串中出现","时停止匹配,则buf=hello;
sscanf("abcdefg","%[^gfd]",buf);//当surBuf字符串中出现'g','f','d'中的任意一个时停止匹配,则buf=abc,
  即surBuf字符串中出现了d,f,g时不再将surBuf字符串中内容放入buf
sscanf("abcdefg","%[cbad]",buf);//只匹配'a','b','c','d'这几个字符,如果不是这几个字符则停止匹配,buf=abcd 
特殊情况:
(1)如果要匹配"^"时,当然不能直接放在[]中,所以可以用%[ab^cd]这种方式,
(2)当要匹配右方括号"]"时,应把其放在set中第一个位置,如"%[]abc]"表示匹配的字符集为{], a, b, c},
又如"%[^]abc]"表示匹配所有非"], a, b, c"中的字符
另外,还可以使用"-" 如%[a-z]表示只匹配abcd....yz等小写的字母;%[0-9]表示只匹配0,1,2...9等数字;
(3) * 表示跳过,如:
int main()
{
char buf[100]="123:2333:ahahaha:hututu:demaxiya:12138:hello";
char user[20]="";
char host[20]="";
char msg[20]="";
int cmd = 0;
sscanf(buf, "%*d:%*[^:]:%*[^:]:%[^:]:%[^:]:%d:%s", user, host, &cmd, msg);
return 0;
}
结果:user="hututu",host="demaxiya",cmd=12138,msg=hello
    注意,“-”的字符只有在其左右两边都有有效字符时才有这个作用,否则被认为是普通字符,如“a-c-e-g”匹配的字符为{a, b, c, -, e, f, g},这样也为输入“-”字符提供了方法。




其中的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的任意字符,贪婪性
注意:在读入的字符串是空字符串时,sscanf函数并不改变待读入到的字符串的值。
常见用法:
1、取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。  
    sscanf("123456 ", "%4s", buf);  
2、给定一个字符串“hello, world”,仅保留world。(注意:“,”之后有一空格)  
    //%*s表示第一个匹配到的%s被过滤掉,即hello和逗号被过滤了,过滤一空格结束,如果没有空格则结果为NULL。  
    sscanf("hello, world", "%*s%s", buf);  
    3、sscanf("16:12:02", "%d:%d:%d",&a1,&b1,&c1);//这个不行啊  
以及2006:03:18 - 2006:04:18:
char sztime1[16] = "", sztime2[16] = "";
sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值