2 votes

Programmation C : Remplacer une chaîne intérieure en utilisant strcpy ?

J'ai copié un fichier HTML dans un tableau en utilisant le code suivant :

fseek(board, 0, SEEK_END);
long int size = ftell(board);
rewind(board);
char *sourcecode = calloc(size+1, sizeof(char));
fread(sourcecode, 1, size, board);

Maintenant, mon objectif est de remplacer un certain commentaire dans le tableau par la chaîne de caractères 'king' déjà définie. Par exemple

< code html>< !comment>< plus de code html>

à

<< code html>king< plus de code html>

J'utilise le code suivant :

    find_pointer = strstr(sourcecode, text2find);
    strcpy(find_pointer, king);
    printf("%s", sourcecode);

où text2find = "< !comment>" ;

Cependant, lorsque j'imprime, il est évident que tous mes caractères après 'king' ont été effacés comme s'il ajoutait automatiquement un caractère de fin. Comment puis-je corriger cela pour que le code html reste en place ?

EDIT:::: : J'ai utilisé strncpy et défini un nombre de caractères tel que le caractère de fin n'était pas ajouté. Est-ce la meilleure méthode ?

4voto

skyel Points 273

Vous ne pouvez pas faire ça, à moins que les éléments que vous voulez remplacer soient exactement de la même taille. Dans ce cas, vous pouvez utiliser soit memcpy o strncpy .

Si les tailles sont différentes, vous pourriez essayer quelque chose du genre :

char *buffer = malloc(size); // size should be big enough to store the whole final html code
find_pointer = strstr(sourcecode, text2find);
len = find_pointer - sourcecode;
memcpy (buffer, sourcecode, len);
memcpy (buffer + len, "king", 4);
memcpy (buffer + len + 4, find_pointer + 4, strlen(sourcecode) - len - strlen(text2find)); 
free(sourcecode);
sourcecode = buffer;

3voto

Daniel Fischer Points 114146

Bien, strcpy ajoute un terminateur 0. Ainsi, bien que le reste de la chaîne reste en place, les fonctions standard de traitement des chaînes ne la voient plus car elles s'arrêtent au terminateur 0. Vous pouvez soit l'écraser manuellement avec un espace, soit utiliser la fonction memcpy au lieu de strcpy .

1voto

dasblinkenlight Points 264350

Remplacer des caractères dans une chaîne de caractères C est pénible, car vous effectuez des manipulations à un niveau très bas, comparé à, disons, C++. Vous devez littéralement élaborer un algorithme pour cela !

Tout d'abord, notez que le remplacement à la place n'est pas toujours possible : si la sous-chaîne que vous remplacez est plus courte que le remplacement, vous devrez allouer plus de mémoire. Il est plus facile d'allouer la mémoire pour le résultat dans les deux cas, vous pouvez donc procéder comme suit :

  • Trouvez la longueur de la corde après le remplacement. Pour cela, vous devez trouver le début et la fin du commentaire que vous remplacez, et faire le calcul.
  • Ensuite, vous allouez un nouveau morceau de mémoire pour le résultat, et vous y placez la source jusqu'au point de remplacement.
  • Maintenant vous copiez la chaîne de remplacement, et finalement la partie finale de la source dans le résultat.
  • Enfin, vous libérez le tampon de la chaîne de caractères source, et vous retournez le résultat.

0voto

Greg E. Points 1977

Tout d'abord, vous devez utiliser strncpy (ou, mieux encore, strlcpy si elle est disponible) parce qu'elle effectue réellement une vérification des limites (c'est-à-dire qu'elle ne copie qu'un nombre spécifié et fourni de caractères). Sinon, vous pourriez tenter de copier de la mémoire au-delà de la fin de la chaîne de caractères de destination, ce qui entraînerait un comportement non défini et potentiellement destructeur. Deuxièmement, même si vous utilisez une fonction telle que strncpy o memcpy pour éviter de copier le caractère nul final, votre chaîne de destination ne serait pas correctement formatée car la chaîne que vous essayez d'écraser a une longueur différente de celle de la chaîne que vous essayez de copier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X