7
votes

Manière correcte vers un espace malloc pour une chaîne, puis insérez des caractères dans cet espace?

J'ai deux cordes, str1 et str2. Je veux la concaténation d'eux sur un espace dans le tas. I Malloc espace pour eux en utilisant:

strcat(concat, str1);
strcat(concat, str2);

c

0 commentaires

3 Réponses :


5
votes

Vous voulez faire un Strcpy, puis un strcat:

strcpy(concat, str1);
strcat(concat, str2);


0 commentaires

5
votes

Je ferais personnellement les éléments suivants:

size_t length = strlen(str1) + strlen(str2) + 1;
char *concat = malloc(sizeof(char) * length);

if(concat == NULL)
{
    // error
}

snprintf(concat, length, "%s%s", str1, str2);


3 commentaires

+1 pour mentionner le chèque d'erreur. SNPRINTF () est souvent une bonne solution, même si elle borde-t-elle sur la surkill ici.


N'utilisez pas SHLEN pour calculer la longueur. Utilisez longueur = snaprintf (0,0, "% s% s", str1, str2); ou simplement utiliser asprintf (et assurez-vous d'inclure votre propre version - c'est Un wrapper trivial autour de snapintf - pour les systèmes qui n'incluent pas cette extension GNU).


Justification du commentaire de R sur lui-même ici (doit lire pour comprendre les conseils): Stackoverflow.com/a/5615561/340236



14
votes

Qu'est-ce que strcat (Dest, src) est réellement la recherche d'un octet null commençant par Dest et sur l'avenir, puis écrivez le src String là-bas.

Après MALLOC , le contenu de la mémoire n'est pas défini, votre code actuel pourrait donc faire un certain nombre de choses, la plupart d'entre elles sont incorrectes. Si vous faites concat [0] = 0 avant le Strcat S, alors votre code fonctionne mais devra rechercher la longueur de str1 trois fois - une fois pour strlen , encore une fois pour le premier strcat , et dernier pour le second strcat .

cependant, je recommande d'utiliser memcpy: xxx

ceci tire parti du fait que vous savez dès le début où vous voulez les octets des deux chaînes aller et combien il y a.


2 commentaires

+1 Certainement un très bon moyen de le faire. J'utiliserais probablement memmove () plutôt que memcpy () car, bien que memcpy () soit sûr dans cette situation, ce n'est pas toujours Coffre-fort mais Memmove () est toujours sûr.


N'utilisez pas MemMove ici; c'est confu. Toute utilisation de MemMove devrait servir à documenter que vous faites quelque chose de très différent et inhabituel. Si je voyais MemMove Ici, je passerais une minute ou deux tentative de déterminer pourquoi le # * $ @ quelqu'un l'a utilisé et si quelque chose de paisible se déroulait ...