Aide sur memcmp

Aide sur memcmp - C - Programmation

Marsh Posté le 27-09-2011 à 10:39:21    

Bonjour à tous,
 
Voici mon code source dans lequel j'ai deux problèmes probablement liés :  
 
void Remplace(char *strChaine,char *strRecherche,char *strRemplace)
{
 char *pstrChaine,*pstrResultat;
 long nLongRecherche,nLongRemplace;
 char strResultat[4096];
 
 memset(strResultat,0,sizeof(strResultat));
 
 pstrChaine  =strChaine;
 pstrResultat=strResultat;
 
 nLongRecherche=strlen(strRecherche);
 nLongRemplace =strlen(strRemplace);
 
 while (pstrChaine!=NULL)
 {
   
 
  if(!memcmp(pstrChaine,strRecherche,nLongRecherche))
  {
   pstrChaine=pstrChaine + nLongRecherche;
   memmove(pstrResultat,strRemplace,nLongRemplace);
   pstrResultat=pstrResultat + nLongRemplace;
  }
  else
  {
   *pstrResultat=*pstrChaine;
   pstrChaine++;
   pstrResultat++;
  }
 }
 strcpy(strChaine,strResultat);
}

 
Principe de la fonction : Remplace dans ma chaine strChaine la chaine strRecherche par la chaine strRemplace
 
J'ai un problème de core dumped sur cette fonction et plus précisement (grâce à gdb) au niveau de la ligne if(!memcmp(pstrChaine,strRecherche,nLongRecherche)).
 
En analysant j'ai deux problèmes, d'une part le while ne s'arrète jamais d'où le core dumped et d'autre part j'ai l'impression que le memcmp ne marche pas.
 
Voici comment la fonction est appelée :  
 
strRequete[4096];
memset(strRequete, 0, sizeof(strRequete));
...
...
..
 
Remplace(strRequete,"min(","" ); // en gros je supprime le min( de ma requête
 
 
Merci d'avance pour votre aide
 
 
 
 

Reply

Marsh Posté le 27-09-2011 à 10:39:21   

Reply

Marsh Posté le 27-09-2011 à 14:45:20    

Bon finalement j'ai corrigé le problème.
J'ai remplacé la ligne du while : while (pstrChaine!=NULL)  
par : while (pstrChaine[0])
 
du coup ma boucle s'arrète bien à la fin de la chaîne de caractère et je n'ai plus de core dumped.
 
Maintenant je ne sais toujours pas pourquoi le premier ne marche pas alors qu'il me semblait correct.
 
Concernant mon problème au niveau du memcmp, bah en fait il y en a pas, ça marche nickel c'est juste que je lisais mal la log  :heink:  
 
Si quelqu'un sait pourquoi le "while (pstrChaine!=NULL)" ne marchait pas je suis preneur.
 
Merci d'avance  
 

Reply

Marsh Posté le 27-09-2011 à 15:09:10    

pstrChaine est l'adresse mémoire d'un caractère, donc ce n'est jamais nul.
 
Il aurait fallu écrire *pstrChaine pour dire de prendre le contenu à l'adresse mémoire indiqué par pstrChaine.
 
L'écriture toto[n] est équivalente à *(toto + n).

Message cité 1 fois
Message édité par olivthill le 27-09-2011 à 15:09:30
Reply

Marsh Posté le 27-09-2011 à 16:12:05    

olivthill a écrit :

pstrChaine est l'adresse mémoire d'un caractère, donc ce n'est jamais nul.
 
Il aurait fallu écrire *pstrChaine pour dire de prendre le contenu à l'adresse mémoire indiqué par pstrChaine.
 
L'écriture toto[n] est équivalente à *(toto + n).


 
Donc si j'ai bien compris, à partir du moment où mon pointeur a été initialisé et que je fais déplacé celui-ci "bloc par bloc" il aura toujours comme valeur l'adresse mémoire d'un caractère.
 
OK c'est noté  ;)  
 
Encore merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed