snprintf()和sprintf()学习

一、参数及头文件(Description)

snprintf()函数用于将格式化的数据写入字符串,其原型为:
int snprintf(char *str, int n, char * format [,  argument,  ... ] );

头文件位于:#include <stdio.h>

  Params:char *str, size_t size, const char *format [,  argument,  ... ]

其中str表示存放字符串的地址,size表示要写入的字符的最大数目,包括字符串结束符‘/0’.format为格式化字符串,与printf()函数相同,argument为变量,snprintf()和printf()一样,是不定参数的函数。


二、返回值  ( Return value)

if successful, these functions return the number of characters printed (excluding the null byte used to end output to strings)。

即如果成功,返回打印字符串的个数,不包含结束字符串打印的'/0'。

函数snprintf() 和vsnprintf() 不能写入超过第二个参数定义的size bytes(包括字符串结束符'\0')到str,如果输出因为这个限制被截断,得到的返回值是打印到str的字符串个数(不包括字符串结束符'\0')。如果有足够buffer空间可用,这个字符串会一直打印显示,直到最后字符串最后。

如果遇到输出错误,会返回一个负值(a negative value)。


三、关联func

int printf(const char *format,  ...);
int fprintf(FILE *
stream,  const char *format,  ...);
int sprintf(char *
str,  const char *format,  ...);
int snprintf(char *
str,  size_t size,  const char *format,  ...);


//头文件位于stdarg.h中

int vprintf(const char *format,  va_list  ap);
int vfprintf(FILE *
stream,  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);

这是一系列带V开头的打印函数

printf()等(打印函数组)根据下面描述的格式将数据打印输出。函数printf()和vprintf()将输出数据打印到标准输出流(stdout stream)中; fprintf() 和 vfprintf() 输出数据打印到显示的输出流中( the given output stream);sprintf()、snprintf()、 vsprintf() 和 vsnprintf()输出数据打印到字符串str中,str是它们的参数。

函数snprintf() 和vsnprintf() 写入最多字符(包含字符串结束符'\0')到str中;

函数vprintf()、vfprintf()、vsprintf()、 vsnprintf()比各自对应的 vprintf()、vfprintf()、vsprintf()、 vsnprintf() 比较,只是用一个va_list 调用参数替换掉原来的变量参数,其他地方可以理解是基本相同的。这些函数不能调用宏va_end,因为如果它们回调了宏va_arg,参数变量ap的值在调用后就不确定了。

这些函数按照指定的格式化字符串打印输出,这些指定的格式化字符串定义了参数中最后面的变量按照何种字符格式被转换输出。

C99 和POSIX.1-2001标准都指出:如果函数sprintf()、snprintf()、vsprintf()或者vsnprintf()的调用将会引起在有重叠部分的对象之间复制时 ,调用结果是不确定的(例如,一个目标字符串数组和一个支持的输入参数引用相同的buffer)。

C99 and POSIX.1-2001specify that the results are undefined if a call to sprintf(), snprintf(), vsprintf(), or vsnprintf() would cause copying to take place between objects that overlap (e.g., if the target string array and one of the supplied input arguments refer to the same buffer).



四、示例:


        1)//snprinft_test.c

#include <stdio.h>


int main(void)
{
char str[10] = {0};


int ret = snprintf(str,4,"%s","abcdefghijk");
printf("Ret =%d,Str=%s\n",ret,str);


return 0;
}

输出结果:


2) #define STR_VIDEO_QUALITY_SFINE     "sfine"

snprintf(Buf, BufSize, "%s", STR_VIDEO_QUALITY_SFINE);


3)

char vendor_name[20] = {0};

sprintf(vendor_name,"%s","O-Film");

printf("vendor_name is %s.",vendor_name[);



参考文档:

1、http://linux.die.net/man/3/snprintf

2、http://joequery.me/code/snprintf-c/


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值