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 :

Fonction qui enlève les lettres en doubles dans une chaîne


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Fonction qui enlève les lettres en doubles dans une chaîne
    Bonjour,

    Je viens de réaliser un petit code pour enlever les lettres en double dans une chaîne.

    On passe la chaîne que l'on veut traiter en entrée et ça nous ressort la chaîne purgée. exemple :

    chaîne en entrée : "programme" -> chaîne en sortie : "progame".

    Toutefois j'aurais deux questions :

    - Mon programme fonctionne mais n'y a t'il pas de faire quelque chose de plus "jolie" et mieux codé ? (je sais bien sur que oui , mais comment ?)
    - Pourquoi quand je rentre des chaînes "longues" sur windows il me sort des erreurs alors que sur mon FreeBSD je n'ai pas de souci. (vous trouverez les exemples plus bas) Est-ce un problème d'allocation mémoire ?

    Le code source
    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
    45
    46
    47
    48
    49
    50
    51
    52
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main (int argc, char *argv[])
    {
        if (argc != 2)
        {
     
     
            printf("Utilisation : %s mot\n", argv[0]);
            return EXIT_FAILURE;
        }
        char *key = NULL;
        key = malloc(strlen(argv[1])*sizeof(char*));
        if (key == NULL)
            return EXIT_FAILURE;
     
     
        memset(key, 0, strlen(key)*sizeof(char*));
        int i,j;
     
        int pos_car = 0;
        int dont_print;
        key[0] = argv[1][0];
        for (i = 0; i < (int)strlen(argv[1]); i++)
        {
            dont_print = 0;
     
            j = i-1;
            if (j < 0)
                j = 0;
     
            for (; j >= 0; j--)
            {
                if (argv[1][i] == argv[1][j])
                {
                    dont_print +=1;
                }
            }
     
            if (dont_print == 0)
            {
                key[pos_car+1] = argv[1][i];
                pos_car+=1;
            }
     
        }
     
        printf("\n\n%s\n%s", key,argv[1]);
        return 0;
    }

    Le retour Windows
    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
    Microsoft Windows XP [version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.
    
    C:\Documents and Settings\Bart>cd Bureau
    
    C:\Documents and Settings\Bart\Bureau>test programme
    
    
    progame
    programme
    C:\Documents and Settings\Bart\Bureau>test "voyons voir que fait ce programme"
    
    
    voyns irquefatcpgmocuments and Settings\Bart
    voyons voir que fait ce programme
    Sortie FreeBSD : 
    voyns irquefatcpgm
    voyons voir que fait ce programme
    
    C:\Documents and Settings\Bart\Bureau>test "voyons voir ça"
    
    
    voyns irþa
    voyons voir þa
    C:\Documents and Settings\Bart\Bureau>
    Merci à vous.

  2. #2
    Membre éclairé
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Points : 842
    Points
    842
    Par défaut
    Citation Envoyé par _-Slash-_ Voir le message
    - Mon programme fonctionne mais n'y a t'il pas de faire quelque chose de plus "jolie" et mieux codé ? (je sais bien sur que oui , mais comment ?)
    On peut toujours faire mieux
    Ce que j'aurais fait c'est créer un tableau de 128 cases (ASCII) (ou 256 pour l'étendu) et à chaque fois que tu rencontres une lettre tu incrémentes la case correspondante à ta lettre. Si celle-là vaut 0 c'est qu'elle n'est pas présente, dans l'autre cas elle est présente et on la supprime (càd on incrémente pas notre compteur).

    D'ailleurs tu veux la taille d'un char et non d'un char* dans ton malloc.
    Tu utilises plusieurs fois strlen, pourquoi ne pas créer une variable pour éviter les appels successifs ?
    Ton memset ne sert à rien. Il suffit de terminer ta chaîne par un '\0' à la fin de ton programme ^^

    Bon courage

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci,

    Je vais faire les quelques changements indiqués.

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/05/2015, 12h21
  2. Réponses: 6
    Dernier message: 18/01/2012, 17h25
  3. [XL-2003] Supprimer les cellules en double dans une colonne
    Par Mimosa777 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/05/2010, 21h49
  4. Réponses: 7
    Dernier message: 03/04/2008, 22h31
  5. Réponses: 4
    Dernier message: 04/05/2007, 22h49

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