欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c語言snprintf函數(shù)的用法詳解

 更新時間:2023年09月22日 09:41:15   作者:為搬磚記錄  
這篇文章主要給大家介紹了關(guān)于c語言snprintf函數(shù)用法的相關(guān)資料,snprintf()函數(shù)用于將格式化的數(shù)據(jù)寫入字符串,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

snprintf()函數(shù)是一種格式化函數(shù),用于將格式化的字符串存儲到一個字符數(shù)組中,并且有一個參數(shù)用來限制輸出的最大字符數(shù)。

語法:

int snprintf ( char * s, size_t n, const char * format, … );

參數(shù):

  • s:指向要存儲字符串(由format參數(shù)格式化)的字符數(shù)組。
  • n:指定存儲字符串的最大字符數(shù)(不包括NULL結(jié)尾)。
  • format:是格式字符串,用于格式化輸出字符串。

返回值:

  • 該函數(shù)返回實際寫入的字符數(shù)(不包括NULL結(jié)尾)。

snprintf()函數(shù)的最大特點是它可以防止由于格式化字符串太長而導(dǎo)致的緩沖區(qū)溢出,它可以自動截斷字符串,以確保不會超出緩沖區(qū)限制。

實例:

例如,下面的示例使用snprintf()函數(shù)將字符串“Hello world”存儲到一個大小為10個字符的字符數(shù)組中:

#include <stdio.h>
int main( )
{
   char str[10];
   snprintf(str, 10, "Hello world");
   printf("%s\n", str);
   return 0;
}

輸出:

Hello wor

這里面包含一個’\0’

特別注意

1. 無論何時一定會在字符串末尾添加'\0' 字符串結(jié)束符。

  • 當(dāng)字符串長度小于size時,會直接在字符串的末尾添加'\0';
  • 當(dāng)字符串長度等于size時,會取前size-1個字符,并在末尾添加‘\0’(即:加上'\0'后,一共size個字符);
  • 當(dāng)字符串長度大于size時,只取前size-1個字符,并在末尾添加'\0'(即:加上'\0'一共size個字符);

綜上:snprintf不僅一定會自動在字符串末尾添加'\0',而且一定會尊重指定長度size的大小,不會超過該長度(算上自動在末尾增加的'\0')。所以從這一點來講,使用snprintf是相對比較安全的,不用擔(dān)心會出現(xiàn)overflow的情況。 

NOTE:這一點上,snprintf與strncpy是有區(qū)別的。strncpy雖然也會指定目的內(nèi)存的大小,但是當(dāng)源字符串長度大于指定的內(nèi)存大小時,strncpy雖然在達(dá)到指定大小后會停止copy,但是并不會在末尾自動添加'\0'。這樣,在訪問字符串時,有可能出現(xiàn)overflow的情況,因為末尾沒有字符串結(jié)束符'\0'。

思考:

(1)當(dāng)目的內(nèi)存實際長度為N1,但是在使用snprintf時指定的實際size(第二個參數(shù))為N2, 且N2<N1,可能會出現(xiàn)什么情況?

(2)如果N2>N1,又可能出現(xiàn)什么情況?

2. 特別小心返回值。

  • 當(dāng)出現(xiàn)錯誤時,會返回負(fù)值;
  • 當(dāng)字符串長度小于size時,返回打印到目的內(nèi)存的實際字符串長度(不包括'\0');
  • 當(dāng)字符串長度大于等于size時,盡管字符串會被截斷(只有size-1個字符串被打印到目的內(nèi)存),但是返回值卻會返回源字符串的實際長度(即假設(shè)目的內(nèi)存無限大,總是能寫下源字符串)。

綜上:snprintf的返回值可能大于或等于指定的size,這時候說明目的內(nèi)存不夠大,源字符串被截斷,需要小心處理,這是否是期望發(fā)生的情形。

NOTE:有一些寫法會利用snprintf的這個特點來確定合適的目的內(nèi)存大小,例如:

const char *fmt = "sqrt(2) = %f";
char * buf;
int sz = snprintf(NULL, 0, fmt, sqrt(2));
buf = (char *)malloc(sz+1);     // +1 for append '\0'
snprintf(buf, sz+1, fmt, sqrt(2));

總結(jié)

到此這篇關(guān)于c語言snprintf函數(shù)用法的文章就介紹到這了,更多相關(guān)c語言snprintf函數(shù)用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++最優(yōu)二叉樹哈夫曼樹算法解析

    C++最優(yōu)二叉樹哈夫曼樹算法解析

    這篇文章主要介紹了C++最優(yōu)二叉樹哈夫曼樹算法解析,哈夫曼樹又稱最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹,所謂樹的帶權(quán)路徑長度,就是樹中所有的葉結(jié)點的權(quán)值乘上其到根結(jié)點的路徑長度,需要的朋友可以參考下
    2023-08-08
  • 詳解C語言中的#define宏定義命令用法

    詳解C語言中的#define宏定義命令用法

    有的時候為了程序的通用性,可以使用#define預(yù)處理宏定義命令,它的具體作用就是方便程序段的定義和修改,下面就來詳解C語言中的#define宏定義命令用法.
    2016-05-05
  • C語言實現(xiàn)哈夫曼樹

    C語言實現(xiàn)哈夫曼樹

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)哈夫曼樹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

    Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用

    這篇文章主要為大家介紹了Qt動態(tài)庫調(diào)用宿主進(jìn)程中的對象方法純虛函數(shù)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序簡明教程

    VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序簡明教程

    這篇文章主要介紹了VC中使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的方法,結(jié)合實例形式詳細(xì)講述了ADO的原理及VC使用ADO開發(fā)數(shù)據(jù)庫應(yīng)用程序的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C++中spdlog的簡單使用示例

    C++中spdlog的簡單使用示例

    spdlog是一個開源、跨平臺、無依賴、只有頭文件的C++11日志庫,所以這篇文章主要來和大家介紹一下一個簡單的spdlog使用示例,感興趣的小伙伴可以了解一下
    2023-08-08
  • C語言、C++中的union用法總結(jié)

    C語言、C++中的union用法總結(jié)

    這篇文章主要介紹了C語言、C++中的union用法總結(jié),本文講解了什么是union、C中使用union、當(dāng)union遇到對象等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 詳解C語言中const關(guān)鍵字的用法

    詳解C語言中const關(guān)鍵字的用法

    這篇文章主要對C語言中const關(guān)鍵字的用法進(jìn)行了詳細(xì)的分析介紹,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-08-08
  • c++??復(fù)制消除問題解決示例詳析

    c++??復(fù)制消除問題解決示例詳析

    這篇文章主要為大家介紹了c++??復(fù)制消除問題解決示例詳析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • C++實現(xiàn)浮點數(shù)精確加法

    C++實現(xiàn)浮點數(shù)精確加法

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)浮點數(shù)精確加法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05

最新評論