2010-01-24 37 views
7

我有此代碼C++當量爲對char memset的*

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使用此++,優選不性病。

有誰知道嗎?謝謝。

+1

看起來您可能已經爲名稱分配了一個太少的字符。而且我不明白爲什麼你首先用零填充數組,如果你打算在其後覆蓋它。 (第一個strcat只需要第一個字符爲空,strcpy甚至不需要,這兩個函數都是空字符串)。哦,'strlen(name)'不能很好地工作,除非字符串已經包含正確終止的C字符串!除了統計第一個空字符以外的所有字符,它不會執行其他任何操作。 – UncleBens 2010-01-24 23:35:42

回答

-1
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++沒有註釋。

+0

這是錯誤的。註釋行不等同於名稱[0] ='\ 0' – 2018-02-10 14:06:01

7

當您有一個對象類型數組時,一個可能的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>會更好,因此內存釋放是自動的,並且代碼更安全。

+2

'std :: fill_n'可能比fill更好。否則,很好的答案,+1 :) – jalf 2010-01-24 23:24:01

1

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

2

我明白,這是一種沒有沒有使用的memcpy和memset但還沒不知道如何在C++中使用它,最好不使用std。

這不是一個禁忌使用memcpymemset當他們的使用是適當的。爲什麼要這樣呢?

在C++中有std::copy從一個迭代器複製一組項目(適用於任何類型而不僅僅是char*)從一個迭代器到另一個。

+0

但是,它可以用更安全,更高效的'std :: fill'替換嗎? – jalf 2010-01-24 23:24:40

+1

@jalf:毫無疑問,'std :: fill'應該比'memset'更受用戶喜歡*。我的觀點是通常沒有語言功能,你會完全拋棄。一個例子是需要用C語言和C++編譯的一段代碼。 – 2010-01-24 23:47:30

2

除了自己手動複製和執行所有內存分配帶來的不便外,C++代碼沒有任何問題。

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

1

要從a複製到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) 

..但它也將工作的非吊艙,如果一個元素是大於一個字節,你不需要使用字節長度的混亂。

但是,如果您只想執行字符串操作,則會提供std::string類(並且寬字符字符串爲std::wstring)。串聯他們來說是簡單的:

​​

沒有阻止你使用strxxx家庭在C++函數,但我會強烈建議您切換到std::string和STL的休息。這也不完美,但更不容易出錯。