sprintf錯誤以及類型轉換

   最近,編寫一個程序需要將兩個字符串連接起來,我使用了sprintf函數,總是出現錯誤的結果。後來,把結果打印出來,才發現原來是char指針中有空字符(ASCII碼爲0的字符)。我的錯誤代碼如下:

unsigned char szbuffer[1024];

unsigned char head[10]={0xFF,0xFF,0x01,0x01,0x06,0x01,0x00,0x00,0x00,0x00};

char * sfile="<FILE_LOCATION_REQ><FILE_ID>4567FEDC4567FEDC4567FEDC4567FEDC4567FEDC4567FEDC</FILE_ID></FILE_LOCATION_REQ>";
sprintf((char *)szbuffer,"%.10s%s",head,sfile);

結果,總是不能連接成功,後來又嘗試使用strcat函數,將兩個字符串連接:代碼如下:

 for (i=0;i<10;i++)
         szbuffer[i]=head[i];

strcat((char *)szbuffer,sfile);

後來,我才發現,原來是head中有ASCII碼值爲0的字符,而這個字符,在字符串中是字符串的結束符號。所以,是用sprintf和strcat時,遇到0x00字符串都會結束。我又找了一下別人使用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”.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章