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的任意字符

例子(来自个人经验,慢慢积累)

1.例如通过串口获得控制指令,控制指令的格式为ch,n。其中ch代表通道指令,n代表通道号,n为整数。
	uint8_t channel_id = 0;
	char buf[32];
	uart_readbuf(buf,len);
	sscanf(buf,"ch,%d",channel_id);

sscanf有返回值,返回值为匹配数量。
若当输入n为非法值时,返回值为0.否则为1.例如输入ch,x。修改以上代码:
	uint8_t channel_id = 0;
	char buf[32];
	uart_readbuf(buf,len);
	if( sscanf(buf,"ch,%d",channel_id) == 1)
	{
		// do something
	}

例子(来自网上资料)

1. 常见用法

  char buf[512] ;

  sscanf("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

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。(注意:“,”之后有一空格)

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

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

  结果为:world

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

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


8.时间格式处理

处理时间 格式XXXX-XX-XX

#include <stdio.h>
#include <stdlib.h>
int main(void) {

  int a, b, c;
  sscanf("2013:02:21", "%d:%d:%d", &a, &b, &c);
  printf("Date:%d-%d-%d",a,b,c);
  return EXIT_SUCCESS;
}


### 蓝桥杯第15届单片机试题概述 蓝桥杯第十五届单片机竞赛的试题设计相较于往届有了一定的变化,在程序题部分增加了复杂度,而选择题则去除了可以直接通过查阅手册解答的部分题目[^2]。这种调整使得参赛者不仅需要具备扎实的基础知识,还需要较强的逻辑分析能力和实际编程经验。 #### 关于sscanf函数的应用 `sscanf` 是 C 语言中的标准库函数之一,用于从字符串中读取数据并按照指定格式解析到变量中。其基本语法如下所示: ```c int sscanf(const char *str, const char *format, ...); ``` 在单片机开发过程中,如果遇到需要处理字符串输入的情况(例如接收串口通信的数据包),可以通过 `sscanf` 提取出其中的关键数值或字符信息。例如,假设接收到一个形如 `"temp=25,humi=60"` 的字符串,则可以用以下方式提取温度和湿度值: ```c char buffer[] = "temp=25,humi=60"; int temp_val, humi_val; if (sscanf(buffer, "temp=%d,humi=%d", &temp_val, &humi_val) == 2) { // 成功解析出两个整数 } ``` 上述代码片段展示了如何利用 `sscanf` 函数完成简单的字符串解析操作[^1]。 #### sqrt函数介绍 `sqr`t 函数同样属于C语言的标准数学库 `<math.h>` 中的一部分,用来计算给定浮点数或者整型参数的平方根值。需要注意的是,在嵌入式系统环境下使用该功能时可能面临性能瓶颈问题,因为大多数微控制器并不支持硬件级浮点运算单元(FPU),所以建议尽可能优化算法减少调用次数以提高效率。 以下是基于 STM32 平台实现的一个简单例子来演示求解直角三角形斜边长度的过程: ```c #include <stdio.h> #include <math.h> float hypotenuse(float a, float b){ return sqrt(a*a + b*b); } void main(){ printf("%.2f\n",hypotenuse(3.0,4.0)); } ``` 此段代码定义了一个名为 `hypotenuse` 的辅助方法接受两条较短边作为参数返回对应的最长边即斜边的结果。 对于具体的第十五届蓝桥杯单片机赛事资料获取途径可参考公开分享链接资源下载完整版文档进一步学习研究[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值