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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM