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 :

Remplacement de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut Remplacement de caractères
    Bonjour à tous


    Voilà, je vous explique le problème:

    Je souhaiterais que mon interface, dès qu'elle voit le mot "H5" dans le fichier C, remplace ce mot par "H11 "dans le fichier D

    Voici le fichier C.txt :

    (SQCE 9 O T5 FRAISAGE GORGE INTERIEURE DIAM 6 L7.25)
    G54G806T5X0Y0Z15B90H5C0D5S2000P[#610]R0
    M8
    F300
    M70(DESERRAGE AXE B)
    M72(DESERRAGE AXE C)
    ()


    et moi, grâce à mon code, j’obtiens ceci :

    (SQCE 9 O T5 FRAISAGE GORGE INTERIEURE DIAM 6 L7.25)
    G54G806T5X0Y0Z15B90H110D5S2000P[#610]R0
    M8
    F300
    M70(DESERRAGE AXE B)
    M72(DESERRAGE AXE C)
    ()


    Comme vous pouvez le constater, le dernier "1" du "H11" remplace le "C" dans la ligne.

    Voici donc ce que je souhaiterais obtenir dans le fichier D.txt (je voudrais garder le "C") :

    (SQCE 9 O T5 FRAISAGE GORGE INTERIEURE DIAM 6 L7.25)
    G54G806T5X0Y0Z15B90H11C0D5S2000P[#610]R0
    M8
    F300
    M70(DESERRAGE AXE B)
    M72(DESERRAGE AXE C)
    ()



    Je travail avec code::blocks et son langage C.

    Vous trouverez en pièce jointe mon code source (Interface GO.c) et au cas où, vous trouverez également le fichier C à traiter (Fichier C.txt) et ce que je souhaiterais obtenir dans mon fichier D (Fichier D.txt).

    Merci d'avance pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i = 0 ; i < (z - 2) ; i++)
    {
    	if (tableau[i] == 'H' && tableau[i+1] == '5' )
    	{
    		tableau [i+1] = '1' ;
    		tableau [i+2] = '1' ;
    	}
    }
    C'est normal que cela ne fonctionne pas. Dès qu'on a trouvé "H5", on écrase les deux caractères qui suivent H. Du coup, si on a "H5C0", cela se transforme en "H110".

    Comme tu es obligé d'insérer un caractère en plus à chaque fois, il faut décaler la chaine d'un cran vers la droite à partir du caractère suivant H, puis écraser les deux caractères suivant H par "11".
    Si on a "(...)90H5C0(...)", on décale ce qui suit H d'un cran à droite, ce qui donne : "(...)90H55C0(...)". Puis on écrase les deux caractères qui suivent H par "11", ce qui donne : "(...)90H11C0(...)".
    Mais il faut bien sûr être certain que ton tableau soit suffisamment gros pour qu'il n'y ait pas de débordement sinon y a un risque de crash. Une alternative est d'allouer de la mémoire dynamique, et de l'agrandir au fur et à mesure si nécessaire.

    Attention, ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    do
    {
    	tableau[z] = fgetc( fichier_A);
    	if (tableau[z] == 24) {
    		printf("Aïe !!! Il va falloir trouver un autre caractère de remplacement !");
    		exit(2);
    	}
    	z++;
    } while ( tableau[z-1] != EOF);
    Tu compares un char avec la constante EOF !

  3. #3
    Membre averti
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut
    D'accord, mais sachant que je suis débutant en programmation C, aurais tu directement la solution à mon problème car j'ai déjà passé beaucoup de temps sans aboutir à mon problème.

    Merci d'avance.

  4. #4
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    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
    int             rep(char *s)
    {
      char          *b;
     
      b = 0;
      while (*s)
        {
          if (*s == 'H' && *(s + 1) == '5')
            {
              *(s + 1) = '1';
              if (!(b = malloc(strlen(s + 1) * sizeof(char))))
                return (0);
              strcpy(b, s + 2);
              *(s + 2) = '1';
              strcpy(s + 3, b);
              free(b);
            }
          ++s;
        }
     
      return (1);
    }
     
    int main()
    {
      char buffer[512];
     
      memset(buffer, 0, 512);
      strcat(buffer, "G54G806T5X0Y0Z15B90H5C0D5S2000P[#610]R0");
      if (!rep(buffer))
        return (1);
     
      printf("%s\b", buffer);
     
      return (0);
    }
    J'ai fait ce code rapidement, il remplace la premiere occurence de "H5" par "H11".

    A toi de le comprendre et de le modifier pour remplacer toutes les occurences

    PS: Je ne sais pas si le code fonctionne, j'ai fait ca a la va vite.

  5. #5
    Membre averti
    Inscrit en
    Février 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 19
    Par défaut
    Je suis désolé Ironzorg mais ca n'a pas l'air de fonctionner. J'ai essayé en collant ton code dans le mien et j'ai aussi essayer de créer un nouveau code en ajoutant que le tien mais idem, ca ne fonctionne également pas...

    Help me please!!!!

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Un exemple, à adapter selon tes besoins :
    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
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
    	char chaine[1024] = "G54G806T5X0Y0Z15B90H5C0D5S2000P[#610]R0" ;
    	char * occurence ;
     
    	printf ( "Chaine d'origine : %s\n" , chaine ) ;
     
    	occurence = chaine ;
    	while ( ( occurence = strstr ( occurence , "H5" ) ) != NULL )
    	{
    		memmove ( occurence + 1 , occurence , strlen ( occurence ) + 1 ) ;
    		* ( occurence + 1 ) = '1' ;
    		* ( occurence + 2 ) = '1' ;
    		occurence = occurence + 3 ;
    	}
     
    	printf ( "Chaine modifiee  : %s\n" , chaine ) ;
     
    	return 0;
    }

Discussions similaires

  1. Remplacement du caractère ?
    Par Mvu dans le forum ASP
    Réponses: 9
    Dernier message: 06/01/2005, 18h11
  2. Réponses: 11
    Dernier message: 01/12/2004, 19h09
  3. [CR] Chercher et remplacer un caractère dans 1 chaine
    Par franck.cvitrans dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 29/09/2004, 16h42
  4. Fonction permettant de remplacer des caractères
    Par PrinceMaster77 dans le forum ASP
    Réponses: 3
    Dernier message: 06/09/2004, 15h48
  5. Remplacer un caractère
    Par Mvu dans le forum ASP
    Réponses: 5
    Dernier message: 20/07/2004, 09h57

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