認識sprintf函式及snprintf

2022-03-29 17:44:47 字數 3068 閱讀 4749

認識sprintf函式

2014/6/21 14:17:24

int sprintf( char *buffer, const char *format [, argument] ... );

sprintf函式的格式儲存了一系列緩衝區中的字元和值。每個引數是根據相應的格式規範的格式轉換和輸出。該格式由普通字元並具有相同的形式和功能作為格式引數的printf的。自動在字串的末尾追加空字元'\0'。如果重疊的字串之間發生拷貝,其行為是未定義的。

buffer為要寫入的字串,format為格式化字串,argument是要儲存的資料。除了前兩個引數型別固定外,後面可以接任意多個引數。而它的精華,顯然就在第二個引數--格式化字串--上。 printf()和sprintf()都使用格式化字串來指定串的格式,在格式串內部使用一些以「%」開頭的格式說明符(format specifications)來佔據乙個位置,在後邊的變參列表中提供相應的變數,最終函式就會用相應位置的變數來替代那個說明符,產生乙個呼叫者想要的字串

#include#includeint main()

; sprintf(str,"%d",'a');

printf("%d",str);

prinrf("%d\n",strlen(str));

return 0;

}

sprintf()最常見的應用之一莫過於把整數列印到字串中,如:

sprintf(s, "%d", 123);     //把整數123列印成乙個字串儲存在s中

sprintf(s, "%8x", 4567); //小寫16進製制,寬度佔8個位置,右對其

sprintf(s, "%-10x「,123); //大寫16進製制,佔寬度為10,左對齊

sprintf(s, "%010x",123); //小寫16進製制,佔1寬度為10,右對齊,左邊空位補0.

sprintf(s, "%010o",123); //把123轉換為8進製數,將該8進製數以在字串形式儲存在陣列中,佔10位,右對齊,不足處補0.

利用sprintf函式可以儲存字串的功能,如果我們連續存數多個字串(不重疊),是不是就達到了連線字元創的功能呢!

#includeint main()

;sprintf(str,"%s %s",targe1,targe2);

printf("%s\n",str);

return 0;

}

執行一下,果然是這樣的!

下面這中方法也是可以的。(msdn例子)

#include int main( void )

//第一看到這**還是覺得蠻巧妙的,利用了sprintf函式返回值(本次成功寫入buffer中字元的數目)

有時候,我們沒有在字串,只有字元陣列。要知道,字串的結尾有'\0'這個空字元作為標誌,而陣列沒有。那麼我怎才能使用sprintf函式來連線連個字元陣列呢?

char str1 = ;

char str2 = ;

直接連線肯定是不行了的,因為在儲存第乙個陣列的時候,並不知道結尾在那裡,所以我們應該想儲存整數和浮點數一樣,給定乙個寬度,最多讀取長度是多少。

char str[100]=;

sprintf(str,"%.7s%.7s",str1,str2);//str1的長度是7,str2的長度也是7。

這可以模擬列印浮點數的」%m/nf」,在」%m.ns」中,m 表示占用寬度(字串長度不足時補空格,超出了則按照實際寬度列印),n 才表示從相應的字串中最多取用的字元數。通常在列印字串時m 沒什麼大用,還是點號後面的n 用的多。自然,也可以前後都只取部分字元:

sprintf(s, "%.6s%.5s", str1, str2);//產生:"abcdefhijkl"

在許多時候,我們或許還希望這些格式控制符中用以指定長度資訊的數字是動態的,而不是靜態指定的,因為許多時候,程式要到執行時才會清楚到底需要取字元陣列中的幾個字元,這種動態的寬度/精度設定功能在sprintf 的實現中也被考慮到了,sprintf 採用」*」來占用乙個本來需要乙個指定寬度或精度的常數數字的位置,同樣,而實際的寬度或精度就可以和其它被列印的變數一樣被提供出來,於是,上面的例子可以變成:

sprintf(s, "%.s%.s", 7, str1, 7, str2);

或者:sprintf(s, "%.s%.s", sizeof(str1), str1, sizeof(str2), str2);

例項1:

#includeint main()

;sprintf(str,"&-*d",5,'2');將字元2以整數儲存,佔寬度為5

printf("%s",str);

sprintf(str,"%#0*x",8,128);//產生"0x000080","#"產生0x

printf("%s",str);

sprintf(str,"%*.*f",10,2,3.1415926);//佔10位,保留2為小數,右對齊

printf("%s",str);

return 0;

}

例項2:

#include#includeint main()

;char str2=;

char str[100}=

sprintf函式在使用中很容易發生緩衝區溢位,因為沒有限定寫入buffer的資料的長度,所以當buffer的長度不夠時發生溢位,從而破壞程式的堆疊,不法分子用這一缺陷來幹一些壞事。所以我們用sprintf的secure version(snprintf)來代替它。

snprintf函式的原型:

int snprintf(char *str, size_t size, const char *format, ...);

size限定了寫入buffer的長度。一般的size ==sizeof(bffer).如果格式話後字元創的長度小於size,則可以將字串完全寫入buffer,否則字串會被截斷,只將前面 size -1字元儲存在buffer中,最後乙個位元組自動補充 '\0'。

fgets函式 sprintf函式

char fgets char restrict s,int n,file restrict stream 第乙個引數為資料存放的陣列,第二個引數為最大長度,第三個引數為輸入源,我們從鍵盤讀入,引數為stdin 可以看到fgets 讀取的字串長度包含了結尾的 0 遍歷陣列時要注意下標越界。strle...

sprintf函式詳解

printf 可能是許多程式設計師在開始學習c 語言時接觸到的第二個函式 我猜第乙個是main 說 起來,自然是老朋友了,可是,你對這個老朋友了解多嗎?你對它的那個孿生兄弟sprintf 了解多 嗎?在將各種型別的資料構造成字串時,sprintf 的強大功能很少會讓你失望。由於sprintf 跟pr...

sprintf函式詳解

sprintf 將字串格式化。標頭檔案 include 語法 int sprintf string format,mixed args 返回值 字串長度 strlen 1.處理字元方向。負號時表時從後向前處理。2.填空字元。0 的話表示空格填 0 空格是內定值,表示空格就放著。3.字元總寬度。為最小...