首页 > 其他分享 >snprintf 函数用法详解

snprintf 函数用法详解

时间:2022-12-20 10:11:46浏览次数:39  
标签:snprintf 用法 char 详解 字符串 sizeof buf size

snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)
两点注意:
(1) 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
使用snprintf函数时要注意上面两点,这是我看过无数使用这个函数的程序员绝大部分都存在的两点隐患:

void test_snprintf()
{
    char buf1[8];
    int n=snprintf(buf1,5,"abcdefghijk");
    printf("n=%d buf1=%s\n",n,buf1);//n=11 buf1=abcd

    char buf[8] = "";
    char src[30] = "hello world!";
    int len = snprintf(buf, sizeof(buf), "%s", src);

    printf("return len=%d;buf=%s, strlen=%d;sizeof=%d\n",len, buf, strlen(buf),sizeof(buf));//return len=12;buf=hello w, strlen=7;sizeof=8
}

总结:
1.snprintf会自动在格式化后的字符串尾添加\0,结尾符是包含在size长度内部的。
2.snprintf会在结尾加上\0,不管buf空间够不够用,所以不必担心缓冲区溢出。
3.snprintf的返回值n,当调用失败时,n为负数,当调用成功时,n为格式化的字符串的总长度(不包括\0),当然这个字符串有可能被截断,因为buf的长度不够放下整个字符串。

可以判断输出:
if(n<0):snprintf出错了
if( n >0 && n < sizeof(buf) ) : snprintf成功,并且格式了完成的字符串。
if ( n >= sizeof(buf) ) : snprintf成功,但要格式化的字符串被截断了。

标签:snprintf,用法,char,详解,字符串,sizeof,buf,size
From: https://www.cnblogs.com/sggggr/p/16993611.html

相关文章

  • 《吐血整理》高级系列教程-吃透Fiddler抓包教程(37)-掌握Fiddler中Fiddler Script用法
    1.简介Fiddler是一款强大的HTTP抓包工具,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据.使用Fiddler无论对开发还是测试来说,......
  • 一文速学-玩转MySQL获取时间、格式转换各类操作方法详解
    本文正在参加「技术专题19期漫谈数据库技术」活动前言时间在数据库中经常作为时间索引,在数据入库和出库以及更新的时候都需要变化。在一些指标计算或者是提取某段时间的......
  • flex布局详解
    我正在参加码上掘金体验活动,详情:show出你的创意代码块写在前面,由于文章里面有很多flex布局效果图占据了很大的篇幅,导致篇幅很长。以下内容主要分为四个部分:常见概念f......
  • 详解sql优化的15个小技巧,及使用force index来强制sql走索引
    原文链接:https://www.bilibili.com/video/BV1WL4y1H7jV/?spm_id_from=333.337.search-card.all.click&vd_source=23aa9dcacf4c7ddaed4172b5ffd451ab1、避免使用select*2......
  • 详解逻辑回归与评分卡-用逻辑回归制作评分卡-分箱【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili分训练集和测试集fromsklearn.model_selectionimporttrain_te......
  • docker详解
    今日内容概要docker入门docker组件介绍docker安装启动docker镜像操作docker容器操作今日内容详细docker入门#什么是虚拟化在计算机中,虚拟化(英语:Virtualiza......
  • WaitForSingleObject与WaitForMultipleObjects用法详解
    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用WindowsAPI函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待......
  • 4. gcc预处理汇编编译链接的用法
    普通的C程序如果要成为可执行的程序,需要经过四个步骤1.预处理2.汇编3.编译4.链接使用方法一:命令行使用gcc产生可执行文件gcc执行1-2-3命令:gcc.c文件名(可多个)-o......
  • C#中seale关键字用法总结
    1.密封类与密封方法      如果所有的类都可以被继承,那么很容易导致继承的滥用,进而使类的层次结构体系变得十分复杂,这样使得开发人员对类的理解和使用变得十分困难,为......
  • MessageBox.Show()用法总结
    名称(具有相同的返回值 DialogResult)说明​​MessageBox.Show(String)​​显示具有指定文本的消息框。由.NETCompactFramework支持。​​MessageBox.Show(IWin32Wind......