详解几个sscanf和sprintf的例子

来源:互联网 发布:网络教育报考什么专业 编辑:程序博客网 时间:2024/04/30 03:35

先看个例子——字符串转数字;数字转字符串

char str[128];

int num = -150;

int num2;

//数字转字符串,和printf的区别是不输出到屏幕上,而是输出到字符串里

sprintf(str, "%d", num);

//字符串转数字,和scanf的区别是不从键盘读,而是从字符串里读

sscanf(str, "%d", &num2);

非常方便


sscanf相当于将一大串字符串切开成一小串一小串的:

取几个例子来详解sscanf:

格式:

int sscanf(
                const char *buffer,
              const char *format,
                ...
                );



sscanf("123456","%s",buf);

取字符串"123456"到char型数组buf。



sscanf("123456","%4s",buf);

取字符串"123456"的前四个到buf。


char *buf = "08/August/2008:20:08:08 +0800";

char mon[20];

int day, year, h, m, s, zone;

sscanf(buf, "%d/%-10c/%d:%d:%d:%d%d", &day, mon,&year, &h, &m, &s, &zone);

第一个数字存到day变量里面,然后'/'和原字符串里的'/'抵消,之后字符串以左对齐域宽为10的方式存到mon数组里,之后依次将每个数据存到不同的变量里。注意最后两个%d连着,而其他的%d之间有'/',是因为那些'/'是为了抵消原字符串里面的'/'的位置的。



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

中括号代表只取...比如%[1-9a-z]代表只取数字和小写字母,所以buf为"123456abcdedf"。



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

中括号里面的'^'代表取...之前的字符串。所以%[^A-Z]代表取大写字母之前的字符串到buf,也就是取"123456abcdedf"到buf字符串。



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

运行过程是这样的:%[^/]意思是取'/'之前的,加'*'之后意思是不取这个字符串,则还剩下原字符串还剩下'/12DDWDFF@122'。此时%[^@]代表取到'@'之前的字符串,因为'/'已经打出来了,所以这个字符串不含'/',所以%[^@]就只剩下“12DDWDFF”了,也就是'/'和'@'之间的部分,写入buf。






sprintf和sscanf正好反过来,相当于将一小串一小串的字符串拼接成一大串字符串:

取几个例子来详解sprintf:

格式:

int sprintf(
               char *buffer,
                       const char *format,
               ...
               );



char c[100] = {0};
int k=25
7;
sprintf(c,"%d",k);
则c数组变成了"257",即c[0] = '2',c[1] = '5',c[2] = '7'。



charbuf[100];
sprintf(
buf,"%x",255);
buf数组变成了十六进制的255,即"ff",即buf[0] = 'f',buf[1] = 'f'。

如果是sprintf(buf, "%8x", 255);

则buf数组为"      ff"(六个空格)。

如果是sprintf(buf, "%08x", 255);

buf数组为"000000ff"。

如果是sprintf(buf, "%18x", 255);

则buf数组为"                ff"(十六个空格),而不是“域宽为8,前面六位全部填充为1”,因为18直接被当成了数字18。

【此处补加一个小知识点:%d 有符号十进制数 %o 无符号八进制数 %u 无符号十进制数 %x 无符号十六进制数 %f 有符号浮点数】

如果是sprintf(buf, "%0+8.4f", 3.12345678);

则buf数组为"+03.1235",即输出正号,添加前导0,域宽为8,保留四位小数进行四舍五入。(注意这是浮点数,所以要用%f而不是%d。)

【此处再补加一个小知识点:字段说明字符的完整格式是%[flags][width][.precision]type,其中width是域宽,如果域宽小于数值宽度,则输出实际宽度;precision(n.精确度)小于实际小数位数时,则进行截断和四舍五入;flags是格式标志,'-'代表左对齐,'+'代表在有符号数据类型前添上加号,'0'代表在域宽内加前导0。



char buf[1024];
sprintf(buf, "%-4d%6d", 123, 4567);
printf("%s",buf);

123以左对齐域宽为4的方式存入buf,4567以默认右对齐,域宽为6的方式存入buf,所以buf为"123   4567"。


char buf[1024];
char a[100]="I ";
char b[100]="love ";
char c[100]="
BUAA."
sprintf(buf,"%s%s%s",a,b,c);
则buf数组变成了"I love BUAA."(注意a,b字符串最后都有一个空格)

如果写成n = sprintf(buf,"%s%s%s",a,b,c);则n = 12,即sprintf的返回值是拼接成的字符串的长度。



a[10] = "love";

b[10] = "forever";

sprintf(buf, "%sSCSE%s", a, b);

则buf数组为"loveSCSEforever"。


0 0
原创粉丝点击