关于sscanf和sprintf的详细讲解

sscanf

sscanf 读取格式化的字符串中的数据。位于头文件cstdio中

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

buffer存储的数据
format窗体控件字符串
argument可选自变量

具体参数的含义还是通过下面的例子来体会吧。不过说白了就是把buffer中内容按format的约束插入到argument中,就是字符串合并罢了,当然其作用远不止于此,这只是常用的。
sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。

第二个参数可以是一个或多个 {%[*] [width] [{h | I | 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表示满足该条件的被过滤掉,不会向目标参数中写入值,失败返回0 ,否则返回格式化的参数个数
7、如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

案例:一定要结合上面的第二个参数的说明去体会sscanf的作用以及按位运算符的作用
1、一般用法

char buf[512] = ;
sscanf("123456 ", "%s", buf);
printf("%s\n", buf);

结果为:123456

2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。

sscanf("123456 ", "%4s", buf);
printf("%s\n", buf);

结果为:1234

3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf);

结果为:123456

4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s\n", buf);

结果为:123456abcdedf

5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s\n", buf);

结果为:123456abcdedf(^恰好就是按位的异或)

6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非’@'的一串内容送到buf中

sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf);

结果为:12DDWDFF

7、给定一个字符串"hello, world",仅保留"world"。(注意:“,”之后有一空格)

sscanf("hello, world", "%*s%s", buf);
printf("%s\n", buf);

结果为:world(%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了,如果没有空格则结果为NULL) 。

涉及到的集合操作:

%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB’] 匹配a、B、'中一员,贪婪性
%[^a]匹配非a的任意字符,并且停止读入,贪婪性

sprintf:

sprintf指的是字符串格式化命令。位于头文件中

函数声明

int sprintf(char *string, char *format [,argument,...]);

参数列表
string-- 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format-- 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是%[flags][width][.precision][length]specifier
[argument]…:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。

format标签属性
format 标签属性是%[flags][width][.precision][length]specifier,具体讲解如下:
sprintf格式的规格如下所示。[]中的部分是可选的。
%[指定参数][标识符][宽度][.精度]指示符

  1. [指定参数] 处理字符方向。负号时表示从后向前处理。
  2. [标识符] 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
  3. [宽度]字符总宽度。为最小宽度。
  4. [精度] 精确度。指在小数点后的浮点数位数。
  5. 转换字符
    %% 印出百分比符号,不转换。
    %c 字符输出到缓冲区,不转换。
    %d 整数转成十进位。
    %f 倍精确度数字转成浮点数。
    %o 整数转成八进位。
    %s 字符串输出到缓冲区,不转换。
    %x 整数转成小写十六进位。
    %X 整数转成大写十六进位。

例如:结合format说明体会

money = 123.1
formatted = sprintf ("%06.2f", $money); // 此时变数 $ formatted 值为 "123.10"
formatted = sprintf ("%08.2f", $money); // 此时变数 $ formatted 值为 "00123.10"
formatted = sprintf ("%-08.2f", $money); // 此时变数 $ formatted 值为 "123.1000"
formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化为百分比

返回值
如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5。

最大的作用:连接字符串
sprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串,从而在许多场合可以替代strcat,但sprintf 能够一次连接多个字符串(自然也可以同时在它们中间插入别的内容,总之非常灵活)。比如:

char buf[60]={0};
char*who="I";
char*whom="CSDN";
sprintf(buf,"%slove%s.",who,whom);
printf("%s",buf);

输出结果:“IloveCSDN.”

MSDN中例子: 结合上面的说明体会

//crt_sprintf.c
//compile with:/W3
//This program uses sprintf to format various
//data and place them in the string name dbuffer.
#include<stdio.h>
int main(void)
{
    char buffer[200],s[]="computer",c='l';
    int i=35,j;
    float fp=1.7320534f;//Format and print various data:
    j=sprintf(buffer,"String:%s\n",s);//C4996
    j+=sprintf(buffer+j,"Character:%c\n",c);//C4996
    j+=sprintf(buffer+j,"Integer:%d\n",i);//C4996
    j+=sprintf(buffer+j,"Real:%f\n",fp);//C4996
//Note:sprintf is deprecated; consider using sprintf_s instead
    printf("Output:\n%s\ncharactercount=%d\n",buffer,j);
}
 

打印
Output:
String:computer
Character:l
Integer:35
Real:1.732053
charactercount=53

最后,注意体会sscanf和sprintf的参数顺序以及使用规范!!!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值