文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 专题 求职 读书
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » sscanf 特别用法       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] sscanf 特别用法  ( 查看:356  回复:0 )   
 
ribut9225
主版主  点击可查看详细


开坛元老   内阁大臣   诚信兄弟   主版主专用   巨蟹座  
帖子 3065
精华 1
无忧币 5692
积分 4076
阅读权限 150
来自 (保密)
注册日期 2006-6-22
最后登录 2008-9-5 离线

[查看资料]  [发短消息]  [Blog
  QQ       
发表于:2007-9-11 09:06   标题:sscanf 特别用法
上一帖 |
sscanf 特别用法
楼主winks(少爷)2006-10-11 20:11:39 在 C/C++ / C++ 语言 提问
在softmse   (Jake)   的问题贴http://community.csdn.net/Expert/topic/4843/4843294.xml?temp=.4321558中   ,周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。   
   
  原问题:   
   
  [url=mailto:iios/12DDWDFF@122]iios/12DDWDFF@122[/url]   
  获取/和@之间的字符串怎么做   
  C程序里面有什么函数吗?   
   
  周星星的代码:   
   
  #include      
   
  int   main()   
  {   
          const   char*   s   =   "[url=mailto:iios/12DDWDFF@122]iios/12DDWDFF@122[/url]";   
          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   =   "[url=mailto:iios/12DDWDFF@122]iios/12DDWDFF@122[/url]";   
              char   buf[20];   
       
              sscanf(   s,   "%*[^/]/%[^@]",   buf   );   
              printf(   "%s\n",   buf   );   
       
      先将   "iios/"过滤掉,再将非[url=mailto:'@']'@'[/url]的一串内容送到buf中,cool.得到结果。   
       
      PS:   向星星大哥和softmse   (Jake)   致谢了,有了你们才有它啊



  • 用户必读,51CTO积分系统调整通知
    2007-9-11 09:061楼
    [ 顶部 ]
         
    论坛跳转:  

    | | |

    标记已读 · 删除论坛Cookies · 文本版 · WAP
     
    | 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
    Copyright©2005-2008 51CTO.COM  Powered by Discuz!
    本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
    京ICP备05051492号