2012-06-03 2 views
2

J'ai copié un fichier HTML dans un tableau en utilisant le code suivant:Programmation C: Remplacer une chaîne interne en utilisant strcpy?

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 de la chaîne ombles déjà défini « roi ». Par exemple. !

< code html> < commentaire> < plus de code html>

à

< code html> king < plus code html>

Im en utilisant 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 passés 'king' ont été effacés .. comme si elle ajoutait automatiquement un caractère de fin. Comment puis-je résoudre ce problème afin 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'a pas été ajouté. Est-ce la meilleure méthode?

Répondre

3

Vous ne pouvez pas faire cela, à moins que les choses que vous voulez remplacer soient exactement de la même taille. Dans ce cas, vous pouvez utiliser memcpy ou .

Si les tailles sont différentes, vous pouvez essayer quelque chose le long des lignes de:

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; 
+0

merci. Je pensais que –

+0

ne devrait pas être 'find_pointer + strlen (text2find)'? – Dave

3

Eh bien, strcpy ajoute un 0-terminateur. Ainsi, bien que le reste de la chaîne reste en place, les fonctions de gestion de chaîne standard ne le voient plus car elles s'arrêtent au 0-terminator. Vous pouvez l'écraser manuellement avec un espace ou utiliser memcpy au lieu de strcpy.

+0

ou de manière équivalente strncpy? –

+0

Oui, ou cela. Celui que tu préfères. –

+1

Cela ne correspond pas au problème beaucoup plus important que cette stratégie ne fonctionnera que si les chaînes de recherche et de remplacement ont la même longueur. Ce qui, dans ce cas, ils ne sont pas. – tobyodavies

0

D'abord, vous devez utiliser strncpy (ou, mieux encore, strlcpy si elle est disponible) car il effectue en fait la vérification des limites (c.-à- , il ne copie qu'un nombre spécifié de caractères). Sinon, vous risquez de tenter de copier la mémoire au-delà de la fin de la chaîne de destination, ce qui entraîne un comportement indéfini et potentiellement destructeur. Deuxièmement, même si vous deviez utiliser une fonction comme strncpy ou 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 la chaîne que vous êtes essayer de copier.

+0

correct, il se trouve que dans html je viens d'ajouter quelques espaces pour les faire de la même longueur –

1

Remplacer des caractères dans une chaîne C est douloureux, car vous effectuez des manipulations à un niveau très bas, par rapport à, disons, C++. Vous avez littéralement besoin d'élaborer un algorithme pour cela! Tout d'abord, notez que le remplacement sur 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 de toute façon, donc vous pouvez procéder comme suit:

  • Trouver la longueur de la chaîne après le remplacement. Pour cela, vous devez trouver le début et la fin du commentaire que vous remplacez, et faites le calcul.
  • Ensuite, vous allouez un nouveau morceau de mémoire pour le résultat et vous le marquez en mémoire jusqu'au point de remplacement.
  • Maintenant, vous copiez la chaîne de remplacement, et enfin la partie finale de la source dans le résultat
  • Enfin, vous libérez le tampon de la chaîne source et renvoyez le résultat.
+0

merci. Skyel a dit quelque chose de similaire et posté du code. à la vôtre –