Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT
标准 sscanf 解析语法与数据解析
发布于 2020-08-16 15:51:42 浏览:2901
订阅该版
[tocm] ## 概述 在C语言应用开发过程中,常常需要对字符串数据进行解析,这些字符串可能是从文件、键盘或者其他设备读入。比如与 AT 设备通信时,需要对 AT 设备发送过来的数据进行解析,从而获得我们想要的一些数据。 然而,处理字符串却是一件很麻烦的事!幸运的是,我们有 sscanf() 函数。sscanf 可以认为是标准 C 库自带的 split string (字符串分割)函数,它强大的功能体现在对 format 的支持上。 ## sscanf 函数说明 在 stdio.h 中,提供了三个类似的函数,函数原型如下: ```c int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); ``` 其中,scanf() 从标准输入 stdin(键盘)中读进与指定格式相符的数据,fscanf() 从文件流中读进与指定格式相符的数据,sscanf() 从一个字符串中读进与指定格式相符的数据。而后面 format 参数格式是一样的。 format 说明符形式为:`[=%[*][width][modifiers]type=]` | 参数 | 描述 | | :---------- | ------------------------------------------------------------ | | `*` | 这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。 | | `width` | 这指定了在当前读取操作中读取的最大字符数。 | | `modifiers` | 为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小:
h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x)
l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g)
L :长双精度型(针对 e、f 和 g) | | `type` | 一个字符,指定了要被读取的数据类型以及数据读取方式。也就是 `%c`、`%d`、`%e`、`%f`、`%o`、`%s`、`%u`、`%x` 之类的。 | 对于 `%s` 字符串匹配,sscanf 默认使用空格进行分割,如果希望以其他字符进行分割,可以使用 `%[]` 形式。比如: - `%[a-z]` 表示匹配 `a` 到 `z` 中任意字符,贪婪性(尽可能多的匹配) - `%[aB']` 匹配 `a`、`B`、`'` 中一员,贪婪性 - `%[^a]` 匹配非 a 的任意字符,贪婪性 ## 数据解析示例 1、常见用法。 ```c char buf[512] = ; sscanf("123456 ", "%s", buf); printf("%s\n", buf); ``` 结果为:123456 2、取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。 ```c sscanf("123456 ", "%4s", buf); printf("%s\n", buf); ``` 结果为:1234 3、取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。 ```c sscanf("123456 abcdedf", "%[^ ]", buf); printf("%s\n", buf); ``` 结果为:123456 4、取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。 ```c sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf); printf("%s\n", buf); ``` 结果为:123456abcdedf 5、取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。 ```c sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf); printf("%s\n", buf); ``` 结果为:123456abcdedf 6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中 ```c sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf); printf("%s\n", buf); ``` 结果为:12DDWDFF 7、给定一个字符串““hello, world”,仅保留 world。(注意:“,”之后有一空格) ```c sscanf(“hello, world”, "%*s%s", buf); printf("%s\n", buf); ``` 结果为:world 注意:`%*s` 表示第一个匹配到的 `%s` 被过滤掉,即 hello 被过滤了,如果没有空格则结果为 NULL。 sscanf 的功能很类似于正则表达式,但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式。
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
阿基米东
https://github.com/luhuadong
文章
7
回答
52
被采纳
3
关注TA
发私信
相关文章
1
rt-thread 2g/3g/4g通信模块的教程有吗?
2
基于AT指令,用esp8266如何连接mqtt?
3
AT组件使用问题
4
官方AT客户端应用笔记的几个小tip
5
RTT的SAL能够判断使用LWIP或者AT?
6
rt_therad AT组件移植不成功(结贴)
7
AT组件在哪个版本的?
8
AT组件 连接 Onenet 连接失败
9
esp8266 AT指令 MQTT连接问题
10
AT组件使用问题之模块主动上报【已解决】
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
8
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
7
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
catcatbing
2
篇文章
5
次点赞
swet123
1
篇文章
3
次点赞
YZRD
1
篇文章
2
次点赞
Days
1
篇文章
2
次点赞
阳光的掌控者
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部