【依賴標頭檔案】
#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。所以如果目標串的大...