1. 程式人生 > >sprintf()函式的用法

sprintf()函式的用法

sprintf函式的格式:int sprintf( char *buffer, const char *format [, argument,...] );

除了前兩個引數固定外,可選引數可以是任意個。buffer是字元陣列名;format是格式化字串

常用方式

sprintf函式的功能與printf函式的功能基本一樣,只是它把結果輸出到指定的字串中了,看個例子就明白了:
例:將”test 1 2”寫入陣列s中
#include<stdio.h>int main(int argc, char *avgv[])
{
char s[40]; sprintf(s,"%s%d%c","test",1,'2'); /*第一個引數就是指向要寫入的那個字串的指標,剩下的就和printf()一樣了
你可以比較一下,這是向螢幕輸入*/
printf("%s%d%c","test",1,'2'); return 0;
}12345678910

編譯:
g++ sprinftest.cpp -o sprinftest && ./sprinftest
輸出結果:
sprintftest12
sprintftest12
2.若”%s”等輸出符在字串中
例:補全字串str的預設內容
#include <iostream>#include <stdio.h>#include <cstring>int main(int argc, char *avgv[])
{ char str[] = "hel%co wo%sd! sp%stf test%d"; char buf[strlen(str)]; sprintf(buf, str, 'l', "rl", "rin", 1); std::cout << "str = "<< buf << "\nlen = " << strlen(buf) << std::endl; return 0;
}123456789101112

編譯:
g++ sprinftest.cpp -o sprinftest && ./sprinftest
輸出結果:
str = hello world! sprintf test1
len = 27
這種形式也可以將多個字元值或字串值賦值到字串str中,有多少個輸出符就後面就加多少個引數。

 本回答被網友採納

 1  

 評論 

分享

 舉報

冰麗荔 
來自百度知道認證團隊 2018-05-19

sprintf的作用是將一個格式化的字串輸出到一個目的字串中,而printf是將一個格式化的字串輸出到螢幕。

sprintf的第一個引數是目的字串,如果不指定這個引數,執行過程中出現 "該程式產生非法操作,即將被關閉...."的提示。

因為C語言在進行字串操作時不檢查字串的空間是否夠大,所以可能會出現陣列越界而導致程式崩潰的問題。

即使碰巧,程式沒有出錯,也不要這麼用,因為早晚會出錯。所以一定要在呼叫sprintf之前分配足夠大的空間給buf。

sprintf 是個變參函式,定義如下:

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

除了前兩個引數型別固定外,後面可以接任意多個引數。而它的精華,顯然就在第二個引數:格式化字串上。

printf 和sprintf 都使用格式化字串來指定串的格式,在格式串內部使用一些以“%”開頭的格式說明符(format specifications)來佔據一個位置,在後邊的變參列表中提供相應的變數,最終
函式就會用相應位置的變數來替代那個說明符,產生一個呼叫者想要的字串:

格式化數字字串

sprintf 最常見的應用之一是把整數列印到字串中,所以,spritnf 在大多數場合可以替代itoa。如:

1>把整數123 列印成一個字串儲存在s 中。

sprintf(s, "%d", 123); //產生"123"

2>可以指定寬度,不足的左邊補空格:

sprintf(s, "%8d%8d", 123, 4567); //產生:" 123 4567"

3>當然也可以左對齊:

sprintf(s, "%-8d%8d", 123, 4567); //產生:"123 4567"

4>也可以按照16 進位制列印:

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

sprintf(s, "%-8X", 4568); //大寫16 進位制,寬度佔8 個位置,左對齊

這樣,一個整數的16 進位制字串就很容易得到,但我們在列印16 進位制內容時,通常想要一種左邊補0 的等寬格式,那該怎麼做呢?很簡單,在表示寬度的數字前面加個0 就可以了。

sprintf(s, "%08X", 4567); //產生:"000011D7"

使用sprintf 的常見問題

sprintf 是個變參函式,使用時經常出問題,而且只要出問題通常就是能導致程式崩潰的記憶體訪問錯誤,但好在由sprintf 誤用導致的問題雖然嚴重,卻很容易找出,無非就是那麼幾種情況,通常用眼睛再把出錯的程式碼多看幾眼就看出來了。

1>>緩衝區溢位

第一個引數的長度太短了,沒的說,給個大點的地方吧。當然也可能是後面的引數的問題,建議變參對應一定要細心,而列印字串時,儘量使用”%.ns”的形式指定最大字元數。

2>>忘記了第一個引數

低階得不能再低階問題,用printf 用得太慣了。

3>>變參對應出問題

通常是忘記了提供對應某個格式符的變參,導致以後的引數統統錯位,檢查檢查吧。尤其是對應”*”的那些引數,都提供了嗎?不要把一個整數對應一個”%s”。