一、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 中。
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