C语言 snprintf函数

一、sprintf()

头文件:#include <stdio.h>
作用:将一个格式化的字符串输出到一个目的字符串中,
原型:int sprintf(char *str, char * format [, argument, ...]);
参数:str为要写入的字符串;format为格式化字符串,与printf()函数相同;argument为变量。
返回值:成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中(但在测试中返回的是实际传入参数的长度)

char buf[5];
int ret = sprintf(buf, "%d", 1234);
printf("%d,%s", ret, buf);  //output 4,1234

char buf[5];
int ret = sprintf(buf, "%d", 12345);
printf("%d,%s", ret, buf);  //output 5,12345,then terminated

二、snprintf()
作用:将格式化的数据写入字符串;将可变个参数按照format格式化成字符串;
原型:int snprintf(char *str, int n, char * format [, argument, ...]);
参数:str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断(避免缓冲区溢出);format为格式化字符串,与printf()函数相同;argument为变量。
返回值:成功则返回参数str 字符串长度,失败时VC返回-1,GCC返回实际传入参数的长度,错误原因存于errno 中。

将可变个参数(...)按照format格式化成字符串,然后将其复制到str中。
(1) 如果格式化后的字符串长度 < n,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
(2) 如果格式化后的字符串长度 >= n,则只将其中的(n-1)个字符复制到str中,并给其后添加一个字符串结束符('\0'),返回值为欲写入的字符串长度。
char buf[5];
int ret = snprintf(buf, 5, "%d", 1234);
printf("%d,%s", ret, buf);  //output 4,1234


char buf[5];
int ret = snprintf(buf, 5, "%d", 123456);
printf("%d,%s", ret, buf);  //output 6,1234

注意:在GCC中,函数名称为snprintf(),而在VC中称为_snprintf()。二者区别在于参数n
GCC中的参数n表示向str中写入n个字符,包括'\0'字符,并且返回实际的字符串长度。
VC中的参数n表示会向str中写入n个字符,不包括'\0'字符,并且不会在字符串末尾添加'\0'符。当字符串长度超过参数n时,函数返回-1,以表示可能导致错误。

3、snprintf与vsnprintf

#include <stdio.h>
int printf(const char* format, ...); //输出到标准输出
int fprintf(FILE* stream, const char* format, ...); //输出到文件
int sprintf(char* buffer, const char* format, ...);   //输出到字符串
int snprintf(char* buffer, int n, 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 vsprintf(char* buffer, const char* format, va_list ap);   //输出到字符串
int vsnprintf(char* buffer, int n, const char* format, va_list ap);   //输出到字符串

简单的使用vsnprintf函数实现snprintf

#include <stdio.h>
#include <stdarg.h>

int my_snprintf(char* buffer, int size, const char* format, ...) {
  va_list ap;
  va_start(ap, format);
  int ret = vsnprintf(buffer, size, format, ap);
  va_end(ap);
  return ret;
}

举例:

#include <stdio.h>
 
int main () {
  char a[16];
  size_t i;
 
  i = snprintf(a, 13, "%012d", 12345);  // 第 1 种情况
  printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 000000012345
 
  i = snprintf(a, 9, "%012d", 12345);   // 第 2 种情况
  printf("i = %lu, a = %s\n", i, a);    // 输出:i = 12, a = 00000001
 
  return 0;
}

 

注意:

strcpy() sprintf() strcat() 存在安全隐患, 其对应的安全版为:

strncpy() snprintf() strncat()

 

参考:

https://blog.csdn.net/Lee_01/article/details/83925934

https://blog.csdn.net/u014630623/article/details/88929565

posted on 2020-05-15 10:51  裸睡的猪  阅读(6470)  评论(0编辑  收藏  举报