使用sprintf實現類型轉換


以下爲我在編程的過程中用到sprintf,後查找資料及自己的一些總結。感謝網上資料的幫助。
在很多場合可以使用sprintf來實現類型轉換,
int sprintf( char *buffer, const char *format [, argument] ... );
  除了前兩個參數類型固定外,後面可以接任意多個參數。而它的精華,顯然就在第二個參數.
比如
1. const char* 轉換成char*
 有時我們需要把string類型的字符串轉換成char*,但是string.c_str()等到的結果是const char*類型而不是char*類型,轉換方法就是先把string轉換成const char*,然後用sprintf把const char*轉換成char*
如:string str;
        char* strchar;
        const char* strC = str.c_str();
        sprintf(strchar,"%s",str.c_str());
2.將int類型轉換成char*
//把整數123 打印成一個字符串保存在s 中。
 sprintf(s, "%d", 123); //產生"123"
3.將浮點數轉換成char*
但有時我們希望自己控制打印的寬度和小數位數,這時就應該使用:”%m.nf”格式,其中m 表示打印的寬度,n 表示小數點後的位數。比如:
  sprintf(s, "%10.3f", 3.1415626); //產生:" 3.142"
 
4.實現字符串的連接
       char* who = "I";
  char* whom = "CSDN";
  sprintf(s, "%s love %s.", who, whom); //產生:"I love CSDN. "

使用sprintf 的常見問題
  sprintf 是個變參函數,使用時經常出問題,而且只要出問題通常就是能導致程序崩潰的內存訪問錯誤,但好在由sprintf 誤用導致的問題雖然嚴重,卻很容易找出,無非就是那麼幾種情況,通常用眼睛再把出錯的代碼多看幾眼就看出來了。
1 緩衝區溢出
 第一個參數的長度太短了,沒的說,給個大點的地方吧。當然也可能是後面的參數的問題,建議變參對應一定要細心,而打印字符串時,儘量使用”%.ns”的形式指定最大字符數。
2. 忘記了第一個參數低級得不能再低級問題,用printf 用得太慣了。
3. 變參對應出問題通常是忘記了提供對應某個格式符的變參,導致以後的參數統統錯位,檢查檢查吧。尤其是對應”*”的那些參數,都提供了嗎?不要把一個整數對應一個”%s”.
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章