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

news2024/11/19 7:40:03

目录

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.coloradmin.cn/o/2162023.html

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

相关文章

9.24作业

将昨天的My_string类中的所有能重载的运算符全部进行重载 、[] 、>、<、、>、<、! 、&#xff08;可以加等一个字符串&#xff0c;也可以加等一个字符&#xff09;、输入输出(<< 、 >>) 代码如下 MyString.h #ifndef MYSTRING_H #define MYSTRING_…

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

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

C++类和对象(中)【下篇】

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: C专栏 目录 赋值运算符重载 运算符重载 赋值运算符重载 日期类实现 运算符重载<和运算符重载 运算符重载进行复用 运算符重载< 运算符重载> 运算符重载> 运算符重载! 获取某年某月的天数…

大模型算法岗常见面试题100道(值得收藏)非常详细收藏我这一篇就够了

大模型应该是目前当之无愧的最有影响力的AI技术&#xff0c;它正在革新各个行业&#xff0c;包括自然语言处理、机器翻译、内容创作和客户服务等等&#xff0c;正在成为未来商业环境的重要组成部分。 截至目前大模型已经超过200个&#xff0c;在大模型纵横的时代&#xff0c;不…

在Markdown中实现内部查询

markdown实现内部查询 在想要跳转到的位置添加 <a idxxx></a> 标签&#xff0c;如下图&#xff1a; 然后按如下格式添加目录 [跳转文字](#id)&#xff1a; 如上操作即可实现markdown内部查询。 具体实现效果如下&#xff1a;

八大排序——万字长文带你剖析八大排序(C语言)

本篇文章主要介绍八大排序的思想和具体实现&#xff0c;也会分析具体的时间复杂度和空间复杂度&#xff0c;提醒一些容易出现的坑和实现一些不同版本的排序&#xff0c;以及这些不同排序之间的效率分析 目录 1.插入排序 1.1直接插入排序 1.1.1 直接插入排序的思想&#xff…

PyTorch模型转ONNX量化模型

你是否发现模型太大&#xff0c;无法部署在你想要的云服务上&#xff1f;或者你是否发现 TensorFlow 和 PyTorch 等框架对于你的云服务来说太臃肿了&#xff1f;ONNX Runtime 可能是你的救星。 如果你的模型在 PyTorch 中&#xff0c;你可以轻松地在 Python 中将其转换为 ONNX…

关于YOLOX的一些优势

YOLOX 是旷视开源的高性能检测器。旷视的研究者将解耦头、数据增强、无锚点以及标签分类等目 标检测领域的优秀进展与 YOLO 进行了巧妙的集成组合&#xff0c;提出了 YOLOX&#xff0c;不仅实现了超越 YOLOv3、 YOLOv4 和 YOLOv5 的 AP&#xff0c;而且取得了极具竞争力的推理速…

FME学习笔记

读取数据 方法一&#xff1a;add reader 通过读模块来进行数据的读取 方法二&#xff1a;FeatureReader Parameters 通过转换器来进行数据的读取 可以通过空间范围进行筛选 在FME中&#xff0c;所有数据处理都要用到的&#xff0c;绝对的重点&#xff1a;转换器&#xff…

深圳某局联想SR850服务器黄灯 不开机维修

深圳 福田区1台Lenovo Thinksystem SR850 四路服务器黄灯问题现场处理。 1&#xff1a;型号&#xff1a;联想SR850 机架式2U服务器 2&#xff1a;故障&#xff1a;能通电&#xff0c;开机按钮快闪&#xff0c;随后叹号警告灯常亮 3&#xff1a;用户自行折腾无果后找到我们tech …

【推文制作】秀米简明教程 1.0

【前言】本文内容主要是针对一些常用的秀米操作进行介绍&#xff0c;并说明一些往年的经验要求。但是&#xff0c;最重要的是&#xff0c;请发挥你的艺术创造力&#xff0c;相信你一定可以做出更好看的推文。 一、秀米页面介绍 在使用秀米之前&#xff0c;我们会有一个通过浏览…

Maya学习笔记:项目设置和快捷键

文章目录 项目设置工程文件夹 快捷键 项目设置 工程文件夹 maya需要一个文件夹存放自己的工程内容 先指定一个文件夹 文件/项目窗口 选择一个文件夹&#xff0c;然后选择创建默认工作区 然后生成文件目录 在项目窗口里&#xff0c;选择要生成的子文件夹&#xff08;保持默认…

【ASE】第二课_溶解效果

今天我们一起来学习ASE插件&#xff0c;希望各位点个关注&#xff0c;一起跟随我的步伐 今天我们来学习溶解效果&#xff0c;通过渐变纹理达到好像燃烧效果的溶解效果 今天我们的效果很简单&#xff0c;但是其中包含没有学习的节点&#xff0c;所以还是要拿出来学习一下 最终…

ESP32异常报错2

出现这种情况 一般是缺少";"分号. 或者缺少, 仔细查找代码.查看是哪儿缺少了这些代码

【2024W35】肖恩技术周刊(第 13 期):肉,好次!

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

docker快速部署zabbix

两台主机 一台作为server 一台作为agent 安装好docker 并保证服务正常运行&#xff0c;镜像正常pull 分析&#xff1a; 部署 Zabbix 容器环境&#xff0c;通常会涉及几个主要组件&#xff1a; MySQL&#xff08;或 MariaDB 数据库&#xff09;、Zabbix Server 和 Zabbix Web I…

c++ 继承 和 组合

目录 一. 继承 1.1 继承的概念 1.2 继承定义 1.3 继承类模板 1.4. 继承中的作用域 二. 派生类&#xff08;子类&#xff09;的默认成员函数 2.1 概念&#xff1a; 2.2 实现⼀个不能被继承的类 2.3 继承与友元 2.4继承与静态成员 三.多继承及其菱形继承问题 3.1继承方…

物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总

物联网实践教程&#xff1a;微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总 前言 之前在学校获得了一个新玩意&#xff1a;ESP-01sWIFI模块&#xff0c;去搜了一下这个小东西很有玩点&#xff0c;远程控制LED啥的&#xff0c;然后我就想…

CUDA编程三、C++和cuda实现矩阵乘法SGEMM

目录 一、矩阵SGEMM 二、SGEMM的各种实现 1、cpu版本的实现 2、GPU并行计算最初始的版本 GPU中数据的移动 3、矩阵分块Shared Memory优化 4、LDS.128 float4* 优化 5、__syncthreads()位置优化 6、blank conflict优化 bank概念 bank conflict bank conflict危害和处…

IO其他流

1. 缓冲流 昨天学习了基本的一些流&#xff0c;作为IO流的入门&#xff0c;今天我们要见识一些更强大的流。比如能够高效读写的缓冲流&#xff0c;能够转换编码的转换流&#xff0c;能够持久化存储对象的序列化流等等。这些功能更为强大的流&#xff0c;都是在基本的流对象基础…