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

c語言snprintf函數的用法詳解

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

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

語法:

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

參數:

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

返回值:

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

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

實例:

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

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

輸出:

Hello wor

這里面包含一個’\0’

特別注意

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

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

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

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

思考:

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

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

2. 特別小心返回值。

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

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

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

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));

總結

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

相關文章

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

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

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

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

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

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

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

    Qt動態(tài)庫調用宿主進程中的對象方法純虛函數使用

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

    VC中使用ADO開發(fā)數據庫應用程序簡明教程

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

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

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

    C語言、C++中的union用法總結

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

    詳解C語言中const關鍵字的用法

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

    c++??復制消除問題解決示例詳析

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

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

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

最新評論