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