J'ai ce code
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);
7 Réponses :
Un remplacement possible pour Par exemple, p> Memset code> Lorsque vous avez un tableau de types d'objets consiste à utiliser le
std :: remplir code> algorithme. Il fonctionne avec des gammes d'itérateurs et des pointeurs dans des tableaux.
memcpy code> Les appels peuvent généralement être remplacés par des appels sur
std :: copier code>. P>
memset code> et
memcpy code> sont toujours là et peuvent être utilisés le cas échéant. Il s'agit probablement d'un point de vue de nombreux développeurs de nombreux développeurs C ++ pour utiliser un nouveau
nouveau code> et n'utilisant pas d'objet de gestion des ressources. Il est beaucoup préférable d'utiliser un
std :: string code> ou un
std :: vecteur
STD :: Fill_N Code> Peut-être une meilleure correspondance que de remplir. Sinon, bonne réponse, +1 :)
Si vous faites simplement une manipulation de chaîne, utilisez la chaîne. p>
En général, il y a ou dans cet exemple particulier, vous devez envisager d'utiliser (Notez que std :: remplir code>. http://www.cplusplus.com/reference/algorithm/fref/ p>
std :: vecteur
Memset code> peut toujours être utilisé dans C ++ si vous utilisez
#include
Je comprends que c'est un non non à utiliser memcpy et memset, mais je n'ai pas compris exactement comment utiliser ceci en C ++, de préférence sans std. p> blockQuote>
Ce n'est pas un non-non à utiliser
memcpy code> et
memset code> lorsque leur utilisation est appropriée. Pourquoi devrait-il être? p>
Il y a
std :: copier code> en C ++ qui copie un ensemble d'éléments (fonctionne sur n'importe quel type et non seulement
char * code>) d'un itérateur à un autre. p>
Mais l'utilisation est-elle appropriée lorsqu'elle peut être remplacée par le code std :: remplir code code>?
@jalf: Il ne fait aucun doute que std :: remplir code> doit être préféré à
memset code> en général quand il peut être utilisé i>. Mon point était qu'il n'ya généralement pas de fonctionnalité de langue que vous découvrirez complètement. Un exemple est un code de code qui doit être compilé en C ainsi que C ++.
Autre que le désagrément d'avoir à copier manuellement et à faire toute l'allocation de mémoire vous-même, il n'y a rien de mal avec ce code C ++. P>
Je ferais cependant fortement encourager l'utilisation de std :: string code> pour la manipulation de chaîne en C ++. P>
copier de A à B, prendre std :: copy (src_start, src_end, dort_start) code> qui incrémente
src_start code> et les copie à l'élément de destination suivant jusqu'à ce que
src_start == src_end code> est rempli.
std::string s = "name",s2 = ..,s3 = ..;
s = s2+s+s3+"Hello";
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); I understand this now, just wanted to paste this code for all future visitors The commented lines are equivalent with the uncommented ones below them. C commented, C++ uncommented.
C'est faux. La ligne commentée n'est pas équivalente à Nommer [0] = '\ 0'
Il semble que vous ayez peut-être alloué un personnage trop peu pour votre nom. Et je ne vois pas vraiment pourquoi vous remplissez le tableau avec Zeros en premier lieu, si vous allez écraser par la suite. (Le premier Strcat ne nécessite que le premier caractère d'être null, Strcpy n'aurait besoin que même. Ces fonctions résolnent la chaîne pour vous.) Oh, et
SHLEN (nom) code> ne fonctionnera pas Très bien, à moins que la chaîne contienne déjà une c-string correctement terminée! Cela ne fait rien d'autre que de compter tous les caractères jusqu'au premier caractère null.