snprintf函式使用總結

2021-09-26 02:38:29 字數 3852 閱讀 8860

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

【依賴標頭檔案】

#include

【函式原型】

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

2 #include

3 #include

4 int main(void)

5 ;7     int i = 0;

8     int ret = 0;

9     memset(a, 1, sizeof(a));

10     for(i = 0; i < 10; i++)

11     

14     

15     ret = snprintf(a, 10, "%d", 123);

16     printf("ret = %d\n",ret);

17     

18     for(i = 0; i < 10; i++)

19     

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

2 #include

3 #include

4 int main(void)

5 ;7     int i = 0;

8     int ret = 0;

9     memset(a, 1, sizeof(a));

10     for(i = 0; i < 10; i++)

11    

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    

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

2 #include

3 #include

4 int main(void)

5 ;7     int i = 0;

8     int ret = 0;

9     memset(a, 1, sizeof(a));

10     for(i = 0; i < 10; i++)

11    

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    

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# 

**

snprintf函式使用總結

依賴標頭檔案 include 函式原型 int snprintf char str,size t size,const char format,函式引數 str 目標字串 size 拷貝位元組數 bytes format 源字串 格式 函式功能 最多從源字串format中拷貝size位元組的內容 含...

snprintf函式的使用

函式原型 int snprintf char str,size t size,const char format,功能 將可變個引數 按照format格式化成字串,然後將其複製到str中 1 如果格式化後的字串長度 size,則將此字串全部複製到str中,並給其後新增乙個字串結束符 0 2 如果格式...

snprintf 函式使用方法

眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.intsnprintf char str,size t size,constchar format,函式說明 最多從源串中拷貝size 1個字元到目標串中,然後再在後面加乙個0。所以如果目標串的大...