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格式的规格如下所示。[]中的部分是可选的。
%[指定参数][标识符][宽度][.精度]指示符
- [指定参数] 处理字符方向。负号时表示从后向前处理。
- [标识符] 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
- [宽度]字符总宽度。为最小宽度。
- [精度] 精确度。指在小数点后的浮点数位数。
- 转换字符
%% 印出百分比符号,不转换。
%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的参数顺序以及使用规范!!!