三个打印函数printf()/sprintf()/snprintf()区别
先貼上其函數原型
printf( const char *format, ...) ? ?格式化輸出字符串,默認輸出到終端-----stdout
sprintf(char *dest, const char *format,...) ? ??格式化輸出字符串到指定的緩沖區
snprintf(char *dest, size_t size,const char *format,...) ??? 按指定的SIZE格式化輸出字符串到指定的緩沖區
printf()函數在這就不再討論,這里主要討論sprintf()與snprintf()的用法及區別,
結果輸出:
China
Chi
3
分析:
sprintf(a,"%s",p1) ?把p1字符串拷貝到數組a中('\0'也拷貝過去了)。
snprintf(a,3,"%s",p1) ?拷貝P1中前3個字符到數組a中,并在末尾自動添加'\0'。
sprintf屬于I/O庫函數,snprintf函數并不是標準c/c++中規定的函數,但是在許多編譯器中,廠商提供了其實現的版本。在gcc中,該函數名稱就snprintf,而在VC中稱為_snprintf。 如果你在VC中使用snprintf(),會提示此函數未聲明,改成_snprintf()即可。
注意點:
1 ? sprintf是一個不安全函數,src串的長度應該小于dest緩沖區的大小,(如果src串的長度大于或等于dest緩沖區的大小,將會出現內存溢出。)
2 ? snprintf中源串長度應該小于目標dest緩沖區的大小,且size等于目標dest緩沖區的大小。(如果源串長度大于或等于目標dest緩沖區的大小,且size等于目標dest緩沖區的大小,則只會拷貝目標dest緩沖區的大小減1個字符,后加'\0';該情況下,如果size大于目標dest緩沖區的大小則溢出。)
3 ??snprintf ()函數返回值問題, ??如果輸出因為size的限制而被截斷,返回值將是“如果有足夠空間存儲,所應能輸出的字符數(不包括字符串結尾的'\0')”,這個值和size相等或者比size大!也就是說,如果可以寫入的字符串是"0123456789ABCDEF"共16位,但是size限制了是10,這樣 snprintf() 的返回值將會是16?而不是10!
總結
以上是生活随笔為你收集整理的三个打印函数printf()/sprintf()/snprintf()区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 2455Secret Milki
- 下一篇: 初到博客园