8
votes

C ++ équivalent pour memset sur char *

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);


1 commentaires

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) 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.


7 Réponses :


11
votes

Un remplacement possible pour Memset Lorsque vous avez un tableau de types d'objets consiste à utiliser le std :: remplir algorithme. Il fonctionne avec des gammes d'itérateurs et des pointeurs dans des tableaux.

memcpy Les appels peuvent généralement être remplacés par des appels sur std :: copier .

Par exemple, xxx

memset et memcpy 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 et n'utilisant pas d'objet de gestion des ressources. Il est beaucoup préférable d'utiliser un std :: string ou un std :: vecteur de sorte que la classique de la mémoire est automatique et que le code est plus sûr.


1 commentaires

STD :: Fill_N Peut-être une meilleure correspondance que de remplir. Sinon, bonne réponse, +1 :)



1
votes

Si vous faites simplement une manipulation de chaîne, utilisez la chaîne.


0 commentaires

12
votes

En général, il y a std :: remplir . http://www.cplusplus.com/reference/algorithm/fref/

ou dans cet exemple particulier, vous devez envisager d'utiliser std :: vecteur .

(Notez que Memset peut toujours être utilisé dans C ++ si vous utilisez #include , bien qu'il soit moins idiomatique en C ++.)


0 commentaires

2
votes

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.

Ce n'est pas un non-non à utiliser memcpy et memset lorsque leur utilisation est appropriée. Pourquoi devrait-il être?

Il y a std :: copier en C ++ qui copie un ensemble d'éléments (fonctionne sur n'importe quel type et non seulement char * ) d'un itérateur à un autre.


2 commentaires

Mais l'utilisation est-elle appropriée lorsqu'elle peut être remplacée par le code std :: remplir ?


@jalf: Il ne fait aucun doute que std :: remplir doit être préféré à memset en général quand il peut être utilisé . 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 ++.



2
votes

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 ++.

Je ferais cependant fortement encourager l'utilisation de std :: string pour la manipulation de chaîne en C ++.


0 commentaires

1
votes

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";


0 commentaires

-3
votes
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.

1 commentaires

C'est faux. La ligne commentée n'est pas équivalente à Nommer [0] = '\ 0'