C语言中的sscanf()函数使用详解

sscanf() - 从一个字符串中读进与指定格式相符的数据.
  函数原型:

  Int sscanf( string str, string fmt, mixed var1, mixed var2 ... );
  int scanf( const char *format [,argument]... );

  说明:
  sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
  其中的format可以是一个或多个 {%[*] [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 表示满足该条件的被过滤掉,不会向目标参数中写入值
  支持集合操作:
  %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
  %[aB'] 匹配a、B、'中一员,贪婪性
  %[^a] 匹配非a的任意字符,贪婪性

format格式

 {%[*] [width][{h | l | l64 | L}]type | ' ' | t' | '\n' | 非%符号}

注:

*可用于格式中,(即%*d和%*s)加了星号(*)表示跳过此数据不读入。(也就是不把数据读入到参数中)
    width表示读取宽度
    {h | l | l64 | L}:参数size,通常h表示单字节size,l表示2字节size,L表示4字节size,l64表示8字节size
    type参数类型,例如%s,%d
    支持正则表达式,例如%[a-z]匹配a到z中任意字符(ps:正则表达式这个假期我会写一篇博客记录)

参考用例

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h> 

 int main()
 {
  int result;
  char str[100];
  char buf1[255], buf2[255], buf3[255], buf4[255]; 

  //基本用法
  memset(str, 0, sizeof(str));
  strcpy(str, "i love china!");
  result = sscanf(str, "%s %s %s", buf1, buf2, buf3);
  printf("%d\n%s\n%s\n%s\n", result, buf1, buf2, buf3);
  /**
   * 执行结果:
   * 3
   * i
   * love
   * china!
   * 可以看出,sscanf的返回值为读取的参数个数
   */ 

  //读取指定长度的字符串
  memset(str, 0, sizeof(str));
  strcpy(str, "abcdefghijklmnopq");
  sscanf(str, "%5s", buf4);
  printf("%s\n", buf4);
  /**
   * 执行结果:
   * abcde
   */ 

  //正则匹配字符串
  memset(str, 0, sizeof(str));
  memset(buf1, 0, sizeof(buf1));
  memset(buf2, 0, sizeof(buf2));
  memset(buf3, 0, sizeof(buf3));
  strcpy(str, "123456abcdedfANDFS");
  sscanf(str, "%[0-9]%[a-z]%[A-Z]", buf1, buf2, buf3);
  printf("%s\n%s\n%s\n", buf1, buf2, buf3);
  /**
   * 执行结果:
   * 123456
   * abcdedf
   * ANDFS
   * 很难相信c语言竟然支持正则,不过c支持的正则挺弱的
   */
  return 0;
 }


九度ac题目
题目描述

题目描述: 
    有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录: 
    “hs_10000_p”是计算任务的名称, 
    “2007-01-17 19:22:53,315”是计算任务开始执行的时间“年-月-日 时:分:秒,毫秒”,  
    “253.035(s)”是计算任务消耗的时间(以秒计) 
    hs_10000_p 2007-01-17 19:22:53,315 253.035(s) 
    请你写一个程序,对日志中记录计算任务进行排序。 
    时间消耗少的计算任务排在前面,时间消耗多的计算任务排在后面。 
    如果两个计算任务消耗的时间相同,则将开始执行时间早的计算任务排在前面。 
    输入: 
    日志中每个记录是一个字符串,每个字符串占一行。最后一行为空行,表示日志结束。日志中最多可能有10000条记录。 
    计算任务名称的长度不超过10,开始执行时间的格式是YYYY-MM-DD HH:MM:SS,MMM,消耗时间小数点后有三位数字。 
    计算任务名称与任务开始时间、消耗时间之间以一个或多个空格隔开,行首和行尾可能有多余的空格。 
    输出: 
    排序好的日志记录。每个记录的字符串各占一行。 
    输入的格式与输入保持一致,输入包括几个空格,你的输出中也应该包含同样多的空格。 
    样例输入: 
    hs_10000_p   2007-01-17 19:22:53,315     253.035(s) 
    hs_10001_p   2007-01-17 19:22:53,315     253.846(s) 
    hs_10002_m   2007-01-17 19:22:53,315     129.574(s) 
    hs_10002_p   2007-01-17 19:22:53,315     262.531(s) 
    hs_10003_m   2007-01-17 19:22:53,318     126.622(s) 
    hs_10003_p   2007-01-17 19:22:53,318     136.962(s) 
    hs_10005_m   2007-01-17 19:22:53,318     130.487(s) 
    hs_10005_p   2007-01-17 19:22:53,318     253.035(s) 
    hs_10006_m   2007-01-17 19:22:53,318     248.548(s) 
    hs_10006_p   2007-01-17 19:25:23,367    3146.827(s) 
    样例输出: 
    hs_10003_m   2007-01-17 19:22:53,318     126.622(s) 
    hs_10002_m   2007-01-17 19:22:53,315     129.574(s) 
    hs_10005_m   2007-01-17 19:22:53,318     130.487(s) 
    hs_10003_p   2007-01-17 19:22:53,318     136.962(s) 
    hs_10006_m   2007-01-17 19:22:53,318     248.548(s) 
    hs_10000_p   2007-01-17 19:22:53,315     253.035(s) 
    hs_10005_p   2007-01-17 19:22:53,318     253.035(s) 
    hs_10001_p   2007-01-17 19:22:53,315     253.846(s) 
    hs_10002_p   2007-01-17 19:22:53,315     262.531(s) 
    hs_10006_p   2007-01-17 19:25:23,367    3146.827(s)

ac代码

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h> 

 struct mission
 {
  char str[200];
  char name[20];
  int year, month, day, hour, minute, second, micro;
  double runtime;
 }; 

 int compare(const void *p, const void *q); 

 int main()
 {
  struct mission mis[10001];
  int i, n = 0;
  memset(mis, 0, sizeof(mis));
  while(gets(mis[n].str))
  {
   if(strcmp(mis[n].str, "") == 0)
   {
    break;
   }
   sscanf(mis[n].str, "%s%d-%d-%d %d:%d:%d,%d %lf", mis[n].name, &mis[n].year, &mis[n].month, &mis[n].day, &mis[n].hour, &mis[n].minute, &mis[n].second, &mis[n].micro, &mis[n].runtime);
   n ++;
  } 

  qsort(mis, n, sizeof(mis[0]), compare); 

  for(i = 0; i < n; i ++)
  {
   printf("%s\n", mis[i].str);
  } 

  return 0;
 } 

 int compare(const void *p, const void *q)
 {
  const struct mission *a = p;
  const struct mission *b = q; 

  if(a->runtime > b->runtime)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year > b->year)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month > b->month)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day > b->day)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour > b->hour)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute > b->minute)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute == b->minute && a->second > b->second)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute == b->minute && a->second == b->second && a->micro > b->micro)
  {
   return 1;
  }else if(a->runtime == b->runtime && a->year == b->year && a->month == b->month && a->day == b->day && a->hour == b->hour && a->minute == b->minute && a->second > b->second && a->micro == b->micro)
  {
   return 0;
  }
  else
  {
   return -1;
  }
 }
(0)

相关推荐

  • 浅析C语言中sscanf 的用法

    名称:sscanf() - 从一个字符串中读进与指定格式相符的数据. 复制代码 代码如下: 函数原型:Int  sscanf( string str, string fmt, mixed var1, mixed var2 ... );int scanf( const char *format [,argument]... ); 说明:sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源.其中的format可以是一个或多个 {%[*] [wi

  • 用js来格式化字符串示例模仿css

    New Document var page="" page += "onlytiancai".fontcolor('red')+"使用颜色 " page += "onlytiancai".bold()+"加粗 " page += "onlytiancai".link("http://blog.csdn.net/onlytiancai/")+"加链接 &quo

  • 浅析C语言中printf(),sprintf(),scanf(),sscanf()的用法和区别

    printf语法: #include <stdio.h>int printf( const char *format, ... ); printf()函数根据format(格式)给出的格式打印输出到STDOUT(标准输出)和其它参数中.返回值是输出的字符数量.sprintf语法: #include <stdio.h>int sprintf( char *buffer, const char *format, ... );sprintf()函数和printf()类似,格式控制完全一样

  • JavaScript实现字符串与日期的互相转换及日期的格式化

    字符串转日期.日期转字符串 // 2014-02-25 /** * 字符串转时间(yyyy-MM-dd HH:mm:ss) * result (分钟) */ stringToDate : function(fDate){ var fullDate = fDate.split("-"); return new Date(fullDate[0], fullDate[1]-1, fullDate[2], 0, 0, 0); } /** * 格式化日期 * @param date 日期 * @

  • C语言中sscanf()函数的字符串格式化用法

    介绍 sscanf()为C语言标准库函数,用于从指定字符串中读入与指定格式相符的数据.函数原型声明在stdio.h头文件中: int sscanf(const char *str, const char *format, ...); 该函数根据参数format(格式化字符串)来转换参数str指向的字符串,转换后的结果存于对应的可变参数内.其返回值为按照指定格式转换符成功读入且赋值的可变参数数目(若发生匹配错误而部分成功,该数目会小于指定的参数数目,甚至为0).若首次成功转换或错误匹配发生前输入已

  • javascript日期对象格式化为字符串的实现方法

    javascript提供的日期格式化太简单,一般应用都需要自己实现格式化方法.下面是我想出的一个格式化处理方案,应该是可以满足常用的需求.日期模板中可以使用任意分隔符,还可以使用文字作为分隔符,甚至支持类似yyyyMMdd之类没有分隔符的格式化. 原理:用正则表达式将日期模板中的日期元素[如yyyy, MM, dd]和分隔符拆分成数组,然后用实际的值替换日期元素形成日期字符串. 实现共有两个函数,粘贴可运行. 扩展方式: 示例中只支持了年月日时分秒毫秒的元素,如果需要显示星期则可以在values

  • 详解C语言sscanf()函数、vsscanf()函数、vscanf()函数

    C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: #include <stdio.h> sscanf()函数用于从字符串中读取指定格式的数据,其原型如下: int sscanf (char *str, char * format [, argument, ...]); [参数]参数str为要读取数据的字符串:format为用户指定的格式:argument为变量,用来保存读取到的数据. [返回值]成功则返回参数数目,失败则返回-1,错误原因存于errno 中. sscanf()

  • C语言中的sscanf()函数使用详解

    sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 ... ); int scanf( const char *format [,argument]... ); 说明: sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源. 其中的format可以是一个或多个 {%[*] [width] [{h |

  • C语言中static和auto用法详解

    目录 static的第一种用法:定义为静态变量 static的第二种用法:有理说不清,直接代码见真知 auto的用法:直接代码见真知 总结 static的第一种用法:定义为静态变量 何为静态变量?存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化.就是只进行一次初始化.不理解?看代码! 代码见真知: #include<stdio.h> int main() { void fun(); //定义一个空函数 for(int i=0;i<3;i++) { fun();

  • Go语言中interface语法与使用详解

    目录 初识interface 基本语法 其他注意事项 interface底层实现 iface eface 侵入式与非侵入式的理解 interface的应用场景 类型转换 实现多态功能 补充:interface 与 nil 的比较 总结 初识interface Go语言的面向对象的知识点时,发现它的面向对象能力全靠 interface 撑着,而且它的 interface 还与我们以前知道的 interface 完全不同.故而整个过程不断的思考为什么要如此设计?这样设计给我们带来了什么影响? int

  • C语言中 “_at()” 特殊地址定位详解

    C语言中 "_at()" 特殊地址定位详解 在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面 指令为 __at ,使用方法如下 int variable __at(0x8000) = 100; 意为将variable变量定位到0x8000这个地址. 指令的目的是告诉链接器将指定地址定位到某个地址里面,在使用该功能的时候需要注意一点的是,地址的范围需要符合单片机的datasheet给出的地址映射表, 注意,如果地址超出了flash的最大范围,程序将无

  • C语言中fgets和fscanf区别详解

    C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往缓冲区写多一个\0,所以它是读一行数据) ②fscanf:从文件中读取一段数据存入缓冲区(fscanf遇到空格或回车就结束,它会把空格或回车转换为\0,所以它是读一小段数据) 二.举个例子:把a.txt文件中的内容复制到b.txt. a.txt中的内容(第一行中"我爱你小白"和"开玩笑&q

  • C语言中的rand()和rand_r()详解

    目录 背景 rand()和rand_r()的区别 rand() rand_r() 总结 背景 最近在学<并行程序设计导论>这门课,在做使用Pthreads并行化蒙特卡洛法估计 π \pi π的实验时遇到了一个问题,使用多线程反而要比单线程要慢很多,输出如下所示 可以看到,使用一个线程时程序运行只需要2.89031秒,但是使用两个线程时运行时间竟然达到了9.14698秒. 最终发现了问题所在:每个线程在执行下面的函数时,生成随机数使用了rand()函数,就是这个函数的使用才导致多线程运行时所需要

  • sql语言中delete删除命令语句详解

    Table:用于标示删除的数据表的名称. 1:该表必须是一个事实存在的表,对于该处的表必须是一个实际存在于数据库中的表格,必能是由于select等语句创造出来的中间表. 2:该方式可以通过联合的方式同时在两个表格中满足一定关联条件的数据. Top(*)用于指定删除的数据的数量 1:Top(N)表示在该表中删除表格中最靠前的N条数据. 2:在delete中不能和order连用,所以也不能通过top和order by连用来删除按照某一条件排序的全部的靠前的几条记录. 3:改语句不能用于sql2000

  • C 语言中strstr函数实例详解

    C 语言中strstr函数实例详解 strstr函数 strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串.如果是,则该函数返回str2在str1中首次出现的地址:否则,返回NULL const char* strstr(const char* str1,const char* str2); char* strstr(char* str1,const char* str2); 库中实现的strstr #include <stdio.h> #include <

  • C语言中access/_access函数的使用实例详解

    在Linux下,access函数的声明在<unistd.h>文件中,声明如下: int access(const char *pathname, int mode); access函数用来判断指定的文件或目录是否存在(F_OK),已存在的文件或目录是否有可读(R_OK).可写(W_OK).可执行(X_OK)权限.F_OK.R_OK.W_OK.X_OK这四种方式通过access函数中的第二个参数mode指定.如果指定的方式有效,则此函数返回0,否则返回-1. 在Windows下没有access函

  • 详解C语言中return返回函数局部变量的问题

    目录 return返回栈区局部变量的指针 return返回栈区局部的临时变量 return只读数据段和static数据 在计算机中,释放空间并不需要将空间中的内容全部置成0或者1,而是只要设置这一块空间的数据无效即可.比如在下载文件时需要花很长时间,但是删除文件却只要几秒钟,这是因为操作系统只是把文件标识(文件头链接)删掉了,文件原文还保留着,我们没了文件标识就找不到这个文件了.所以删除后的文件,还可以用特殊的办法被找回来. 这也就意味着,当函数结束调用的时候,函数中的局部变量实际上还是在的,只

随机推荐