博客專欄

        EEPW首頁 > 博客 > sprintf函數的用法

        sprintf函數的用法

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

        注意事項:

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

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

        總是多打印幾個FFFF.

        4717fffffff0.

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


        sprintf函數的用法

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

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

        3、sprintf函數的格式:

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

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

        printf 和sprintf都使用格式化字符串來指定串的格式,在格式串內部使用一些以”%”開頭的格式說明符來占據一個位置,在后邊的變參列表中提供相應的變量,最終函數就會用相應位置的變量來替代那個說明符,產生一個調用者想要的字符串。

        4、可以控制精度

        char str[20];

        double f=14.309948;

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

        5、可以將多個數值數據連接起來

        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表示寬度,字符串共占的列數;n表示實際的字符數。%m.n在浮點數中,m也表示寬度;n表示小數的位數。

        7、可以動態指定,需要截取的字符數

        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的返回值是字符數組中字符的個數,即字符串的長度,不用在調用strlen(str)求字符串的長度。

        10、使用字符指針指向的字符串來接收打印的內容

        例子:


        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分配一片內存,加了malloc就要加stdlib.h

        11、設想當你從數據庫中取出一條記錄,然后希望把他們的各個字段按照某種規則連接成一個字符串時,就可以使用這種方法,從理論上講,他應該比strcat 效率高,因為strcat 每次調用都需要先找到最后的那個字符串結束字符’\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

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

        結果如圖所示:



        12、 格式化數字字符串

        sprintf最常見的應用之一莫過于把整數打印到字符串中。如:

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

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

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

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

        當然也可以左對齊:

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

        (3)也可以按照16進制打印:

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

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

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

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

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

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

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

        short si = -1;

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

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

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

        就可以了。或者:

        unsigned short si = -1;

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

        sprintf和printf還可以按8進制打印整數字符串,使用”%o”。注意8進制和16進制都不會打印出負數,都是無符號的,實際上也就是變量的內部編碼的直接用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


        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: C

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 天气| 肇源县| 齐河县| 略阳县| 汉沽区| 甘谷县| 商水县| 丰镇市| 遂川县| 遂溪县| 江华| 微山县| 台江县| 六枝特区| 乐至县| 额尔古纳市| 湘潭市| 开江县| 贵定县| 武胜县| 长沙县| 叶城县| 伊宁县| 麻栗坡县| 西宁市| 化州市| 西藏| 浏阳市| 宜都市| 开原市| 高陵县| 敖汉旗| 伊吾县| 赣州市| 阿巴嘎旗| 河池市| 山西省| 怀远县| 泸定县| 丰宁| 阜新|