2011-11-24 79 views
1

我試圖使用memcpy函數連接一個字符,但是,在memcpy之後,我得到了一個奇怪的緩衝區長度。請參閱下面在C++ memcpy後得到strlen

int main() 
{ 
uint8 txbuffer[13]={0}; 
uint8 uibuffer[4] = "abc"; 
uint8 rxbuffer[4] = "def"; 
uint8 l[2]="g"; 
int index = 1; 

cout << strlen((char*)txbuffer) <<endl; 
memcpy(&txbuffer[1],&uibuffer, strlen((char*)uibuffer)); 
index+=strlen((char*)uibuffer); 

cout <<"after first memcpy: "<< strlen((char*)txbuffer) <<endl; 
memcpy(&txbuffer[index],&rxbuffer, strlen((char*)uibuffer)); 

cout <<"after second memcpy: "<< strlen((char*)txbuffer) <<endl; 
memcpy(&txbuffer[0],&l, strlen((char*)l)); 

cout <<"after third memcpy: "<< strlen((char*)txbuffer) <<endl; 
for (int i = 0; i < sizeof(txbuffer); i += 1) 
{ 
    cout << (int(txbuffer[i]))<<" : "<< char(int(txbuffer[i]))<<endl; 
} 
return 0; 
} 

輸出代碼是:

after first memcpy: 0 
after second memcpy: 0 
after third memcpy: 7 
103 : g 
97 : a 
98 : b 
99 : c 
100 : d 
101 : e 
102 : f 
0 : 
0 : 
0 : 
0 : 
0 : 
0 : 

我的問題是,爲什麼第一的memcpy後,緩衝區的strlen的仍然是零?

回答

1

這是因爲txbuffer中的第一個字符是空字符\0。 (你這樣初始化它。)所以當你打印出來的時候,字符串的長度是零。

您沒有覆蓋第一個或第二個副本中的第一個字符。但是你最終會在第三個副本中覆蓋它。這就是爲什麼在第三次複製之後長度爲零的原因。

// Start 
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} 

// After 1st memcpy(): strlen() is still zero 
{ 0, 'a', 'b', 'c', 0, 0, 0, 0, 0, 0, 0, 0, 0} 
^first null character 

// After 2nd memcpy(): strlen() is still zero 
{ 0, 'a', 'b', 'c', 'd', 'e', 'f', 0, 0, 0, 0, 0, 0} 
^first null character 

// After 3rd memcpy(): strlen() is now 7 
{'g', 'a', 'b', 'c', 'd', 'e', 'f', 0, 0, 0, 0, 0, 0} 
            ^first null character 
2

您應該不會strlen目的地memcpy ing strlen字節從原來的,因爲您沒有複製0終止符。

此外,你複製從字節1開始,而不是0,這意味着strlen爲0,因爲你的數組最初爲零(這種類型使我的第一段無關緊要,但你應該知道它)。

0

strlen()計算非NUL字節的數量。由於初始NUL在複製後仍然存在,當然strlen()將返回零。

相反,你可能更喜歡使用sizeof或一些更明確的級聯邏輯:

int main() 
{ 
    char txbuffer[13]; 
    char uibuffer[4] = "abc"; 
    char rxbuffer[4] = "def"; 
    char l[2]="g"; 
    int index = 1; 

    int n = sprintf (txbuffer, "%s%s%s", uibuffer, rxbuffer, l); 
    cout << "buffer has " << n << " bytes" << endl; 
    return 0; 
} 
0

有多個問題在這裏。

首先使用& uibuffer作爲參數傳遞給memcpy的是錯的,只是用uibuffer (rxbuffer,l),因爲他們已經是一個地址(即數組):

memcpy(&txbuffer[1], uibuffer, strlen((char*)uibuffer)); 

以上txbuffer做的strlen(因爲你複製到帶有偏移量1)的txtbuffer將會產生0長度,因爲strlen會計數直到找到\ 0,所以使用strlen和memcpy並不是一個好主意,而是手動跟蹤txtbuffer中的長度,您知道字符串的長度你複製和抵消。