簡體   English   中英

char *上的memset的C ++等價物

[英]C++ equivalent for memset on char*

我有這個代碼

  char * oldname = new char[strlen(name) + 1];

  memcpy(oldname,name,strlen(name) + 1);

  name = new char[strlen(oldname) + strlen(r.name) + 1];
  memset(name, '\0', strlen(name));

  strcat(name,oldname);
  strcat(name," ");
  strcat(name,r.name);

我理解使用memcpy和memset是不行的,但我還沒有完全理解如何在C ++中使用它,最好沒有std。

有人知道嗎? 謝謝。

一般來說,有std::fill http://www.cplusplus.com/reference/algorithm/fill/

或者在這個特定的例子中,你應該考慮使用std::vector<char>

(請注意,如果使用#include <cstring>memset仍然可以在C ++中使用,盡管它在C ++中不那么慣用。)

當您擁有對象類型數組時, memset一個可能替代是使用std::fill算法。 它適用於迭代器范圍以及指向數組的指針。

memcpy調用通常可以替換為對std::copy調用。

例如

std::copy(name, name + strlen(name) + 1, oldname);
// ...
std::fill(name, name + strlen(name), '\0');

memsetmemcpy仍然存在,但可以在適當的時候使用。 這可能要使用原始更大的觀看禁忌許多C ++開發人員的角度new ,而不是使用資源管理對象。 使用std::stringstd::vector<char>要好得多,以便內存釋放是自動的,代碼更安全。

我理解使用memcpy和memset是不行的,但我還沒有完全理解如何在C ++中使用它,最好沒有std。

當使用memcpymemset時,使用memcpymemset並非memcpy 為什么會這樣?

在C ++中有std::copy ,它將一組項(從任何類型工作,而不僅僅是char* )從迭代器復制到另一個。

除了必須自己手動復制和完成所有內存分配的不便之外,C ++代碼沒有任何問題。

但是,我強烈建議在C ++中使用std::string進行字符串操作。

如果您只是在進行字符串操作,請使用字符串。

從復制到B,采取std::copy(src_start,src_end,dest_start)其中遞增src_start並將其復制到下一個目的地,直到元件src_start==src_end被滿足。

memcpy(oldname,name,strlen(name)+1)
// is the same as
std::copy(name,name+strlen(name)+1,oldname)

..除了它也適用於非POD,如果一個元素超過一個字節,你不需要亂碼字節長度。

但是,如果您只想進行字符串操作,則會提供std::string類(以及寬字符串的std::wstring )。 連接它們很簡單:

std::string s = "name",s2 = ..,s3 = ..;
s = s2+s+s3+"Hello";

沒有什么能阻止你在C ++中使用strxxx系列函數,但我強烈建議你切換到std::string和STL的其余部分。 它也不完美,但更不容易出錯。

char * oldname = new char[strlen(name) + 1];

    //memcpy(oldname,name,strlen(name) + 1);
    strcpy(oldname,name);

    name = new char[strlen(oldname) + strlen(r.name) + 1];
    //memset(name, '\0', strlen(name));
    name[0] = '\0';

    strcat(name,oldname);
    strcat(name," ");
    strcat(name,r.name);

我現在明白這一點,只是想為所有未來的訪問者粘貼此代碼。注釋行與它們下面的未注釋行相同。 C評論說,C ++沒有注釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM