格式化字符串函数sprintf

sprintf、snprintf相关函数的主要功能是把格式化的数据写入某个字符串。如最常见的应用是将整数或浮点数转换为字符串。

1、sprintf

将格式化的数据写入字符串,并自动在末尾加上一个空字符‘\0‘.

原型:

int sprintf ( char * str, const char * format, ... );

str: 要写入的字符串缓冲区地址

format: 格式化数据

返回:执行成功时,返回写入到字符个数。

const int MAX_LEN = 5;
char buf[MAX_LEN];
int ret = sprintf(buf,"%dabc",2);
cout << "Write character number" << ret << endl;
cout << buf << endl;

output:

Write character number:4
2abc

注意:使用sprintf时要一定要确保字符串缓冲区足够大,当要写入的数据长度大于缓冲区的容量时,将导致程序异常。

2、snprintf

原型:

int snprintf ( char * s, size_t n, const char * format, ... );

该函数比sprintf多一个size_t n参数,该参数指出了字符串缓冲区的最大容量。如果写入的字符个数 > n - 1,超过的部分将会被截断,即最多写入n-1个字符,并自动添加‘\0‘。该函数返回欲写入的字符串长度。

如下:

const int MAX_LEN = 5;
char buf[MAX_LEN];
int ret = snprintf(buf,MAX_LEN,"%dABCDEF",2);

最终输出结果:2ABC

注:该函数只存在与linux/Unix平台,windows下并没有该函数,但存在类似函数_snprintf等。

以下函数存在于windows平台:

3、sprintf_s

sprintf所谓的安全版本。

原型:

int sprintf_s(
    char *buffer,
    size_t sizeOfBuffer,
    const char *format [,
    argument] ...
   );

buffer: 缓冲区地址

sizeofBuffer: 缓冲的最大容量

format:格式化数据

返回:执行成功时,返回写入的字符个数

msdn上描述如下:

if the buffer is too small for the text being printed then the buffer is set to an empty string and the invalid parameter handler is invoked.

如果写入的数据长度大于 sizeBuffer - 1 ,将会触发错误。

如在vs2010 Debug模式下:

const int MAX_LEN = 5;
char buf[MAX_LEN];
ret = sprintf_s(buf,sizeof(buf),"%dABCD",2);
cout << "Write character number:" << ret << endl;
cout << buf << endl;

会弹出如下错误提示:

4、_snprintf

int _snprintf(
    char *buffer,
    size_t count,
    const char *format [,
    argument] ...
    );

功能与snprintf类似,count表示最多能写入的字符个数, 执行成功时返回写入的字符个数,失败时返回-1;

但要注意,msdn如下描述:

If len < count, len characters are stored in buffer, a null-terminator is appended, and len is returned.

If len = count, len characters are stored in buffer, no null-terminator is appended, and len is returned.

If len > count, count characters are stored in buffer, no null-terminator is appended, and a negative value is returned.

所以使用_snprintf后有可能生成的字符串没有以空字符结尾,所以在使用时一定要检查返回值

一种安全的做法是:

char buff2[MAX_LEN] = {0};
ret = _snprintf(buff2,sizeof(buff2) - 1,"%dCDEF",2);
if (ret < 0)
{
  cout << "Warning:string will be truncated" << endl;
}

5、_snprintf_s

_snprintf的安全版本,所谓的安全就是 _s类函数在字符串超出缓冲区的容量大小时,会调用invalid parameter handler处理程序,即弹出错误提示框。

原型:

int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format [,
   argument] ...
);

sizeofBuffer: 缓冲区的最大容量

count: 最多能写入的字符个数

ret = _snprintf_s(buf,sizeof(buf),sizeof(buf) - 1,"%d1234",2);
cout << "_snprintf_s ret:" << ret << endl;
cout << buf << endl;
时间: 2024-08-07 07:35:47

格式化字符串函数sprintf的相关文章

PHP格式化字符串函数 sprintf()

定义和用法 sprintf() 函数把格式化的字符串写入一个变量中. 语法 sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需.规定插到 format 字符串中第一个 % 符号处的参数. arg2 可选.规定插到 format 字符串中第二个 % 符号处的参数. arg++ 可选.规定插到 format 字符串中第三.四等等 % 符号处的参数. 说明 参数 format 是转换的格式,以百分比符号 ("%") 开始

[转载]Linux C 字符串函数 sprintf()、snprintf() 详解

一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出.这也导致 sprintf 比 printf 有用得多.所以本文着重介绍 sprintf,有时也穿插着用用 pritnf. sprintf是个变参函数,定义如下: int sprintf( char *buffer, const char *format [

PHP 格式化字符串sprintf()

字符串函数 sprintf() 函数把格式化的字符串写入一个变量中 函数说明:sprintf(格式, 要转换的字符串)  参考PHP手册 返回: 格式化后的字符串 举例: 如:保留2位小数, $str = '99.9';echo sprintf('%01.2f', $str);结果为:99.90 echo round($str, 2); 结果为:99.9

C89:论常用的字符串函数

一.简介 二.复制字符串 1.strcpy() 头文件:#include <string.h>和#include <stdio.h> 原型声明:char* strcpy(char* dest,const char* src); strcpy是一种C语言的标准库函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char* //用法 char a[10],b[]="copy"; strcpy(a,b); //将b中的copy到a中 c

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

【python】format函数格式化字符串的用法

来源:http://www.jb51.net/article/63672.htm 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱.语法 它通过{}和:来代替%.“映射”示例 通过位置 ? 1 2 3 4 5 6 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kz

Python 的格式化字符串format函数

阅读mattkang在csdn中的博客<飘逸的python - 增强的格式化字符串format函数>所做笔记 自从python2.6开始,新增了一种格式化字符串的函数str.format(),他通过{}和:来代替%. 1.映射实例 In[1]: '{0},{1}'.format('abc', 18) Out[1]: 'abc,18' In[2]: '{}'.format(18) out[2]: 18 In[3]: '{1},{0},{1}'.format('abc', 123) out[3]:

python_Python中用format函数格式化字符串的用法

这篇文章主要介绍了Python中用format函数格式化字符串的用法,格式化字符串是Python学习当中的基础知识,本文主要针对Python2.7.x版本,需要的朋友可以参考下 自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和:来代替%. “映射”示例 通过位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]:

【Python】格式化字符串和format函数

## 本文基于Python3,可能存在部分内容不适配Python2 1. 最简单的字符串的输出: str1 = 'popma is so cool' print(str1) 输出: popma is so cool 2. '%S'格式化字符串输出: 格式化字符串时,字符串中有格式符,字符串就变成一个模板了: 例如: str2 = '%s is so cool' %'popma' print(str2) 输出还是像上面的一样,可以试试看. 但是如果有多个格式符,如何处理呢?Python用一个tup