博客專欄

        EEPW首頁 > 博客 > C語言sprintf()函數:將格式化的數據寫入字符串

        C語言sprintf()函數:將格式化的數據寫入字符串

        發布人:電子禪石 時間:2019-12-24 來源:工程師 發布文章

        頭文件:#include <stdio.h>

        sprintf()函數用于將格式化的數據寫入字符串,其原型為:
            int sprintf(char *str, char * format [, argument, ...]);

        【參數】str為要寫入的字符串;format為格式化字符串,與printf()函數相同;argument為變量。

        除了前兩個參數類型固定外,后面可以接任意多個參數。而它的精華,顯然就在第二個參數--格式化字符串--上。 printf()和sprintf()都使用格式化字符串來指定串的格式,在格式串內部使用一些以“%”開頭的格式說明符(format specifications)來占據一個位置,在后邊的變參列表中提供相應的變量,最終函數就會用相應位置的變量來替代那個說明符,產生一個調用者想要的字符串。

        sprintf()最常見的應用之一莫過于把整數打印到字符串中,如:
            sprintf(s, "%d", 123);  //把整數123打印成一個字符串保存在s中
            sprintf(s, "%8x", 4567);  //小寫16進制,寬度占8個位置,右對齊

        sprintf的作用是將一個格式化的字符串輸出到一個目的字符串中,而printf是將一個格式化的字符串輸出到屏幕。sprintf的第一個參數應該是目的字符串,如果不指定這個參數,執行過程中出現 "該程序產生非法操作,即將被關閉...."的提示。

        sprintf()會根據參數format 字符串來轉換并格式化數據,然后將結果復制到參數str 所指的字符串數組,直到出現字符串結束('\0')為止。關于參數format 字符串的格式請參考printf()。

        【返回值】成功則返回參數str 字符串長度,失敗則返回-1,錯誤原因存于errno 中。

        注意:C語言對數組進行操作時并不檢測數組的長度,如果str的長度不夠,sprintf()很容易造成緩沖區溢出,帶來意想不到的后果,黑客經常利用這個弱點攻擊看上去安全的系統。請看下面的代碼:

        #include <stdio.h>
        main()
        {char buf[10];
        sprintf(buf, "The length of the string is more than 10");
        printf("%s", buf);}

        編譯并運行,屏幕上輸出”The length of the string is more than 10“,同時系統提示程序已經停止。原因就是要寫入的字符串的長度超過了buf的長度,造成緩沖區溢出。

        使用snprintf()來代替sprintf()將能夠很好的解決這個問題。

        【實例】打印字母a的ASCII值。

        #include <stdio.h>
        main()
        {char a = 'a';
        char buf[80];
        sprintf(buf, "The ASCII code of a is %d.", a);
        printf("%s", buf);}

        運行結果:
        The ASCII code of a is 97.

        又如,產生10個100以內的隨機數并輸出。

        #include<stdio.h>
        #include<stdlib.h>
        #include<time.h>
        int main(void)
        {char str[100];
        int offset =0;
        int i=0;
        srand(time(0));  // *隨機種子
        for(i = 0;i<10;i++)
        {offset+=sprintf(str+offset,"%d,",rand()%100);  // 格式化的數據寫入字符串
        }
        str[offset-1]='\n';
        printf(str);return 0;}

        運行結果:
        74,43,95,95,44,90,70,23,66,84

        例子使用了一個新函數srand(),它能產生隨機數。例子中最復雜的部分是for循環中每次調用函數sprintf()往字符數組寫數據的時候,str+foffset為每次寫入數據的開始地址,最終的結果是所有產生的隨機數據都被以整數的形式存入數組中。


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



        關鍵詞:

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宜宾市| 淮北市| 阳山县| 乌什县| 定日县| 南充市| 五台县| 江达县| 阿瓦提县| 容城县| 郎溪县| 鹤岗市| 泰和县| 双牌县| 江安县| 梅州市| 威海市| 康保县| 万全县| 屏山县| 阳山县| 拜泉县| 连南| 安溪县| 西青区| 桂林市| 武乡县| 广元市| 乌拉特前旗| 安吉县| 西畴县| 抚宁县| 阜阳市| 崇左市| 杂多县| 定日县| 拜城县| 岐山县| 禄丰县| 什邡市| 凌云县|