sscanf
#include<stdio.h>
1、sscanf和scanf的不同是输入来源,前者是一个字符串,后者则是标准输入设备
2、sscanf的使用,以解析时间字符串为例,将字符串“2009-01-02_11:12:13”解析为整型年月日时分秒
//定义
char cc;
tm tm_temp={0};
string stime("2009-01-02_11:12:13");
//(1) 必须严格按照分隔符形式匹配填写,若遇到不匹配项则终止解析
sscanf(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d",
&tm_temp.tm_year,
&tm_temp.tm_mon,
&tm_temp.tm_mday,
&tm_temp.tm_hour,
&tm_temp.tm_min,
&tm_temp.tm_sec
);
//(2) 可以不按照分割符号形式填写,字符数必须一致,例如可以正确解析“2009/01/02_11:12:13”
sscanf(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d",
&tm_temp.tm_year, &cc,
&tm_temp.tm_mon, &cc,
&tm_temp.tm_mday, &cc,
&tm_temp.tm_hour, &cc,
&tm_temp.tm_min, &cc,
&tm_temp.tm_sec
);
//(3) 可以不按照分割符号形式填写,字符数必须一致,同上,%1s可以等同于%c
sscanf(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",
&tm_temp.tm_year, &cc,
&tm_temp.tm_mon, &cc,
&tm_temp.tm_mday, &cc,
&tm_temp.tm_hour, &cc,
&tm_temp.tm_min, &cc,
&tm_temp.tm_sec
);
//(4) 可以不按照分割符形式和数量填写,类型必须一致,例如可以正确解析“2009/01/02___11:12:13”
//这里使用了sscanf的正则表达式,与通用的正则表示类似但不完全相同,%*c表示忽略连续多个字符
sscanf(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",
&tm_temp.tm_year,
&tm_temp.tm_mon,
&tm_temp.tm_mday,
&tm_temp.tm_hour,
&tm_temp.tm_min,
&tm_temp.tm_sec
);
3、sscanf_s的使用
//定义
char cc[2];
tm tm_temp={0};
string stime("2009-01-02_11:12:13");
//(1) 与sscanf第一种方法相同,可以使用"%4d-%2d-%2d_%2d:%2d:%2d"格式匹配解析
sscanf_s(stime.c_str(), "%4d-%2d-%2d_%2d:%2d:%2d",
&tm_temp.tm_year,
&tm_temp.tm_mon,
&tm_temp.tm_mday,
&tm_temp.tm_hour,
&tm_temp.tm_min,
&tm_temp.tm_sec
);
//(2) 使用%c格式对数据解析时,必须对相应的缓冲区增加长度参数,否则将会出错
sscanf_s(stime.c_str(), "%4d%c%2d%c%2d%c%2d%c%2d%c%2d",
&tm_temp.tm_year, &cc, 1,
&tm_temp.tm_mon, &cc, 1,
&tm_temp.tm_mday, &cc, 1,
&tm_temp.tm_hour, &cc, 1,
&tm_temp.tm_min, &cc, 1,
&tm_temp.tm_sec
);
//(3) 使用%s格式对数据解析时,缓冲长度必须大于字符串长度,否则不予解析
sscanf_s(stime.c_str(), "%4d%1s%2d%1s%2d%1s%2d%1s%2d%1s%2d",
&tm_temp.tm_year, &cc, 2,
&tm_temp.tm_mon, &cc, 2,
&tm_temp.tm_mday, &cc, 2,
&tm_temp.tm_hour, &cc, 2,
&tm_temp.tm_min, &cc, 2,
&tm_temp.tm_sec
);
//(4) 与sscanf一样,sscanf_s同样支持正则表达式
sscanf_s(stime.c_str(), "%4d%*c%2d%*c%2d%*c%2d%*c%2d%*c%2d",
&tm_temp.tm_year,
&tm_temp.tm_mon,
&tm_temp.tm_mday,
&tm_temp.tm_hour,
&tm_temp.tm_min,
&tm_temp.tm_sec
);
通过以上对比sscanf与sscanf_s的使用,可以看出后者对缓冲区安全有了更多的考虑,从而避免了许多不经意的烦恼。
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。但新手可
能并不知道处理字符串时的一些高级用法,这里做个简要说明吧。
1. 常见用法。
以下是引用片段: char str[512] = ; sscanf("123456 ", "%s", str); printf("str=%sn", str); |
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
以下是引用片段: sscanf("123456 ", "%4s", str); printf("str=%sn", str); |
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
以下是引用片段: sscanf("123456 abcdedf", "%[^ ]", str); printf("str=%sn", str); |
4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
以下是引用片段: sscanf("123456abcdedfBCDEF", "%[1-9a-z]", str); printf("str=%sn", str); |
5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
以下是引用片段: sscanf("sscanf("123456abcdedfBCDEF", "%[^A-Z]", str); printf("str=%sn", str);", str); printf("str=%sn", str); |
sscanf的更多相关文章
- C语言关于利用sscanf实现字符串相加减
#include<stdio.h>#include<string.h>void main(){ int a; int b; char str1[10] = "9999 ...
- sscanf提取字符串中的数据php
1.需求 理解sscanf的作用 2.例子 $str = "age:30 weight:60kg"; sscanf($str,"age:%d weight:%dkg&qu ...
- sscanf与正则表达式(转)
今天翻google reader的时候看到这样一篇文章,介绍的是sscanf的高级用法.直到今天我才知道sscanf是可以直接用正则表达式的,惭愧. 在msdn中sscanf的声明如下 int ssc ...
- C语言函数sscanf()的用法
从文件读取数据是一件很麻烦的事,所幸有sscanf()函数. C语言函数sscanf()的用法 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( st ...
- sscanf()函数的使用及其实例
资料引自: 传送门 sscanf函数原型: Int sscanf( const char * src, const char * format, ...); int scanf( const char ...
- C 语言sscanf
C语言以sscanf逗号作为分割符 ]={}; ]={}; ]={}; sscanf(],&buf_b[],&buf_b[]); printf("************** ...
- Babelfish(二分查找,字符串的处理略有难度,用sscanf输入)
Babelfish Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 28581 Accepted: 12326 题目链接: ...
- (转)sscanf() - 从一个字符串中读进与指定格式相符的数据
(转)sscanf() - 从一个字符串中读进与指定格式相符的数据 sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, stri ...
- sscanf函数
sscanf函数用法举例 #include <stdio.h> #include <string.h> #define N 512 int main() { char buf[ ...
- hdu 1036 (I/O routines, fgets, sscanf, %02d, rounding, atoi, strtol) 分类: hdoj 2015-06-16 19:37 32人阅读 评论(0) 收藏
thanks to http://stackoverflow.com/questions/2144459/using-scanf-to-accept-user-input and http://sta ...
随机推荐
- ylbtech-LanguageSamples-AnonymousDelegates(匿名委托)
ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-AnonymousDelegates(匿名委托) 1.A,示例(Sample) 返回顶部 ...
- 如何更专业的使用Chrome开发者工具
顾名思义Chrome开发工具就是一个工具,它允许Web开发人员可以通过浏览器应用程序干预和操作Web页面,也可以通过这个工具调试和测试Web页面或Web应用程序.有了这个工具,你可以做很多有趣的事情: ...
- How Tomcat Works 读书笔记 八 加载器 上
Java的类加载器 具体资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
- 虚拟机设置NAT上网
需要开启虚拟机网络相关服务, 安装虚拟网卡VMware虚拟机下实现NAT方式上网1. 把你的虚拟网卡VMnet8设置为自动获得IP.自动获得DNS服务器,启用.2. 把你虚拟机中操作系统的“本地连接” ...
- Node.js meitulu图片批量下载爬虫 1.05版(Final最终版)
//====================================================== // https://www.meitulu.com图片批量下载Node.js爬虫1. ...
- docker入门——安装及简单操作
和安装其他软件一样,安装Docker也需要一些基本的前提条件.Docker要求的条件具体如下: 运行64位CPU构架的计算机(目前只能是x86_64和amd64),Docker目前不支持32位CPU. ...
- Appstore 提交Ipad 和Iphone版
- 一种大气简单的Web管理(陈列)版面设计
在页面的设计中,多版面是一种常见的设计样式.本文命名一种 这种样式.能够简单描写叙述为一行top,一列左文件夹,剩余的右下的空间为内容展示区.这种样式,便于高速定位到某项内容或功能. 在主要的HTML ...
- 【Python3 爬虫】02_利用urllib.urlopen向百度翻译发送数据并返回结果
上一节进行了网页的简单抓取,接下来我们详细的了解一下两个重要的参数url与data urlopen详解 urllib.request.urlopen(url, data=None, [timeout, ...
- NSight统计数据的颜色,缩写意义是什么?来自NV Jeff Kiel 比较官方的解释!
结合这个图示来看:https://dl.dropboxusercontent.com/u/32077444/nsight.pdf 1) The bars you see in the Summary ...