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 :

supprimer un caractere


Sujet :

C

  1. #1
    Membre régulier Avatar de solawe
    Inscrit en
    Juillet 2006
    Messages
    368
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2006
    Messages : 368
    Points : 97
    Points
    97
    Par défaut supprimer un caractere
    salut,
    je cherche si il y a une fonction en C qui supprime un caractere d'une chaine donnee( comme RemoveString en java).

    merci

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Rien de tel en C, tu peux retrouver le caractère à supprimer avec la fonction strchr, le reste bin tout dépend, tu peut par exemple décaler les caracteres suivant de -1 à chaque fois par exemple, enfin y'a plusieures méthodes pour faire ca
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    effectivement, le mieux est sans doute de retrouver ton caractère, puis de décaler tous les caractères suivant d'un cran à gauche.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par m@rki
    je cherche si il y a une fonction en C qui supprime un caractere d'une chaine donnee( comme RemoveString en java).
    Une utilisation correcte de memmove() permet ça. Attention, la chaine doit être modifiable. (gcc : compiler avec -Wwritable-string évite de faire des bêtises...)
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    Un petit code sans memmove() pour le décalage.
    Ce qui est bien quand il s'agit de supprimer, c'est que bien fait, ça peut se faire aussi bien "sur place" que d'une chaîne à l'autre...
    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
    #include <stddef.h>
     
    size_t str_remove_chars(
     char *dest,       //[out] Destination buffer. MUST be at least as long as src.
     char const *src,  //[in] Source string. Can be equal to dest.
     char const *chars //[in] Chars to remove.
     )
    {
    	size_t iSrc,iDest;
    	char c;
    	for(iSrc=0,iDest=0 ; (c=src[iSrc]) != '\0' ; iSrc++)
    	{
    		if(strchr(chars, c)==NULL)
    			dest[iDest++] = c;
    	}
    	dest[iDest] = '\0';
    	return iDest;
    }
     
    #ifdef TESTING
    #include <stdio.h>
     
    void TestStrings(void)
    {
    char str1[] = "Frédéric";
    char dest[sizeof(str1)/sizeof(str1[0])];
     
    size_t res1 = str_remove_chars(dest, str1, "r");
    size_t res2 = str_remove_chars(str1, str1, "é");
    printf("dest = \"%s\" (%u chars).\n", dest, (unsigned int)res1);
    printf("str1 = \"%s\" (%u chars).\n", str1, (unsigned int)res2);
    }
    #endif
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Moi j'allais proposer ce code (désolé j'étais oocupé ailleurs ) :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    int main (void)
    {
       char str [30] = { "Supprimer le #diese" };
       char * pr = NULL; /* Pointeur de lecture. */
       char * pw = NULL; /* Pointeur d'ecriture. */
     
     
       printf ("%s\n", str);   /* La chaine avant modifications. */
       pr = strchr (str, '#'); /* Recherche du caractère a supprimer. */
     
     
       if (pr != NULL)
       {
          /*
           * On place le pointeur d'ecriture a la meme adresse que
           * le pointeur de lecture pour commencer le decalage.
           */
          pw = pr;
     
     
          while (*pr != 0)
          {
             pr++;       /* On decale le pointeur de lecture d'une case. */
             *pw = *pr;  /* Ecriture du caractere courant a sa nouvelle adresse. */
             pw++;       /* On decale le pointeur d'ecriture d'une case. */
          }
       }
     
     
       printf ("%s\n", str);   /* La chaine apres modifications. */
     
     
       return EXIT_SUCCESS;
    }
    Tu vois ED, cette fois j'ai pensé aux pointeurs
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 375
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 375
    Points : 41 543
    Points
    41 543
    Par défaut
    C'est vrai, j'aurais pu utiliser directement les pointeurs au lieu de mettre des index.
    Mais ma fonction à moi retourne la nouvelle longueur de chaîne, na!

    PS: J'ai bien dit longueur et non pas taille de la chaîne.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre régulier Avatar de solawe
    Inscrit en
    Juillet 2006
    Messages
    368
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2006
    Messages : 368
    Points : 97
    Points
    97
    Par défaut
    merci pour toutes vos reponses,
    moi je lis les caractere d'un fichier et il faut que je supprime quelque caractere particulier,mon probleme mnt c'est que je sais pas comment modifier le texte du meme fichier,cad je supprime mon caractere et je decale la suite car mon fichier et en ecriture je peux pas l'ouvrir en lecture et en ecriture.
    ce que je fais pour le moment c que j'ecris mon flux de caracetre qui reste dans un nouveau fichier ouvert en ecriture.

    donc,y a pas une solution pour lire et ecrire a partir et dans le meme fichier?

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par m@rki
    merci pour toutes vos reponses,
    moi je lis les caractere d'un fichier et il faut que je supprime quelque caractere particulier,mon probleme mnt c'est que je sais pas comment modifier le texte du meme fichier,cad je supprime mon caractere et je decale la suite car mon fichier et en ecriture je peux pas l'ouvrir en lecture et en ecriture.
    ce que je fais pour le moment c que j'ecris mon flux de caracetre qui reste dans un nouveau fichier ouvert en ecriture.

    donc,y a pas une solution pour lire et ecrire a partir et dans le meme fichier?
    Il fallait le dire plus tôt que tu voulais faire ça dans un fichier...

    je cherche si il y a une fonction en C qui supprime un caractere d'une chaine donnee
    Le principe est bien connu. Le fichier original A en lecture ("r"), un fichier de copie B en écriture ("w"). On copie les octets de A vers B avec une boucle fgetc() / fputc(), en repérant (comptant, comparant...) les caractères à ne pas copier. Quand c'est le cas, tout simplement, on omet de faire la copie et voila. Le caractère est supprimé. Quand c'est fini, on ferme les fichiers.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Le principe est bien connu. Le fichier original A en lecture ("r"), un fichier de copie B en écriture ("w"). On copie les octets de A vers B avec une boucle fgetc() / fputc(), en repérant (comptant, comparant...) les caractères à ne pas copier. Quand c'est le cas, tout simplement, on omet de faire la copie et voila. Le caractère est supprimé. Quand c'est fini, on ferme les fichiers.
    Ou alors, si on ne veux pas créer un deuxième fichier, on l'ouvre en lecture seul pour charger le contenu dans un buffer, puis on le ferme. On réalise les modifications voulues en utilisant la fonction proposée par Médinoc ou Franck.H, puis on sauve dans le fichier ouvert en écriture.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mujigka
    Ou alors, si on ne veux pas créer un deuxième fichier, on l'ouvre en lecture seul pour charger le contenu dans un buffer, puis on le ferme. On réalise les modifications voulues en utilisant la fonction proposée par Médinoc ou Franck.H, puis on sauve dans le fichier ouvert en écriture.
    C'est beaucoup plus complexe, pas toujours possible (taille mémoire) et ne permet pas l'annulation...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. [Access] supprimer 2 caractères dans un enregistrement
    Par survivor1 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h19
  2. Supprimer les caracteres du style \xc2 d'une chaine.
    Par InDaWinD dans le forum Général Python
    Réponses: 2
    Dernier message: 27/04/2006, 13h34
  3. [VBA-E]comment supprimer un caractere affiché
    Par bill7 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/03/2006, 11h23
  4. [DB2] supprimer les caractere spéciaux
    Par guin dans le forum DB2
    Réponses: 1
    Dernier message: 17/01/2005, 16h34
  5. Réponses: 4
    Dernier message: 19/06/2004, 22h28

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