snprintf函數使用總結

一直有接觸snprintf,經久不用知識點又會模糊,記錄下來以便日後查看

【依賴頭文件】

#include<stdio.h>

【函數原型】

int snprintf(char *str, size_t size, const char *format, ...);

【函數參數】

str:目標字符串;size:拷貝字節數(Bytes); format:源字符串; ...格式

【函數功能】

最多從源字符串format中拷貝size字節的內容(含字符串結尾標誌'\0')到目標字符串

The  functions  snprintf() write  at most size bytes (including the terminating null byte ('\0')) to str.

【返回值】

成功返回源串的長度(strlen, 不含'\0')

失敗返回負值

【例子及理解】

由於最多拷貝size個字節到目標字符串,那麼通常目標字符串就設置成size大小就不會有越界問題

下面將目標字符串的長度設置爲size大小,分別實驗源串長度小於,等於,大於size的情況

【情形一】:源串小於目標字符串

實際上源串爲:"123\0",所以只將字符'1','2','3', '\0'拷到了目標串,返回值爲源串的strlen爲3

  1 #include <stdio.h>
  2 #include <strings.h>
  3 #include <string.h>
  4 int main(void)
  5 {   
  6     char a[10] = {'\0'};
  7     int i = 0;
  8     int ret = 0;
  9     memset(a, 1, sizeof(a));
 10     for(i = 0; i < 10; i++)
 11     {   
 12         printf("a[%d] = %d\n",i,a[i]);
 13     }
 14     
 15     ret = snprintf(a, 10, "%d", 123);
 16     printf("ret = %d\n",ret);
 17     
 18     for(i = 0; i < 10; i++)
 19     {
 20         printf("a[%d] = %d\n",i,a[i]);
 21     }
 22     return 0;
 23 }   
root@ubuntu:/shiyan/shiyan265# gcc snprintf.c 
root@ubuntu:/shiyan/shiyan265# ./a.out
a[0] = 1
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
ret = 3
a[0] = 49
a[1] = 50
a[2] = 51
a[3] = 0
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
root@ubuntu:/shiyan/shiyan265# 
【情形二】:源串等於目標字符串

源串爲"abcdefghi\0",正好將源串拷貝到目標字符串中,返回值爲源串的strlen爲9

  1 #include <stdio.h>
  2 #include <strings.h>
  3 #include <string.h>
  4 int main(void)
  5 {   
  6     char a[10] = {'\0'};
  7     int i = 0;
  8     int ret = 0;
  9     memset(a, 1, sizeof(a));
 10     for(i = 0; i < 10; i++)
 11     {   
 12         printf("a[%d] = %d\n",i,a[i]);
 13     }
 14     
 15     //ret = snprintf(a, 10, "%d", 123);
 16     ret = snprintf(a, 10, "%s","abcdefghi");
 17     printf("ret = %d\n",ret);
 18     
 19     for(i = 0; i < 10; i++)
 20     {   
 21         printf("a[%d] = %d\n",i,a[i]);
 22     }
 23     return 0;
root@ubuntu:/shiyan/shiyan265# gcc snprintf.c 
root@ubuntu:/shiyan/shiyan265# ./a.out
a[0] = 1
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
ret = 9
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 0
root@ubuntu:/shiyan/shiyan265# 
【情形三】源串大於目標字符串

源串爲"abcdefghijklmnopq\0",最多從源串拷貝10個字節(含\0)到目標串那麼就是拷貝源串的9個字節內容(abcdefghi)再加一個\0到目標串,目標串的結果和情形二一樣,但是ret返回值變成了17,即strlen("abcdefghijklmnopq")

  1 #include <stdio.h>
  2 #include <strings.h>
  3 #include <string.h>
  4 int main(void)
  5 {
  6     char a[10] = {'\0'};
  7     int i = 0;
  8     int ret = 0;
  9     memset(a, 1, sizeof(a));
 10     for(i = 0; i < 10; i++)
 11     {
 12         printf("a[%d] = %d\n",i,a[i]);
 13     }
 14 
 15     //ret = snprintf(a, 10, "%d", 123);
 16     //ret = snprintf(a, 10, "%s","abcdefghi");
 17     ret = snprintf(a, 10, "%s", "abcdefghijklmnopq");
 18     printf("ret = %d\n",ret);
 19 
 20     for(i = 0; i < 10; i++)
 21     {
 22         printf("a[%d] = %d\n",i,a[i]);
 23     }
 24     return 0;
 25 }
root@ubuntu:/shiyan/shiyan265# gcc snprintf.c 
root@ubuntu:/shiyan/shiyan265# ./a.out
a[0] = 1
a[1] = 1
a[2] = 1
a[3] = 1
a[4] = 1
a[5] = 1
a[6] = 1
a[7] = 1
a[8] = 1
a[9] = 1
ret = 17
a[0] = 97
a[1] = 98
a[2] = 99
a[3] = 100
a[4] = 101
a[5] = 102
a[6] = 103
a[7] = 104
a[8] = 105
a[9] = 0
root@ubuntu:/shiyan/shiyan265# 

更多優質技術文章閱讀,IEEE、萬方文獻及國內外專利下載,請關注微信公衆號IEEE

轉自https://blog.csdn.net/liaojunwu/article/details/80489406

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章