【ARM 嵌入式 C 字符串系列 23.3 -- snprintf 函数详细介绍并举例】

本文主要是介绍【ARM 嵌入式 C 字符串系列 23.3 -- snprintf 函数详细介绍并举例】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


请阅读【嵌入式开发学习必备专栏 】


文章目录

      • snprintf 函数简介
      • 函数原型
      • 返回值
      • 示例
      • 总结

snprintf 函数简介

snprintf 函数是 C 语言中的一个标准库函数,用于将格式化的数据写入字符串。它是 printf 函数族的一部分,与 sprintf 类似,但提供了输出缓冲的大小限制,从而增加了程序的安全性,防止了缓冲区溢出的风险。

PRINTF(3)                                                             Linux Programmer's Manual                                                             PRINTF(3)NAMEprintf, fprintf, dprintf, sprintf, snprintf, vprintf, vfprintf, vdprintf, vsprintf, vsnprintf - formatted output conversionSYNOPSIS#include <stdio.h>int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);int dprintf(int fd, const char *format, ...);int sprintf(char *str, const char *format, ...);int snprintf(char *str, size_t size, const char *format, ...);#include <stdarg.h>int vprintf(const char *format, va_list ap);int vfprintf(FILE *stream, const char *format, va_list ap);int vdprintf(int fd, const char *format, va_list ap);int vsprintf(char *str, const char *format, va_list ap);int vsnprintf(char *str, size_t size, const char *format, va_list ap);Feature Test Macro Requirements for glibc (see feature_test_macros(7)):snprintf(), vsnprintf():_XOPEN_SOURCE >= 500 || _ISOC99_SOURCE |||| /* Glibc versions <= 2.19: */ _BSD_SOURCEdprintf(), vdprintf():Since glibc 2.10:_POSIX_C_SOURCE >= 200809LBefore glibc 2.10:_GNU_SOURCE

函数原型

int snprintf(char *str, size_t size, const char *format, ...);
  • str: 指向用于存储结果字符串的缓冲区的指针。
  • size: 缓冲区str的大小(包括最后的空终止字符)。
  • format: 格式字符串,控制后续参数如何格式化并写入str
  • ...: 零个或多个要写入str的其他参数,数量和类型由format决定。

返回值

snprintf 函数返回预期的字符串长度,不包括最后的空字符。如果返回值大于或等于size,则表示缓冲区太小,无法容纳全部输出。请注意,即使输出被截断,snprintf 也会保证str是空终止的(只要size大于0)。

示例

以下示例展示了如何使用 snprintf 来安全地格式化字符串,并处理可能的截断。

#include <stdio.h>int main(void) 
{char buffer[50];int year = 2023;char month[] = "October";int day = 1;// 尝试将日期格式化到缓冲区int needed = snprintf(buffer, sizeof(buffer), "Today is %s %d, %d", month, day, year);// 检查是否有足够的空间if (needed >= sizeof(buffer)) {printf("Buffer too small, needed %d bytes.\n", needed);} else {printf("%s\n", buffer);}return 0;
}

这个例子尝试将一个日期格式化为字符串并存储在缓冲区中。如果缓冲区大小不足以容纳完整的输出,则snprintf会返回所需的字符数(不包括最后的空字符)。这允许我们检测并处理潜在的缓冲区溢出情况。

总结

snprintf是一个非常实用的函数,它通过限制写入缓冲区的字符数来防止缓冲区溢出。在处理格式化字符串时,优先使用snprintf而不是sprintf,以提高程序的安全性。

这篇关于【ARM 嵌入式 C 字符串系列 23.3 -- snprintf 函数详细介绍并举例】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/873990

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python与MySQL实现数据库实时同步的详细步骤

《Python与MySQL实现数据库实时同步的详细步骤》在日常开发中,数据同步是一项常见的需求,本篇文章将使用Python和MySQL来实现数据库实时同步,我们将围绕数据变更捕获、数据处理和数据写入这... 目录前言摘要概述:数据同步方案1. 基本思路2. mysql Binlog 简介实现步骤与代码示例1

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam