2009-05-17 117 views
0

我需要的是strcpy()。如何將字節[]複製到char *中?

我想看一個緩衝區(字節數組)的前三個字節是否爲「JMX」作爲字符串。

這是我做過什麼,到目前爲止:

char * ddj; 
strcpy(ddj, buffer); //buffer is BYTE[] 
if (strcmp("JMX", ddj) == 0) //check first three chars are "JMX" 
{ 
    buffer += 20; //increase the index with 20 
    size -= 20;  //int 
} 

我在STRCMP()線得到例外。問題是什麼?

我想我是在C#:(

+1

如果您發佈了一個問題,說明您實際正在嘗試做什麼,我們可以爲您提供最佳且簡單的C++方法。你現在正在使用次優的,坦率的錯誤的C做法。 – 2009-05-17 17:43:51

+0

再次談到顯式內存管理時,大多數答案在技術上是不正確的。一個強烈的跡象表明,應該使用std :: vector或std:; string,我想。 – 2009-05-17 17:52:59

回答

8

芹苴事情錯在這裏去:

  1. ddj不指向任何實際的內存。因此,副本將具有未定義的行爲
  2. 首先,複製不是必需的。

這是你可以做什麼:

if(strncmp("JMX", buffer, 3) == 0) { 
    buffer += 20; 
    size -= 20; 
} 

它使用的strncmp代替strcmp,從而確保不超過三個字節進行比較。如果buffer可以包含少於三個字節,你應該這樣做:

if(buf_len >= 3 && strncmp("JMX", buffer, 3) == 0) { 
    buffer += 20; 
    size -= 20; 
} 
2

你還沒有爲DDJ分配的內存寫的。使用新的給它分配內存。例如

char *ddj = new char[size]; //Allocate size number of chars 
//do the required comaprisons 

delete[] ddj; //Remember to release the memory. 

在另一方面你也可以使用std :: string這是一個標準字符串類

0

這是UB,因爲ddj沒有指向任何東西,你需要分配內存:

char* ddj = new char[strlen(buffer) + 1]; 

一定要delete您使用delete[]分配的內存(不是純delete!)。

您也可以使用std::string這是一般安全的,因爲您不必處理指針和內存分配。

看着你的代碼,然而,ddj似乎沒用。只需使用buffer

if (strcmp("JMX", buffer) == 0) //check first three chars are "JMX" 
{ 
    buffer += 20; //increase the index with 20 
    size -= 20;  //int 
} 
+0

strlen(緩衝區)+ 1 – 2009-05-17 17:42:14

2

必須爲ddj分配新的內存。任一聲明爲

char ddj[NAX_LENGTH]; 

或具有動態分配

char* ddj = new char[length]; // You must use delete[] to free the memory in the end. 

一個更方便的選擇是std::string

0

如果您想要strcmp ddj,您也可以先在緩衝區上執行此操作,並在稍後需要時製作緩衝區的副本。

6

您沒有爲ddj分配任何內存。由於它是一個局部變量,因此它被分配在堆棧上。局部變量默認情況下不初始化爲0/false/NULL,所以聲明後立即值ddj是未定義的 - 它將具有堆棧中特定位置的內存中剩餘的值。任何取消引用的嘗試(即讀取或寫入它所指向的內存)都會導致未定義的行爲。在你的情況下,它會崩潰,因爲它指向一個無效的地址。

要解決該問題,您需要爲ddj分配存儲空間。您可以在堆棧上分配靜態存儲,也可以在堆上動態存儲。要分配靜態存儲,這樣做:

// Allocate 64 bytes for ddj. It will automatically be deallocated when the function 
// returns. Be careful of buffer overflows! 
char ddj[64]; 

分配動態存儲:

// Allocate 64 bytes for ddj. It will NOT be automatically deallocated -- you must 
// explicitly deallocate it yourself at some point in the future when you're done 
// with it. Be careful of buffer overflows! 
char *ddj = new char[64]; 
... 
delete [] ddj; // Deallocate it 

而是自己管理存儲的,這將是一個更好的主意,用std::string,這與內存管理自動交易。

最後,因爲你所做的只是比較字符串的前三個字符,所以不需要跳過複製字符串並比較它。只需使用strncmp()

if(strncmp(buffer, "JMX", 3) == 0) 
{ 
    ... 
} 
1

首先,它的崩潰,因爲ddj不指向任何東西。其次,你不需要將字節[]中的數據複製到char *(它們本質上是相同的東西)。你可以這樣做:

if (strncmp("JMX", reinterpret_cast<char*>(buffer), 3) == 0) 
{ 
    // Strings are equal, do what you want 
} 
0

你得到的異常,因爲變量「DDJ」未初始化。這是指向垃圾,所以誰知道你在哪裏複製該字符串...

雖然你並不需要在比較它們之前複製字節。

if(strncmp("JMX", buffer, 3) == 0) // check if the first three characters are "JMX" 
{ 
    buffer += 20; 
    size -= 20; 
} 
相關問題