[英]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');
memset
和memcpy
仍然存在,但可以在適當的時候使用。 這可能要使用原始更大的觀看禁忌許多C ++開發人員的角度new
,而不是使用資源管理對象。 使用std::string
或std::vector<char>
要好得多,以便內存釋放是自動的,代碼更安全。
我理解使用memcpy和memset是不行的,但我還沒有完全理解如何在C ++中使用它,最好沒有std。
當使用memcpy
和memset
時,使用memcpy
和memset
並非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.