最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

語(yǔ)法:

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

參數(shù):

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

返回值:

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

snprintf()函數(shù)的最大特點(diǎn)是它可以防止由于格式化字符串太長(zhǎng)而導(dǎo)致的緩沖區(qū)溢出,它可以自動(dòng)截?cái)嘧址?,以確保不會(huì)超出緩沖區(qū)限制。

實(shí)例:

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

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

輸出:

Hello wor

這里面包含一個(gè)’\0’

特別注意

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

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

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

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

思考:

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

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

2. 特別小心返回值。

  • 當(dāng)出現(xiàn)錯(cuò)誤時(shí),會(huì)返回負(fù)值;
  • 當(dāng)字符串長(zhǎng)度小于size時(shí),返回打印到目的內(nèi)存的實(shí)際字符串長(zhǎng)度(不包括'\0');
  • 當(dāng)字符串長(zhǎng)度大于等于size時(shí),盡管字符串會(huì)被截?cái)啵ㄖ挥衧ize-1個(gè)字符串被打印到目的內(nèi)存),但是返回值卻會(huì)返回源字符串的實(shí)際長(zhǎng)度(即假設(shè)目的內(nèi)存無(wú)限大,總是能寫下源字符串)。

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

NOTE:有一些寫法會(huì)利用snprintf的這個(gè)特點(diǎn)來(lái)確定合適的目的內(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語(yǔ)言snprintf函數(shù)用法的文章就介紹到這了,更多相關(guān)c語(yǔ)言snprintf函數(shù)用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)醫(yī)院管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)醫(yī)院管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)醫(yī)院管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++編程中的函數(shù)指針初步解析

    C++編程中的函數(shù)指針初步解析

    這篇文章主要介紹了C++編程中的函數(shù)指針初步解析,函數(shù)指針在C語(yǔ)言和C++學(xué)習(xí)中都是非常重要的知識(shí),需要的朋友可以參考下
    2016-04-04
  • C語(yǔ)言中獲取和改變目錄的相關(guān)函數(shù)總結(jié)

    C語(yǔ)言中獲取和改變目錄的相關(guān)函數(shù)總結(jié)

    這篇文章主要介紹了C語(yǔ)言中獲取和改變目錄的相關(guān)函數(shù)總結(jié),包括getcwd()函數(shù)和chdir()函數(shù)以及chroot()函數(shù)的使用方法,需要的朋友可以參考下
    2015-09-09
  • C語(yǔ)言中的數(shù)組指針數(shù)組與函數(shù)指針數(shù)組

    C語(yǔ)言中的數(shù)組指針數(shù)組與函數(shù)指針數(shù)組

    數(shù)組指針數(shù)組和函數(shù)指針數(shù)組是兩個(gè)強(qiáng)大但容易混淆的概念,下面就來(lái)介紹一下C語(yǔ)言中的數(shù)組指針數(shù)組與函數(shù)指針數(shù)組的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-06-06
  • C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例

    C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例

    這篇文章主要介紹了C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 淺談C++ 容器查找效率

    淺談C++ 容器查找效率

    本文主要介紹了淺談C++ STL容器的查找效率差異,對(duì)比vector、list、set/map、unordered_set和deque等,幫助選擇合適容器以優(yōu)化性能,感興趣的可以了解一下
    2025-06-06
  • 淺析C++調(diào)用Java的Jar包(帶參數(shù))問題

    淺析C++調(diào)用Java的Jar包(帶參數(shù))問題

    這篇文章主要介紹了C++調(diào)用Java的Jar包(帶參數(shù))問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • c語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽

    c語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽

    本文給大家介紹的是使用C語(yǔ)言實(shí)現(xiàn)php的trim標(biāo)簽功能的代碼,非常的實(shí)用,其主要作用是清除字符串開頭結(jié)尾除空白,有需要的小伙伴可以參考下。
    2016-01-01
  • C++類與對(duì)象深入之靜態(tài)成員與友元及內(nèi)部類詳解

    C++類與對(duì)象深入之靜態(tài)成員與友元及內(nèi)部類詳解

    朋友們好,這篇播客我們繼續(xù)C++的初階學(xué)習(xí),現(xiàn)在對(duì)我們對(duì)C++的靜態(tài)成員,友元,內(nèi)部類知識(shí)點(diǎn)做出總結(jié),整理出來(lái)一篇博客供我們一起復(fù)習(xí)和學(xué)習(xí),如果文章中有理解不當(dāng)?shù)牡胤?還希望朋友們?cè)谠u(píng)論區(qū)指出,我們相互學(xué)習(xí),共同進(jìn)步
    2022-06-06
  • C++之友元:友元函數(shù)和友元類詳解

    C++之友元:友元函數(shù)和友元類詳解

    友元是一種允許非類成員函數(shù)訪問類的非公有成員的一種機(jī)制??梢园岩粋€(gè)函數(shù)指定為類的友元,也可以把整個(gè)類指定為另一個(gè)類的友元
    2013-09-09

最新評(píng)論

黑水县| 东乌| 山东省| 图木舒克市| 天长市| 澄迈县| 思茅市| 章丘市| 玉屏| 镇雄县| 仁化县| 邯郸县| 牡丹江市| 江华| 英吉沙县| 陈巴尔虎旗| 罗田县| 古浪县| 安阳县| 大方县| 昌吉市| 武义县| 台安县| 兴仁县| 德钦县| 乃东县| 开封县| 北流市| 丹东市| 定日县| 舒城县| 宁阳县| 临清市| 黎城县| 板桥市| 道孚县| 宜春市| 通道| 富宁县| 吉林市| 永定县|