这篇文章主要介绍了C语言中的sscanf()函数使用详解,文中附加了一道相关的ACM题目进行补充巩固,需要的朋友可以参考下

文章引用自:https://www.jb51.net/article/71146.htmhttps://www.jb51.net/article/71146.htm

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

1

2

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格式

1

{%[*] [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:正则表达式这个假期我会写一篇博客记录)

参考用例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

#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代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

#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;

 }

}

C语言中的sscanf()函数使用详解相关推荐

  1. c语言system的参数,C语言中的system函数参数详解

    http://blog.csdn.net/pipisorry/article/details/33024727 函数名: system 功   能: 发出一个DOS命令 用   法: int syst ...

  2. sizeof 在C语言的作用,C语言中的sizeof的用法详解

    C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...

  3. C语言中for循环的使用详解及注意点

    C语言中for循环的使用详解及注意点 1.for语句的格式 2.for语句循环示例 3.注意 4.与while语句的比较 5.典型例题 1.for语句的格式 for(表达式1;表达式2;表达式3){循 ...

  4. c语言指定变量地址,C语言中 “_at()” 特殊地址定位详解

    C语言中 "_at()" 特殊地址定位详解 在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面 指令为 __at ,使用方法如下 int var ...

  5. C语言中fscanf的作用,C语言中fgets和fscanf区别详解

    搜索热词 C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往 ...

  6. c语言putchar与getchar,C语言中的getchar和putchar详解

    首先给出<The_C_Programming_Language>这本书中的例子: #include int main() { int c; c = getchar(); while (c  ...

  7. C语言中static关键字的作用详解,全网最透彻

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...

  8. c语言status和void,C语言中的void和void *详解

    1.概述 许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误.本文将对void关键字的深刻含义进行解说,并 详述void及void指针类型的使用方法与技巧. ...

  9. Linux. C语言中else,if else用法详解,C语言if else用法完全攻略

    if else 语句是一种选择结构,可以让代码选择执行.所谓选择执行,就是"某些代码可能执行,也可能不执行,有选择地执行某些代码". if 的最简单用法 if最简单的格式是: if ...

最新文章

  1. 中setting怎么配置_maven的安装与配置(保姆级教学)
  2. 神奇的requestAnimationFrame
  3. 【转】增强 scite 编辑器的代码提示功能
  4. vector容器中清空元素(但原来的元素还在)
  5. python软件是哪个国家的品牌_有哪些好用的软件被国人误认为是外国研发的?
  6. LeetCode 759. 员工空闲时间(排序)
  7. 4)lsof linux命令,***Linux命令实时监测系统(top,htop,iotop,lsof,tcpdump,netstat,vmstat,iostat)...
  8. php 如何单独刷新模板,反馈一个x-admin模板的问题,点击左侧栏不会刷新右侧栏当前页面的问题,并提供解决方案。...
  9. TFS 10周年生日快乐 – TFS与布莱恩大叔的故事
  10. markdown一边写一边预览_MarkDown使用笔记
  11. 金士顿u盘数据恢复软件推荐
  12. K线形态识别—K线反转形态之底部反转形态
  13. IOS 使用自签名证书开发HTTPS文件传输
  14. linux之OPERATION(运维)一
  15. Floyd-Warshall算法(Floyd-Warshall algorithm)
  16. 技术债越堆越高,要被迫离职!
  17. 03 ,似然函数求解 :目标函数推导,对数似然求解,最小二乘法
  18. python开发ps插件_python +ps 三方面库整理
  19. 前端面试题:金山办公2020校招前端开发工程师笔试题(一)
  20. 3D建模师入行之初,就业是角色建模好还是场景建模好?

热门文章

  1. QQ无法打开,只打开Q盾
  2. 是“药”三分毒:新冠病毒会开启监控文化吗?
  3. pytorch上配置使用双显卡或多显卡
  4. Unity 日历插件组件-日期选择器2D(一)
  5. C# 学习笔记:迭代器
  6. 通过等保2.0分析系统脆弱性:安全区域边界篇与安全计算环境篇
  7. 教务系统对某门课程的教师评教系统的设计
  8. Java获取当天剩余时间的几种方法
  9. Python读入制表位分割的csv文件
  10. 逗比日记_参考的小习惯