zoukankan      html  css  js  c++  java
  • sscanf

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

     

     第一个参数可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' | '\t' | '\n' | 非%符号}

     

      注:

     

      1、 * 亦可用于格式中, (即 %*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)

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

      3、width表示读取宽度。

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

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

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

      失败返回0 ,否则返回格式化的参数个数

     

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

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

    %[^a] 匹配非a的任意字符,并且停止读入,贪婪性

     

     1. 常见用法。

      char buf[512] ;

      sscanf("123456 ", "%s", buf);//此处buf是数组名,它的意思是将123456以%s的形式存入buf中!

      printf("%s\n", buf);

      结果为:123456 

      2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 

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

      printf("%s\n", buf); 

      结果为:1234 

      3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。

      sscanf("123456 abcdedf", "%[^ ]", buf);

      printf("%s\n", buf);

      结果为:123456

      4. 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。

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

      printf("%s\n", buf);

      结果为:123456abcdedf

      当输入:

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

      printf("%s\n",buf);

      结果为:123456

      5. 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。

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

      printf("%s\n", buf);

      结果为:123456abcdedf

     

      6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中

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

      printf("%s\n", buf);

      结果为:12DDWDFF

     

      7、给定一个字符串"hello,  world",仅保留world。(注意:","之后有一空格,%s遇空格停止,加*则是忽略第一个读到的字符串)

      sscanf("hello, world", "%*s%s", buf);

      printf("%s\n", buf);

      结果为:world

      %*s表示第一个匹配到的%s被过滤掉,即hello被过滤了

      如果没有空格则结果为NULL。

      sscanf的功能很类似于正则表达式, 但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式.

     

      //-------------------------------------------------------

     

      用它来分隔类似这样的字符串2006:03:18:

      int a, b, c;

      /*sscanf("2006:03:18", "%d:%d:%d", a, b, c); */ /*错误方法, 要在变量a,b,c前加上取地址符, modified by huanmie_09*/

      sscanf("2006:03:18", "%d:%d:%d", &a, &b, &c);

      以及2006:03:18 - 2006:04:18:

      char sztime1[16] = "", sztime2[16] = "";

      sscanf("2006:03:18 - 2006:04:18", "%s - %s", sztime1, sztime2);

      但是后来,我需要处理2006:03:18-2006:04:18

      仅仅是取消了‘-’两边的空格,却打破了%s对字符串的界定。

      我需要重新设计一个函数来处理这样的情况?这并不复杂,但是,为了使所有的代码都有统一的风格,我需要改动很多地方,把已有的sscanf替换成我自己的分割函数。我以为我肯定需要这样做,并伴随着对sscanf的强烈不满而入睡;一觉醒来,发现其实不必。

      format-type中有%[]这样的type field。如果读取的字符串,不是以空格来分隔的话,就可以使用%[]。

      %[]类似于一个正则表达式。[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符。

      所以那个问题也就迎刃而解了:

      sscanf("2006:03:18 - 2006:04:18", "%[0-9,:] - %[0-9,:]", sztime1, sztime2);

      在softmse (Jake) 的问题贴http://community.csd(去掉我)n.n(去掉我)et/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

     

     

  • 相关阅读:
    HDU 2089 不要62
    HDU 5038 Grade(分级)
    FZU 2105 Digits Count(位数计算)
    FZU 2218 Simple String Problem(简单字符串问题)
    FZU 2221 RunningMan(跑男)
    FZU 2216 The Longest Straight(最长直道)
    FZU 2212 Super Mobile Charger(超级充电宝)
    FZU 2219 StarCraft(星际争霸)
    FZU 2213 Common Tangents(公切线)
    FZU 2215 Simple Polynomial Problem(简单多项式问题)
  • 原文地址:https://www.cnblogs.com/zsboy/p/2611617.html
Copyright © 2011-2022 走看看