27 C 语言标准库 <stdio.h> 中的两个重要字符串函数:sprintf、sscanf

目录

1 sprintf

1.1 函数原型

1.2 功能说明

1.3 案例演示

1.4 注意事项

2 sscanf

2.1 函数原型

2.2 功能说明

2.3 案例演示

2.4 注意事项


1 sprintf

1.1 函数原型

        sprintf 函数是 C 语言标准库中的一个函数,用于将格式化的数据写入字符串。其函数原型定义在 <stdio.h> 头文件中。

#include <stdio.h>  
int sprintf(char *str, const char *format, ...);
  • 参数:
    • char *str:指向一个字符数组的指针,该数组足够大以存储生成的格式化字符串。这个数组必须已经分配了足够的空间来容纳结果字符串,包括结尾的空字符(\0)。
    • const char *format:一个格式字符串,用于指定后续参数如何被格式化和插入到结果字符串中。这个字符串可以包含文本、格式说明符(如 %d、%s、%f 等),以及转义序列(如 \n、\t 等),同 printf 函数的使用。
    • ...:可变数量的参数,其类型和数量由 format 字符串中的格式说明符决定,同 printf 函数的使用。这些参数将被格式化为字符串,并插入到 str 指向的数组中。
  • 返回值:成功时,sprintf 返回写入的字符数(不包括结尾的空字符)。如果发生错误,则可能返回负值,但这种情况在实际应用中较为罕见。

1.2 功能说明

        sprintf 函数的主要功能是将格式化的数据写入到字符串中,而不是像 printf 那样输出到标准输出设备(通常是屏幕)。这使得 sprintf 非常适用于需要生成格式化字符串并存储在变量中的场景。

        与 printf 相比,sprintf 多了一个参数,即第一个参数是要写入的目标字符串,而后面的参数与 printf 保持一致

        简而言之,sprintf 是将内容写入字符串而不是直接输出

1.3 案例演示

#include <stdio.h>int main()
{char buffer[256]; // 分配一个足够大的缓冲区来存储结果字符串int num1 = 123;float num2 = 456.78f;char ch = 'A';char str[] = "Hello, World!";int result;// 使用 sprintf 将格式化的数据写入 buffer// 注意:返回值是写入的字符数(不包括'\0')result = sprintf(buffer, "Integer: %d, Float: %.2f, Character: %c, String: %s.\n", num1, num2, ch, str);// 输出生成的字符串printf("使用 sprintf 生成的字符串:\n%s", buffer);// 输出 sprintf 的返回值printf("sprintf 的返回值(一般不适用它): %d\n", result);return 0;
}

        输出结果如下所示:

1.4 注意事项

        缓冲区溢出:在使用 sprintf 时,必须确保目标字符串数组 str 有足够的空间来存储生成的字符串,包括末尾的空字符 '\0'。否则,可能会导致缓冲区溢出,这是一个严重的安全问题。

        返回值检查:虽然 sprintf 的返回值(写入的字符数)在大多数情况下可能不是必需的,但在某些情况下,检查返回值可以帮助识别潜在的错误或溢出情况。

        性能考虑:在性能敏感的应用中,频繁使用 sprintf 可能会引入不必要的开销,因为它涉及到字符串的复制和格式化操作。在这种情况下,可能需要考虑使用更高效的字符串处理函数或方法。


2 sscanf

2.1 函数原型

        sscanf 函数是 C 语言标准库中的一个函数,用于从字符串中读取格式化的输入。它的函数原型定义在 <stdio.h> 头文件中。函数原型如下:

#include <stdio.h>  
int sscanf(const char *str, const char *format, ...);
  • 参数:
    • const char *str:指向要扫描的字符串的指针
    • const char *format:一个格式字符串,指定了后续参数应该如何从 str 中被解析这个字符串可以包含文本、格式说明符(如 %d、%s、%f 等)以及空白符(空格、制表符等),用于分隔输入项
    • ...:可变数量的参数,这些参数指向变量的地址sscanf 将根据 format 字符串中的格式说明符,从 str 中解析出数据,并存储到这些变量中
  • 返回值:
    • 成功时,sscanf 返回成功匹配并赋值的输入项的数量
    • 如果遇到输入结束或遇到格式错误前没有匹配任何输入项,则返回 0
    • 如果发生读取错误,则返回 EOF

2.2 功能说明

        sscanf 函数模仿了 scanf 的行为,不过它是从字符串而非标准输入中读取数据,这使其特别适合解析具有特定格式的字符串内容。sscanf 支持多种数据类型,例如整数、浮点数和字符串,通过格式化字符串来指导数据的解析方式

        相较于 scanf,sscanf 额外需要一个参数,即要从中提取数据的字符串,而其余参数则与 scanf 相同。

        简而言之,sscanf 的功能是从字符串中按照指定格式提取数据

2.3 案例演示

#include <stdio.h>int main()
{char input[] = "整数:123,浮点数:456.78,字符串:Hello,World!";int intValue;float floatValue;char stringValue[50];// 尝试从 input 中解析一个整数、一个浮点数和一个字符串// 注意 %s 遇到空白符会停止读取,所以 Hello,World! 中间没有空格int numItemsRead = sscanf(input, "整数:%d,浮点数:%f,字符串:%s", &intValue, &floatValue, stringValue);// 如果使用下面这行代码,sscanf 不会成功读取,因为指定格式不对!!!// int numItemsRead = sscanf(input, "%d %f %s", &intValue, &floatValue, stringValue);// 检查是否成功读取了三个项if (numItemsRead == 3){printf("成功解析:\n");printf("整数: %d\n", intValue);printf("浮点数: %.2f\n", floatValue);printf("字符串: %s\n", stringValue);}else{// 如果未成功读取三个项,则输出错误信息printf("解析失败或格式不匹配,读取的项数: %d\n", numItemsRead);}return 0;
}

        注意:%s 在遇到空白字符时会停止读取,因此上诉代码中 Hello,World! 中间不能有空格。 

        输出结果如下所示:

2.4 注意事项

        缓冲区溢出:与 scanf 类似,sscanf 不会检查目标变量的大小,可能会导致缓冲区溢出。因此,在使用时应当确保目标变量有足够的空间来存储解析的数据

        格式匹配sscanf 严格根据格式字符串进行匹配,包括空格和特殊字符。如果格式字符串与输入字符串不匹配,sscanf 可能无法正确解析数据

        返回值检查:始终检查 sscanf 的返回值,以确保正确读取了预期数量的输入项。如果返回值小于预期,可能表示输入数据不符合预期格式。

        灵活性:虽然 sscanf 提供了从字符串中解析数据的灵活性,但在处理复杂或不规则的输入格式时,可能需要结合使用其他字符串处理函数(如 strtok、strchr 等)来辅助解析。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【软件测试】详解测试中常用的几种测试方法

目录 一、集成测试二、 系统测试三、验收测试四、回归测试 总结 一、集成测试 术语 集成测试是继组件测试之后的又一个层次。集成测试假定交给这个层次的测试对象已经经过了组件测试&#xff0c;并且任何组件内部的缺陷都已经尽可能地被纠正。 集成 开发人员、测试人员和专…

【裸机装机系列】14.kali(ubuntu)-linux装机在分区时采用manual手动形式该怎么做

推荐阅读&#xff1a; 1.kali(ubuntu)-为什么弃用ubuntu&#xff0c;而选择基于debian的kali操作系统 如果在装机的时候选则了manual手动模式&#xff0c;可以根据以下步骤一步步做: 1> 在“partition disks”这个地方选择了manual,也就是手动自己分区的方式 点击"c…

大模型框架 LangChain 介绍

文章目录 langchain介绍安装依赖大模型类别千帆大模型案例常见问题 langchain介绍 是一个开源大语言模型框架&#xff0c;本身不提供大模型算法&#xff0c;只提供对接大模型算法平台的接口&#xff08;模型包裹器&#xff09;&#xff1b;langchain官网v0.2&#xff0c;内部涉…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建斗地主

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建斗地主 华为云端口放行 服务器放行对应端口8078 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证 Dock…

问请问请问2312123213123

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

后台管理系统开箱即用的组件库!!【送源码】

今天给大家推荐几款的后台管理系统开箱即用的组件库&#xff0c;基于ElementUI二次封装&#xff0c;开发必备 Headless UI Headless UI 是一款出色的前端组件库&#xff0c;专为与 Tailwind CSS 集成而设计。一组完全无样式、完全可访问的 UI 组件&#xff0c;可以自由的引入…

使用Docker和cpolar在Linux服务器上搭建DashDot监控面板

使用Docker和cpolar在Linux服务器上搭建DashDot监控面板 前言环境准备安装Docker下载Dashdot镜像 部署DashDot应用本地访问DashDot服务安装cpolar内网穿透固定DashDot公网地址结语 前言 在这个数字化飞速发展的时代&#xff0c;服务器作为支撑各种应用和服务的基础设施&#xf…

Unity进阶之C#知识补充

概述 Unity跨平台的基本原理 了解.Net相关知识 Unity跨平台的基本原理&#xff08;Mono&#xff09; Unity跨平台的基本原理&#xff08;IL2CPP&#xff09; IL2CPP 模式可能存在的问题处理 报错的话就去下载 用到的测试类 C#版本和Unity的关系 C#各版本新功能和语法 C# 1~4 功…

【模型】感知器

感知器是最早的人工神经网络之一&#xff0c;也是现代深度学习的基础之一。 1. 感知器&#xff08;Perceptron&#xff09; 1.1 定义与功能 感知器是一种线性二分类模型&#xff0c;旨在模拟生物神经元的基本功能。它通过对输入特征进行加权求和&#xff0c;并应用激活函数来…

chapter17-多线程基础——(自定义泛型)——day20

580-程序进程线程 581-并发并行 并发和并行也可以同时进行 582-继承Thread创建线程 583-多线程机制 主线程和子线程交替执行 单核&#xff1a;两个线程并发 多核&#xff1a;两个线程并行 主线程结束&#xff0c;不是说进程就结束&#xff0c;进程要等所有线程结束 584-为什…

如何破解西门子博途V19里的密码设置

现在使用TIA Portal V19的工程师是越来越多了&#xff0c;V19有个显著的变化就是访问密码的设置&#xff0c;很多小伙伴忽然发现已经用了很多年的功能&#xff0c;在改动以后都不会设置了&#xff0c;那我们今天就带着您看一下如何才能在 V19 中正确的设置 S7-1500 访问密码。 …

AI论文写作可靠吗?分享5款论文写作助手ai免费网站

AI论文写作的可靠性是一个备受关注的话题。在当前的技术背景下&#xff0c;AI写作工具能够显著提高论文写作的效率和质量&#xff0c;但其可靠性和安全性仍需谨慎评估。 AI论文写作的可靠性 技术能力与限制 AI论文写作的质量很大程度上取决于用户提供的输入指令或素材的质量…

小程序面板开发教程|开发照明 Matter 面板步骤(一)

一. 前置知识 前言 出于对 Matter 标准协议及第三方设备接入的可拓展性等方面考虑&#xff0c;照明 Matter 模型面板的功能点定义会与照明的 DP 模型有所不同&#xff0c;因此本文会着重介绍照明 Matter 面板的功能点定义及与 DP 模型的区别&#xff0c;以方便面板小程序开发…

thinkphp 做分布式服务+读写分离+分库分表+负载均衡(分区)(后续接着写)

thinkphp 做分布式服务读写分离分库分表负载均衡&#xff08;分区&#xff09; 引言 thinkphp* 大道至简负载均衡分布式服务一、读写分离1、读写分离的实现方式2、主从同步的三种模式2-1、异步模式&#xff08;mysql async-mode&#xff09;2-2、半同步模式&#xff08;mysql s…

STM32 map 文件浅析

目录 一、概述二、Section Cross References三、Removing Unused input sections from the image四、Memory Map of the image1、Local Symbols2、全局符号&#xff08;Global Symbols&#xff09; 五、Image Symbol Table六、Image component sizes 一、概述 .map 文件是编译…

力扣 中等 92.反转链表 II

文章目录 题目介绍题解 题目介绍 题解 class Solution {public ListNode reverseBetween(ListNode head, int left, int right) {// 创建一个哑节点&#xff0c;它的 next 指向头节点&#xff0c;方便处理ListNode dummy new ListNode(0, head);// p0 用于指向反转部分的前一个…

(无人车)/舵机电机/基本行进

一、CubeMx配置 &#xff08;1&#xff09;定时器配置 &#xff08;2&#xff09;电机GPIO端口配置 二、连线 &#xff08;1&#xff09;谁给谁供电 &#xff08;2&#xff09;单片机离开电脑供电&#xff0c;直接运行 三、特别注意 &#xff08;1&#xff09;电脑给单片机…

这些985,三战也要上岸!自动化考研择校

这些985学校&#xff0c;位于江浙沪皖地区&#xff0c;三战也要上岸的C9&#xff0c;搭配历年数据&#xff0c;供大家参考~ 目录 ① 上海交通大学 ② 浙江大学 ③ 中国科学技术大学 ④ 南京大学 ① 上海交通大学 复试线招生人数 C9之一&#xff0c;华东五虎&#xff0c;…

Java实现栈

一、栈Stack 1.1 概念 一种特殊的线性表&#xff0c;只允许在固定的一段进行插入和删除元素操作。进行数据的插入和删除操作的一段称为栈顶&#xff0c;另一端称为栈低。栈中的元素遵循后进先出 LIFO(Last In First Out)的原则。 进栈 出栈 举例&#xff1a;在word中&#xf…

同等学力英语考试成绩在哪里查询

同等学力英语考试成绩可以通过中国教育考试网进行查询。 具体查询步骤如下&#xff0c;访问中国教育考试网的官方网站 在网站首页找到“考生服务”板块 点击“成绩查询”输入报考时的姓名、证件号码和验证码&#xff0c;点击“查询”按钮进行成绩查询。