IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

chercher, remplacer avec une condition


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 16
    Points : 19
    Points
    19
    Par défaut chercher, remplacer avec une condition
    Bonjour,

    En guise de fonction chercher/remplacer, j'ai utilisé celle donnée ici : http://www.daniweb.com/code/snippet216517.html

    La chaine de caractère que je veux modifier est en fait une requête pour une base de données Sqlite. Dans cette requête, je veux doubler les apostrophes au milieu des mots mais pas les apostrophes qui délimitent chaque entrée. Pour cela, j'ai voulu tester si l'apostrophe était derrière un signe '=', devant une virgule ou à la fin de la chaine et dans ce cas, sauter l'occurence.

    J'avais donc modestement pensé écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    char *str_replace(const char *src, const char *from, const char *to)
    {
      size_t size = strlen(src) + 1;
      size_t fromlen = strlen(from);
      size_t tolen = strlen(to);
      char *value = malloc(size);
      char *dst = value;
     
      if ( value != NULL )
        {
          for( ;; )
    	{
    	  const  char *match = strstr(src, from);
              //Si une occurence est trouvée, on teste le caractère précédent et le suivant pour savoir si on réalise le remplacement de from par to
    	  if (match != NULL && !!strncmp(match-1,"=",1) && !!strncmp(match+1,",",1) && !!strncmp(match+1,"\0",1))
    	    {
    	      size_t count = match - src;
    	      char *temp;
    	      size += tolen - fromlen;
    	      temp = realloc(value, size);
    	      if (temp == NULL)
    		{
    		  free(value);
    		  return NULL;
    		}
    	      dst = temp + (dst - value);
    	      value = temp;
    	      memmove(dst, src, count);
    	      src += count;
    	      dst += count;
    	      memmove(dst, to, tolen);
    	      src += fromlen;
    	      dst += tolen;
    	    }
    	  else
    	    {
    	      strcpy(dst, src);
    	      break;
    	    }
    	}
        }
      return value;
    }
    Mais la condition du 2e if ne semble jamais remplie. Or en testant juste la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(!!strncmp(match-1,"=",1) && !!strncmp(match+1,",",1) && !!strncmp(match+1,"\0",1))
    J'obtiens bien la réponse voulue, c'est-à-dire que j'obtiens bien les valeurs TRUE et FALSE aux bons moments suivant les différentes occurences de la chaine testée. Une chaine qui pourrait être par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE people SET name='Paul',observation='C'est n'importe quoi'
    Deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE people SET name='Paul',observation='C''est n''importe quoi'
    Je ne comprends pas pourquoi ce n'est pas le cas dans la fonction complète et j'ai donc besoin de votre aide pour savoir ce que je fais mal.

    Merci pour votre aide !

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bonjour,

    - Pourquoi mettre un double ! ?

    - Tu veux faire "Si ce n'est pas nul, alors si le caractère avant est un '=' ou le caractère après est une virgule ou le caractère après est la fin".

    Ton test est donc faux, écrit comme tu le fais.

    Ecrit plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (match != NULL && match > src &&
        ( (*(match-1)) == '=') || (*(match + 1)) == ',') || (*(match+1)) == '\0'))
    Cela sera plus clair.

Discussions similaires

  1. sed remplacer avec une condition
    Par atchopba dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/11/2014, 10h01
  2. Problème avec une condition
    Par ghan77 dans le forum Débuter
    Réponses: 2
    Dernier message: 16/12/2005, 16h18
  3. Réponses: 3
    Dernier message: 24/10/2005, 13h47
  4. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 11h56
  5. envoyer submit avec une condition !
    Par delphinote dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 01/07/2005, 15h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo