详解几个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=257;
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"。
- 详解几个sscanf和sprintf的例子
- sprintf和sscanf的详解
- 关于sprintf和sscanf的一个例子
- sprintf和sscanf详解
- sscanf和sprintf的用法
- sscanf 和 sprintf的用法
- sscanf和sprintf的用法
- sscanf和sprintf的用法
- sprintf和sscanf的用法
- sscanf和sprintf的用法
- sscanf sprintf详解
- sscanf和sprintf的高级用法
- sscanf函数和sprintf函数的用法
- sscanf和sprintf的强大用法--自用
- sprintf函数和sscanf函数的区别
- sscanf和sprintf函数的用法
- sscanf和sprintf
- sscanf 和 sprintf
- 简单天气开发系列(三)——侧滑的实现
- nginx源码学习----内存池
- 宿主机访问虚拟机中xampp搭建的站点失败
- Android 面试总结
- 第8周项目4:个人所得税计算器
- 详解几个sscanf和sprintf的例子
- python中__getattr__ __setattr__和它的朋友们
- display:inline、block、inline-block的区别
- HDU - 5088 Revenge of Nim II
- 实验室第七周工作报告
- 【Linux网络编程实例】实例一:获取主机MAC地址和IP地址
- 解决Android SDK Manager更新、下载速度慢
- 电子商务跟对SEO搜索引擎优化未来发展方向的影响
- BF,KMP,BM三种字符串匹配算法性能比较