【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中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL