眾所周知,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中,並在...