snprintf函式使用總結

2021-10-03 10:55:28 字數 4558 閱讀 5735

【依賴標頭檔案】

#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

4int

main

(void)5

;7int i =0;

8int ret =0;

9memset

(a,1

,sizeof

(a));10

for(i =

0; i <

10; i++)11

1415 ret =

snprintf

(a,10

,"%d"

,123);

16printf

("ret = %d\n"

,ret);17

18for

(i =

0; i <

10; i++)19

22return0;

23}

root@ubuntu:

/shiyan/shiyan265# gcc snprintf.c

root@ubuntu:

/shiyan/shiyan265# .

/a.out

a[0]

=1a[1

]=1a[

2]=1

a[3]=

1a[4]

=1a[5

]=1a[

6]=1

a[7]=

1a[8]

=1a[9

]=1ret =3a[

0]=49

a[1]=

50a[2]

=51a[3

]=0a[

4]=1

a[5]=

1a[6]

=1a[7

]=1a[

8]=1

a[9]=

1root@ubuntu

:/shiyan/shiyan265#

【情形二】:源串等於目標字串

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

1 #include 

2 #include

3 #include

4int

main

(void)5

;7int i =0;

8int ret =0;

9memset

(a,1

,sizeof

(a));10

for(i =

0; i <

10; i++)11

1415

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

16 ret =

snprintf

(a,10

,"%s"

,"abcdefghi");

17printf

("ret = %d\n"

,ret);18

19for

(i =

0; i <

10; i++)20

23return

0;

root@ubuntu:/shiyan/shiyan265# gcc snprintf.c 

root@ubuntu:/shiyan/shiyan265# ./a.out

a[0]

=1a[1

]=1a[

2]=1

a[3]=

1a[4]

=1a[5

]=1a[

6]=1

a[7]=

1a[8]

=1a[9

]=1ret =9a[

0]=97

a[1]=

98a[2]

=99a[3

]=100a[4]

=101a[5

]=102a[6]

=103a[7

]=104a[8]

=105a[9

]=0root@ubuntu

:/shiyan/shiyan265#

【情形三】源串大於目標字串

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

1 #include 

2 #include

3 #include

4int

main

(void)5

;7int i =0;

8int ret =0;

9memset

(a,1

,sizeof

(a));10

for(i =

0; i <

10; i++)11

1415

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

16//ret = snprintf(a, 10, "%s","abcdefghi");

17 ret =

snprintf

(a,10

,"%s"

,"abcdefghijklmnopq");

18printf

("ret = %d\n"

,ret);19

20for

(i =

0; i <

10; i++)21

24return0;

25}

root@ubuntu:/shiyan/shiyan265# gcc snprintf.c 

root@ubuntu:/shiyan/shiyan265# ./a.out

a[0]

=1a[1

]=1a[

2]=1

a[3]=

1a[4]

=1a[5

]=1a[

6]=1

a[7]=

1a[8]

=1a[9

]=1ret =

17a[0]

=97a[1

]=98a[2]

=99a[3

]=100a[4]

=101a[5

]=102a[6]

=103a[7

]=104a[8]

=105a[9

]=0root@ubuntu

:/shiyan/shiyan265#

函式原型:int snprintf(char* dest_str,size_t size,const char* format,…);

所需標頭檔案:#include

函式功能:先將可變引數 「…」 按照format的格式格式化為字串,然後再將其拷貝至dest_str中。

注意事項:如果格式化後的字串長度小於size,則將字串全部拷貝至dest_str中,並在字串結尾處加上『\0』;

如果格式化後的字串長度大於或等於size,則將字串的(size-1)拷貝至dest_str中,然後在字串結尾處加上』\0』.

函式返回值是 格式化字串的長度。

例項:

#include 

#include

#include

intmain

(void

)

執行結果

字串:linux c程式設計

長度是:

15今天是:

2023年9月8日

參考1:

參考2:

snprintf函式使用總結

一直有接觸snprintf,經久不用知識點又會模糊,記錄下來以便日後檢視 依賴標頭檔案 include 函式原型 int snprintf char str,size t size,const char format,函式引數 str 目標字串 size 拷貝位元組數 bytes format 源字...

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。所以如果目標串的大...