博客專欄

EEPW首頁 > 博客 > sprintf函數(shù)的用法

sprintf函數(shù)的用法

發(fā)布人:電子禪石 時間:2021-09-07 來源:工程師 發(fā)布文章

注意事項:

sprintf 會自動擴展,之前定義一個char  id[10] = {0x47,0x17,0xF0}數(shù)組,然后打印到字符串時候。

sprintf(hostName + hostNameLen,"_%02x%02x%02x_%d"cracaId[0], cracaId[1], cracaId[2],cert_name_id++);

總是多打印幾個FFFF.

4717fffffff0.

最后 將char 類型改為 unsigned char 就可以了。


sprintf函數(shù)的用法

1、該函數(shù)包含在stdio.h的頭文件中。

2、sprintf和平時我們常用的printf函數(shù)的功能很相似。sprintf函數(shù)打印到字符串中(要注意字符串的長度要足夠容納打印的內(nèi)容,否則會出現(xiàn)內(nèi)存溢出),而printf函數(shù)打印輸出到屏幕上。sprintf函數(shù)在我們完成其他數(shù)據(jù)類型轉(zhuǎn)換成字符串類型的操作中應(yīng)用廣泛。

3、sprintf函數(shù)的格式:

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

除了前兩個參數(shù)固定外,可選參數(shù)可以是任意個。buffer是字符數(shù)組名;format是格式化字符串(像:”%3d%6.2f%#x%o”,%與#合用時,自動在十六進制數(shù)前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。其中的格式化字符串是此函數(shù)的精華。

printf 和sprintf都使用格式化字符串來指定串的格式,在格式串內(nèi)部使用一些以”%”開頭的格式說明符來占據(jù)一個位置,在后邊的變參列表中提供相應(yīng)的變量,最終函數(shù)就會用相應(yīng)位置的變量來替代那個說明符,產(chǎn)生一個調(diào)用者想要的字符串。

4、可以控制精度

char str[20];

double f=14.309948;

sprintf(str,”%6.2f”,f);

5、可以將多個數(shù)值數(shù)據(jù)連接起來

char str[20];

int a=20984,b=48090;

sprintf(str,”%3d%6d”,a,b);

str[]=”20984 48090”

6、可以將多個字符串連接成字符串

char str[20];

char s1[5]={‘A’,’B’,’C’};

char s2[5]={‘T’,’Y’,’x’};

sprintf(str,”%.3s%.3s”,s1,s2);

%m.n在字符串的輸出中,m表示寬度,字符串共占的列數(shù);n表示實際的字符數(shù)。%m.n在浮點數(shù)中,m也表示寬度;n表示小數(shù)的位數(shù)。

7、可以動態(tài)指定,需要截取的字符數(shù)

char str[20];

char s1[5]={‘A’,’B’,’C’};

char s2[5]={‘T’,’Y’,’x’};

sprintf(str,”%.*s%.*s”,2,s1,3,s2);

sprintf(str, “%*.*f”, 10, 2, 3.1415926);

8、可以打印出i的地址

char str[20];

int i;

sprintf(str, “%p”, &i);

上面的語句相當于

sprintf(str, “%0*x”, 2 * sizeof(void *), &i);

9、sprintf的返回值是字符數(shù)組中字符的個數(shù),即字符串的長度,不用在調(diào)用strlen(str)求字符串的長度。

10、使用字符指針指向的字符串來接收打印的內(nèi)容

例子:


int main()

{

    int ddd=666;

    char *buffer=NULL;    

    if((buffer = (char *)malloc(80*sizeof(char)))==NULL)

    {

        printf("malloc error\n");

    }

    sprintf(buffer, "The value of ddd = %d", ddd);//The value of ddd = 666

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

    free(buffer);

    buffer=NULL;

    return 0;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

指針剛開始定義的時候,并不指向所處,可以指向一個變量,然后可以用,如果要單純用這個指針,那么要給這個指針malloc分配一片內(nèi)存,加了malloc就要加stdlib.h

11、設(shè)想當你從數(shù)據(jù)庫中取出一條記錄,然后希望把他們的各個字段按照某種規(guī)則連接成一個字符串時,就可以使用這種方法,從理論上講,他應(yīng)該比strcat 效率高,因為strcat 每次調(diào)用都需要先找到最后的那個字符串結(jié)束字符’\0的位置,而在上面給出的例子中,我們每次都利用sprintf 返回值把這個位置直接記下來了。

例子:


void main(void)

    char buffer[200], s[] = "computer", c = 'l'; 

    int i = 35, j; 

    float fp = 1.7320534f; // 

    j = sprintf( buffer, " String: %s\n", s ); // 

    j += sprintf( buffer + j, " Character: %c\n", c ); // 

    j += sprintf( buffer + j, " Integer: %d\n", i ); // 

    j += sprintf( buffer + j, " Real: %f\n", fp );// 

    printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );

}

1

2

3

4

5

6

7

8

9

10

11

該例子是將所有定義的數(shù)據(jù)和格式控制塊中的字符連接在一起,最后打印出來buffer的內(nèi)容和字符串中字符的個數(shù)。

結(jié)果如圖所示:



12、 格式化數(shù)字字符串

sprintf最常見的應(yīng)用之一莫過于把整數(shù)打印到字符串中。如:

(1)把整數(shù)123打印成一個字符串保存在s中。

sprintf(s, “%d”, 123); //產(chǎn)生“123″

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

sprintf(s, “%8d%8d”, 123, 4567); //產(chǎn)生:“ 123 4567″

當然也可以左對齊:

sprintf(s, “%-8d%8d”, 123, 4567); //產(chǎn)生:“123 4567″

(3)也可以按照16進制打?。?/p>

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

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

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

sprintf(s, “%08X”, 4567); //產(chǎn)生:“000011D7″

上面以”%d”進行的10進制打印同樣也可以使用這種左邊補0的方式。

這里要注意一個符號擴展的問題:比如,假如我們想打印短整數(shù)

(4)(short)-1的內(nèi)存16進制表示形式,在Win32平臺上,一個 short型占2個字節(jié),所以我們自然希望用4個16進制數(shù)字來打印它:

short si = -1;

sprintf(s, “%04X”, si);

產(chǎn)生“FFFFFFFF,怎么回事?因為 sprintf是個變參函數(shù),除了前面兩個參數(shù)之外,后面的參數(shù)都不是類型安全的,函數(shù)更沒有辦法僅僅通過一個“%X”就能得知當初函數(shù)調(diào)用前參數(shù)壓棧時 被壓進來的到底是個4字節(jié)的整數(shù)還是個2字節(jié)的短整數(shù),所以采取了統(tǒng)一4字節(jié)的處理方式,導(dǎo)致參數(shù)壓棧時做了符號擴展,擴展成了32位的整數(shù)-1,打印時 4個位置不夠了,就把32位整數(shù)-1的8位16進制都打印出來了。如果你想看si的本來面目,那么就應(yīng)該讓編譯器做0擴展而不是符號擴展(擴展時二進制左邊補0而不是補符號位):

sprintf(s, “%04X”, (unsigned short)si);

就可以了。或者:

unsigned short si = -1;

sprintf(s, “%04X”, si);

sprintf和printf還可以按8進制打印整數(shù)字符串,使用”%o”。注意8進制和16進制都不會打印出負數(shù),都是無符號的,實際上也就是變量的內(nèi)部編碼的直接用16進制或8進制表示。


參考:http://blog.csdn.net/cos_sin_tan/article/details/7548632

http://nnssll.blog.51cto.com/902724/198237/

http://blog.csdn.net/s202090414/article/details/8690518

http://blog.csdn.net/peng___peng/article/details/51510685

————————————————


原文鏈接:https://blog.csdn.net/yishizuofei/article/details/78195255


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關(guān)鍵詞: C

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉