snprintf 函式使用方法

2021-10-07 13:32:43 字數 4596 閱讀 5808

眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.

自從snprintf代替了sprintf,相信大家對snprintf的使用都不會少,函式定義如下:

int snprintf(char*str, size_t size,constchar*format, ...);
函式說明:最多從源串中拷貝size-1個字元到目標串中,然後再在後面加乙個 \0 。所以如果目標串的大小為size的話,將不會溢位。

函式返回值:若成功則返回欲寫入的字串長度,若出錯則返回負值。

result1(推薦的用法)

#include #include int main()

; snprintf(str, sizeof(str), "0123456789012345678");

printf("str=%s\r\n", str);

return 0;

}

root] /root/lindatest

$ ./test

str=012345678

result2:(不推薦使用)

#include #include int main()

; snprintf(str, 18, "0123456789012345678");

printf("str=%s\r\n", str);

return 0;

}

root] /root/lindatest

$ ./test

str=01234567890123456

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

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

#include #include #include int main(void)

; int i = 0;

int ret = 0;

memset(a, 0, sizeof(a));

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

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

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

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

return 0;

}

a[0] = 0

a[1] = 0

a[2] = 0

a[3] = 0

a[4] = 0

a[5] = 0

a[6] = 0

a[7] = 0

a[8] = 0

a[9] = 0

ret = 3

a[0] = 49

a[1] = 50

a[2] = 51

a[3] = 0

a[4] = 0

a[5] = 0

a[6] = 0

a[7] = 0

a[8] = 0

a[9] = 0

--------------------------------

process exited after 0.1323 seconds with return value 0

請按任意鍵繼續. . .

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

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

#include #include #include int main(void)

; int i = 0;

int ret = 0;

memset(a, 0, sizeof(a));

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

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

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

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

return 0;

}

a[0] = 0

a[1] = 0

a[2] = 0

a[3] = 0

a[4] = 0

a[5] = 0

a[6] = 0

a[7] = 0

a[8] = 0

a[9] = 0

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

--------------------------------

process exited after 0.3018 seconds with return value 0

請按任意鍵繼續. . .

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

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

#include #include #include int main(void)

; int i = 0;

int ret = 0;

memset(a, 0, sizeof(a));

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

ret = snprintf(a, 10, "%s", "abcdefghijklmnopq");

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

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

return 0;

}

在vc中編譯如下程式:

a[0] = 0

a[1] = 0

a[2] = 0

a[3] = 0

a[4] = 0

a[5] = 0

a[6] = 0

a[7] = 0

a[8] = 0

a[9] = 0

ret = -1

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] = 106

--------------------------------

process exited after 0.02983 seconds with return value 0

請按任意鍵繼續. . .

在gcc中編譯如下程式:

a[0] = 0

a[1] = 0

a[2] = 0

a[3] = 0

a[4] = 0

a[5] = 0

a[6] = 0

a[7] = 0

a[8] = 0

a[9] = 0

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] = 106

--------------------------------

process exited after 0.02983 seconds with return value 0

請按任意鍵繼續. . .

snprintf列印16進製制

snprintf(temp, sizeof temp, "%x", usart_rx_buf[0]);
%02x     格式控制: 以十六進製制輸出,2為指定的輸出欄位的寬度.如果位數小於2,則左端補0

如果usart_rx_buf[0]裡的資料是0xf8,

snprintf(temp, sizeof temp, "%x", usart_rx_buf[0]);

temp[0]的值為0x46;

temp[1]的值為0x38;

參考:

參考:參考:

snprintf 函式使用方法

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

snprintf 函式使用方法

眾所周知,sprintf不能檢查目標字串的長度,可能造成眾多安全問題,所以都會推薦使用snprintf.自從snprintf代替了sprintf,相信大家對snprintf的使用都不會少,函式定義如下 intsnprintf char str,size t size,const char forma...

snprintf 函式使用方法

函式定義如下 int snprintf char str,size t size,constchar format,函式功能 先將可變引數 按照format的格式格式化為字串,然後再將其拷貝至dest str中。注意事項 如果格式化後的字串長度小於size,則將字串全部拷貝至dest str中,並在...