[轉][修]sprintf()函數:將格式化的數據寫入字符串


頭文件:#include <stdio.h>
功能:用於將格式化的數據寫入字符串

原型: int sprintf(char *str, char * format [, argument, ...]);
【參數】str為要寫入的字符串;format為格式化字符串,與printf()函數相同;argument為變量。 除了前兩個參數類型固定外,后面可以接任意多個參數。
【返回值】成功則返回參數str 字符串長度,失敗則返回-1,錯誤原因存於errno 中。

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

注意: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為每次寫入數據的開始地址,最終的結果是所有產生的隨機數據都被以整數的形式存入數組中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM