字符串函数 sscanf() 详解

什么是 sscanf() 函数?

sscanf() 函数是 C 语言中的一个标准库函数,它的作用是从一个字符串中按照指定的格式提取数据,并将其存储到对应的变量中。它的原型如下:

int sscanf(const char *str, const char *format, ...);

其中,str 是要解析的字符串,format 是格式控制字符串,后面是一系列的指针参数,用来接收解析后的数据。sscanf() 函数返回成功匹配和赋值的个数,如果发生错误或到达字符串末尾,则返回 EOF。

sscanf() 函数的格式控制字符串

sscanf() 函数的格式控制字符串是由一些格式说明符组成的,每个格式说明符都以 % 开始,用来指定要提取的数据的类型和方式。格式说明符的一般形式是:

%[*][width][modifiers]type

其中,各个部分的含义如下:

  • * 是一个可选的星号,表示忽略该数据,不存储到对应的参数中。
  • width 是一个可选的整数,表示要读取的最大字符数。
  • modifiers 是一些可选的修饰符,用来指定数据的大小或精度,常见的有:
    • h 表示短整型(对于 di 和 n),或无符号短整型(对于 ou 和 x)。
    • l 表示长整型(对于 di 和 n),或无符号长整型(对于 ou 和 x),或双精度浮点型(对于 ef 和 g)。
    • L 表示长双精度浮点型(对于 ef 和 g)。
  • type 是一个必需的字符,表示要提取的数据的类型,常见的有:
    • c 表示单个字符,如果指定了 width,则会读取 width 个字符,并存储到一个字符数组中。
    • d 表示十进制整数,数字前面的 + 或 - 号是可选的。
    • eEfgG 表示浮点数,包含了一个小数点,一个可选的前置符号 + 或 -,一个可选的后置字符 e 或 E,以及一个十进制指数。
    • o 表示八进制整数。
    • s 表示字符串,会读取连续的非空白字符,直到遇到一个空白字符为止。
    • u 表示无符号的十进制整数。
    • xX 表示十六进制整数。
    • [ 表示字符集合,会读取符合指定字符集合的连续字符,直到遇到一个不符合的字符为止。字符集合可以用 - 表示范围,例如 [0-9] 表示数字,也可以用 ^ 表示取反,例如 [^a-z] 表示非小写字母。如果字符集合以 ^ 开始,则 ^ 不表示取反,而是表示本身,例如 [^^] 表示非 ^ 的字符。

sscanf() 函数的使用示例

下面给出一些使用 sscanf() 函数的示例,以及相应的输出结果。

#include <stdio.h>int main()
{char str[100] = "2021-03-01 10:44:00"; // 要解析的字符串int year, month, day, hour, minute, second; // 存储解析后的数据的变量int n; // 存储 sscanf() 函数的返回值// 从字符串中按照指定的格式提取数据n = sscanf(str, "%d-%d-%d %d:%d:%d", &year, &month, &day, &hour, &minute, &second);// 输出提取的数据和返回值printf("year = %d\n", year);printf("month = %d\n", month);printf("day = %d\n", day);printf("hour = %d\n", hour);printf("minute = %d\n", minute);printf("second = %d\n", second);printf("n = %d\n", n);return 0;
}

输出结果为:

year = 2021
month = 3
day = 1
hour = 10
minute = 44
second = 0
n = 6

从输出结果可以看出,sscanf() 函数成功地从字符串中提取了年月日时分秒的数据,并存储到对应的变量中,返回值为 6,表示有 6 个数据被匹配和赋值。

下面再看一个使用字符集合的示例:

#include <stdio.h>int main()
{char str[100] = "Hello, world!"; // 要解析的字符串char word1[20], word2[20]; // 存储解析后的数据的变量int n; // 存储 sscanf() 函数的返回值// 从字符串中按照指定的格式提取数据n = sscanf(str, "%[^,], %s", word1, word2);// 输出提取的数据和返回值printf("word1 = %s\n", word1);printf("word2 = %s\n", word2);printf("n = %d\n", n);return 0;
}

输出结果为:

word1 = Hello
word2 = world!
n = 2

从输出结果可以看出,sscanf() 函数使用了字符集合 [^,] 来提取第一个逗号之前的字符串,然后使用了 s 来提取第一个空格之后的字符串,返回值为 2,表示有 2 个数据被匹配和赋值。

sscanf() 函数的注意事项

在使用 sscanf() 函数时,需要注意以下几点:

  • sscanf() 函数会从字符串的开头开始解析,如果遇到不符合格式的字符,就会停止解析,并返回已经匹配和赋值的个数。因此,要保证字符串的格式和格式控制字符串的格式一致,否则可能会导致解析失败或不完全。
  • sscanf() 函数的格式控制字符串中可以包含空格字符、制表符、换行符等,它们会被忽略,不影响解析。但是,如果要匹配字符串中的空白字符,就不能使用 s 类型,而要使用 c 类型或字符集合类型,并指定 width 为 1。
  • sscanf() 函数的后面的指针参数必须和格式说明符的类型一致,否则可能会导致数据错误或内存溢出。例如,如果要提取一个整数,就不能使用 char * 类型的参数,而要使用 int * 类型的参数,并在变量名前加上 & 符号,表示取地址。
  • sscanf() 函数不会在提取的字符串后面自动添加空字符,因此,如果要将提取的字符串作为一个完整的字符串使用,就需要手动在后面添加空字符,或者在定义字符数组时多预留一个空间,用来存储空字符。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/713476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Project_Euler-44 题解

Project_Euler-44 题解 题目 思路 题目给出了一个性质&#xff0c;让我在对应性质的数据中找出目标值&#xff0c;这种问题首先想到的就是枚举。 我们可以枚举 P k P_k Pk​ &#xff0c;对于每一个 P k P_k Pk​ &#xff0c;我们再枚举 P j P_j Pj​&#xff0c; P j P_…

【ue5】滑铲系统蓝图笔记

大致逻辑如下&#xff1a; 一、导入动画 滑铲蹲待机蹲行走 导入到文件夹中 可以右键设置颜色&#xff0c;便于区分。 二、调整动画 1.启动根运动 启动根运动后&#xff0c;人物才可以位移&#xff0c;不然只能在原地。 打开动画序列&#xff0c;勾选启用根运动Enabled…

用node或者vscode开启一个简单的本地server服务器,加载html网页

使用Live Server 想要加载本地html页面可以快速能让它在你本地浏览器中打开&#xff0c;可以有好多种方式&#xff0c;如果你有使用vscode&#xff0c;可以安装一个插件&#xff1a;Live Server&#xff0c;然后直接在vscode中直接右键就可以开启这个服务&#xff1a; 安装好之…

C++基于多设计模式下的同步异步日志系统day2

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容实现了日志代码设计的实…

在 Spring Boot 3.x 中使用 SpringDoc 2 / Swagger V3

SpringDoc V1 只支持到 Spring Boot 2.x springdoc-openapi v1.7.0 is the latest Open Source release supporting Spring Boot 2.x and 1.x. Spring Boot 3.x 要用 SpringDoc 2 / Swagger V3, 并且包名也改成了 springdoc-openapi-starter-webmvc-ui SpringDoc V2 https://s…

select,poll和epoll有什么区别

它们都是NIO中多路复用的三种实现机制&#xff0c;是由linux操作系统提供的。 用户空间和内核空间&#xff1a;操作系统为了保证系统安全&#xff0c;将内核分为两个部分&#xff0c;一个是用户空间&#xff0c;一个是内核空间。用户空间不能直接访问底层的硬件设备&#xff0…

IT廉连看——Uniapp——配置文件pages

IT廉连看——Uniapp——配置文件pages [IT廉连看] 本堂课主要为大家介绍pages.json这个配置文件 一、打开官网查看pages.json可以配置哪些属性。 下面边写边讲解 新建一个home页面理解一下这句话。 以下一些页面的通用配置 通用设置里我们可以对导航栏和状态栏进行一些设…

Android修行手册-集成Python开发环境

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

Debezium发布历史161

原文地址&#xff1a; https://debezium.io/blog/2023/09/13/debezium-2-4-beta2-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 2.4.0.Beta2 Released September 13, 2023 by Chris Cranfo…

Apache Flink连载(三十五):Flink基于Kubernetes部署(5)-Kubernetes 集群搭建-1

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 ​编辑

Python爬虫——Urllib库-2

编解码 问题引入 例如&#xff1a; https://www.baidu.com/s?wd章若楠 https://www.baidu.com/s?wd%E7%AB%A0%E8%8B%A5%E6%A5%A0 第二部分的一串乱码就是章若楠 如果这里是写的章若楠就会 产生这样的错误 所以我们就可以使用get请求方式的quote方法了 get请求方式的q…

laravel ApiResponse接口统一响应封装

一&#xff0c;新增接口返回码配置文件 在config中新增配置文件apicode.php <?phpreturn [ apicodes>[/*** Message("OK")* 对成功的 GET、PUT、PATCH 或 DELETE 操作进行响应。也可以被用在不创建新资源的 POST 操作上*/HTTP_OK > 200,/*** Message(&qu…

使用el-form之表单校验自动定位到报错位置问题,,提升用户体验

需求描述 由于需要填写的表单项太多&#xff0c;提交的时候校验不通过&#xff0c; 如果没填写的表单项在最上面&#xff0c;用户看不到不知道发生了啥&#xff0c; 所以需要将页面滚动定位到第一个报错的表单项位置&#xff0c;提升用户体验实现步骤 1. 给form表单添加ref …

数据中心GPU集群高性能组网技术分析

数据中心GPU集群组网技术是指将多个GPU设备连接在一起&#xff0c;形成一个高性能计算的集群系统。通过集群组网技术&#xff0c;可以实现多个GPU设备之间的协同计算&#xff0c;提供更大规模的计算能力&#xff0c;适用于需要大规模并行计算的应用场景。 常用的组网技术&…

1209. 带分数 刷题笔记

思路 暴力匹配 读入目标数 n 看n是否与ab/c相等 因为c里面的除法是整除 我们将 nab/c 转换为 c*na*cb 那么如何获得a,b&#xff0c;c 依题意 a&#xff0c;b&#xff0c;c三个数由1-9九个数字组成 且每个数字只能出现一次 由此 我们可以搜出123456789的全部排列方式…

我做的app上架应用市场一天,快破400下载量,0差评

上集说到&#xff0c;我做了一个叫QB音乐的安卓app&#xff0c;经过一段时间的自我使用与测试终于算发布了。我昨天顺便把它上架了奇妙应用市场&#xff0c;截止目前3月1号过去了一天&#xff0c;下载量快到400&#xff0c;0差评。看来还是能正常使用的。 一、为什么做这个ap…

CleanMyMac X2024免费Mac电脑清理和优化工具

CleanMyMac X是一款专业的 Mac 清理和优化工具&#xff0c;它具备一系列强大的功能&#xff0c;可以帮助用户轻松管理和维护他们的 Mac 电脑。以下是一些关于 CleanMyMac X 的主要功能和特点&#xff1a; 智能清理&#xff1a;CleanMyMac X 能够智能识别并清理 Mac 上的无用文件…

深入剖析k8s-Pod篇

为什么需要Pod&#xff1f; 进程是以进程组的方式组织在一起。受限制容器的“单进程模型”&#xff0c; 成组调用没有被妥善处理&#xff08;资源调用有限&#xff09;&#xff0c;使用资源囤积则导致复杂度上升。 在k8s项目中&#xff0c;Pod的实现需要使用一个中间容器——…

css【详解】—— 圣杯布局 vs 双飞翼布局 (含手写清除浮动 clearfix)

两者功能效果相同&#xff0c;实现方式不同 效果预览 两侧宽度固定&#xff0c;中间宽度自适应&#xff08;三栏布局&#xff09;中间部分优先渲染允许三列中的任意一列成为最高列 圣杯布局 通过左右栏填充容器的左右 padding 实现&#xff0c;更多细节详见注释。 <!DOCTYP…

《无线网络技术》考试版笔记

第一章 无线网络介绍 什么是多径效应&#xff0c;如何去克服&#xff1a; 在发射机和接收机之间没有明显的直线路径时&#xff0c;就会产生多径传播。如果两个信号彼此叠加&#xff0c;那么接收设备就无法正确解调信号&#xff0c;无法还原为它的原始数据形式。 可以稍微调整接…