sscanf 特别用法

winks 2006-10-11 08:11:39
在softmse (Jake) 的问题贴http://community.csdn.net/Expert/topic/4843/4843294.xml?temp=.4321558中 ,周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。

原问题:

iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?

周星星的代码:

#include <stdio.h>

int main()
{
const char* s = "iios/12DDWDFF@122";
char buf[20];

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

return 0;
}

结果为:12DDWDFF

sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。

函数原型:

int scanf( const char *format [,argument]... );
其中的format可以是一个或多个 {%
  • [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号},

    注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。



    width:宽度,一般可以忽略,用法如:

    const char sourceStr[] = "hello, world";

    char buf[10] = {0};

    sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符

    cout << buf<< endl;

    结果为:hello

    {h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节 size,L表示4字节size(double例外),l64表示8字节size。

    type :这就很多了,就是%s,%d之类。



    特别的:

    %*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:

    const char sourceStr[] = "hello, world";

    char buf[10] = {0};

    sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

    cout << buf<< endl;

    结果为:world

    支持集合操作:

    %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)

    %[aB'] 匹配a、B、'中一员,贪婪性

    %[^a] 匹配非a的任意字符,贪婪性

    是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:

    星星大哥例子回顾:

    const char* s = "iios/12DDWDFF@122";
    char buf[20];

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

    先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中,cool.得到结果。

    PS: 向星星大哥和softmse (Jake) 致谢了,有了你们才有它啊
...全文
12072 86 打赏 收藏 转发到动态 举报
写回复
用AI写文章
86 条回复
切换为时间正序
请发表友善的回复…
发表回复
lockhall 2007-02-04
  • 打赏
  • 举报
回复
Mark
zwtwj1982 2006-10-17
  • 打赏
  • 举报
回复
写的真不错啊.又学到了一个很好的技术啊.顶一下啊.
我这也有一个很好的方案啊.值得大家看一下啊.------那就是网络文档中间件:
OAOFFICE 文档控件,能够在浏览器窗口中直接编辑Word、Excel、Powerpoint、Viso、WPS等办公文档并保存到Web服务器上,实现了本地办公与网络办公的无缝整合,彻底解决了B/S模式下的电子政务/办公自动化等系统对常用Word、Excel等文档无法在线编辑的难题。除了在线编辑保存的基本功能外,SOAOffice 文档控件同时支持痕迹保留,手写签名,电子印章、数字签名、全文手写批注等高端电子政务、电子商务、办公自动化系统所必备的功能,是E-Government、E-Business和OA系统开发的最佳选择组件!
不错吧,感兴趣的朋友可加入MSN:QHJUAN1982@HOTMAIL.COM WWW.KENHANSOFT.COM
kwbplcz 2006-10-17
  • 打赏
  • 举报
回复
我就是看不懂
sourceStr = "hello,world"
sscanf(sourceStr, "%*s%s", buf); //%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
cout << buf<< endl;
结果为:world

为什么结果是world?第一个%*s为何就刚好到hello,??
招RD和QA 2006-10-16
  • 打赏
  • 举报
回复
MSDN中关于*的解释模棱两可,不知道是不是ANSI的用法。
招RD和QA 2006-10-16
  • 打赏
  • 举报
回复
mark
bohlee 2006-10-16
  • 打赏
  • 举报
回复
不错
ouyh12345 2006-10-16
  • 打赏
  • 举报
回复
学习
jwqu 2006-10-16
  • 打赏
  • 举报
回复
mark
aceouter 2006-10-16
  • 打赏
  • 举报
回复
谢谢啊,学习了。
低调的小青蛙 2006-10-16
  • 打赏
  • 举报
回复
sscanf 的这个特点其实用得并不多,建议使用正则表达式:
http://www.regexlab.com/zh/regref.htm

另外,由于历史原因,sscanf 使用起来并不安全,可能导致莫名其妙的地址越界。
因此,在 Visual Studio 2005 中,sscanf 已经被列为 "不推荐的(deprecated)"

没想到还有那么多人叫好。
liuhaiping 2006-10-16
  • 打赏
  • 举报
回复
学习一下
Kvci 2006-10-16
  • 打赏
  • 举报
回复
顶一下
学习一下
接一下
Leomaxking 2006-10-16
  • 打赏
  • 举报
回复
o
crazy_liu 2006-10-16
  • 打赏
  • 举报
回复
记住!
falldirt 2006-10-16
  • 打赏
  • 举报
回复
很实用的语法
WizardOz 2006-10-16
  • 打赏
  • 举报
回复
mark
roger_77 2006-10-15
  • 打赏
  • 举报
回复
类似正则表达式

不错的
Narayana 2006-10-15
  • 打赏
  • 举报
回复
谢谢 学习了
jianshi051 2006-10-15
  • 打赏
  • 举报
回复
看来编程还有很长的路要走啊~

继续努力!~
jin2005 2006-10-15
  • 打赏
  • 举报
回复
嗯,不错,顶一下
加载更多回复(65)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧