【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

相关文章

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用