2011-10-11 92 views
2

這是一個大項目的一小部分......strcat的給予意想不到的結果

這些都是在項目標準的頭文件中定義的typedef。

typedef uint16_t u_int16_t; 
typedef uint32_t u_int32_t; 
typedef uint8_t u_int8_t; 

現在,這是造成問題的實際功能...

void function(u_int8_t *data1, u_int32_t data1len, 
    u_int8_t *data2, u_int32_t data2len) 
{ 

FILE *fq,*fr,*fs; 
    char *data3; 
    int data3len; 

    data3len=data1len+data2len; 

    printf("\n%d",data1len); 
    printf("\n%d",data2len); 
    printf("\n%d",data3len); 

fq=fopen("data1.txt","wb"); 
fwrite((char *)data1,data1len,1,fq); 

fr=fopen("data2.txt","wb"); 
fwrite((char *)data2,data2len,1,fr); 

data3=(char *)data1; 
strcat(data3,(char *)data2); 

fs=fopen("data3.txt","wb"); 
fwrite((char *)data3,data3len,1,fs); 

} 

一些輸出快照...

40 
14 
54 


[email protected] ~$ hexdump -C data1.txt 
00000000 60 00 00 00 00 8c 06 00 00 00 00 00 00 00 00 00 |`...............| 
00000010 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 |................| 
00000020 00 00 00 00 00 00 00 02       |........| 
00000028 

[email protected] ~$ hexdump -C data2.txt 
00000000 00 26 00 26 00 00 00 01 00 00 00 02 34 12 00 65 |.&.&........4..e| 
00000010 00 34 00 00 61 62 63 64       |.4..abcd| 
00000018 

[email protected] ~$ hexdump -C data3.txt 
00000000 60 00 00 00 00 8c 06 00 00 00 00 00 00 00 00 00 |`...............| 
00000010 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 |................| 
00000020 00 00 00 00 00 00 00 02 00 78 f8 65 00 00 00 02 |.........x.e....| 
00000030 f4 1f 96 00 18 34 a6 bf 1c 03 96 00 88 f1 90 08 |.....4..........| 
00000040 

爲什麼data2.txt的內容不被複制到數據3。文本 ???如果有任何其他可能的方式,那麼請告訴我! Thanx提前...

+2

如果您正在使用二進制文件的工作,你應該避免'strxxx'功能,喜歡'uint8_t *''以上的char *',還可以避免'.txt'擴展。 – Joe

回答

2

我認爲你可以做得更容易,從而避免你確保相應的內存塊足夠大。

void function(u_int8_t *data1, u_int32_t data1len, 
    u_int8_t *data2, u_int32_t data2len) 
{ 
    FILE *fq,*fr,*fs; 
    char *data3; 

    fq=fopen("data1.txt","wb"); 
    fwrite((char *)data1, data1len, 1, fq); 
    fclose(fq); 

    fr=fopen("data2.txt","wb"); 
    fwrite((char *)data2, data2len, 1, fr); 
    fclose(fr); 

    fs=fopen("data3.txt","wb"); 
    fwrite((char *)data1, data1len, 1, fs); 
    fwrite((char *)data2, data2len, 1, fs); 
    fclose(fs); 
} 
+0

thnx我很愚蠢,想不到它那麼簡單.... –

3

爲什麼data2.txt的內容沒有複製到data3.txt?

strcat是專門用於連接C字符串,並且只複製直到空終止符字符。所以一旦它遇到00,它會認爲字符串的結尾就停止從源文件複製。注意data2是以00開始的,所以它立即停止。

您將改爲需要memcpy,目標位置爲data3中的最後一個字節,而源位置爲data2。如果data3(這實際上是data1)沒有足夠的空間容納data2,則還需要優雅地失敗。

+0

那麼有沒有其他可以執行任務的函數? –

0

您嘗試將data2追加到data1的末尾。 你打算把結果放入第三個字符串(data3),但實際上data3只是data1;他們指向相同的位置。 您的代碼就相當於

strcat (data1, data2); 

這當然寫入超出DATA1結束。 (還有另一個問題:如果函數的調用者使用「string_literal」作爲參數#1, DATA1不會寫。)

你可能要分配一些內存得到的字符串,使點DATA3到它。