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 mot dans une phrase


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Par défaut Remplacement de mot dans une phrase
    Bonjour à tous, je viens vous consulter après mainte recherche car j'ai un problème dans mon code, en faite je demande a l'utilisateur un mot à rechercher dans une phrase et par quel mot il veut le remplacer. Le problème est que dans l'exemple si je marque "long de" et je remplace par longue ça marche très bien!! (plutôt cool :p)

    Mais si je cherche un mot unique exemple "long" ou de plusieurs mots (supérieur à 3) "long de simple" ça plante.

    Bon je vous explique en quelques phrase ce que j'ai voulu faire:

    En clair on suppose que l'utilisateur recherche tjs un mot qui existe puis on recherche où est ce mot grâce a strstr. Ensuite on remet le début de la phrase dans une autre phrase puis on rajoute le mot à la place de l'autre puis on met la fin de la phrase dans la phrase final.

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
     
     
     
    #include <math.h>
    #include <string.h>
    #include <stdio.h>
     
    int main(int argc, char ** argv)
     
    {
     
        char str[100]="texte long de relativement simple long de simple long de plusieurs mots";
        char final[100],test[100];
        char cible[20],remplace[20];
        char bidule[20];
        char bidule2[20];
        char longue;
        int finish=0,premier=0;
        char * pch, * pch1;
        char bidule3[100];
        char * place;
        int i,nbr=0,t=0,nbr2=0,diff,nbr3=0,nbr4=0;
        while (1)
     
        {
     
            //  pch1=nbr;
     
            if (premier==0)
            {
     
                printf ("entrer votre mot rechercher: ");
                fgets(cible,20,stdin);
                printf ("entrer votre mot pour le remplacer: ");
                fgets(remplace,20,stdin);
                printf("remplace :%s",remplace);
     
                for (t=0; t<20; t++)
                {
                    if(cible[t]=='\n' || cible[t]=='\0')
                        t=21;
                    else
                        nbr++;   // permet de compter le nombre de lettre
     
                }
                for (t=0; t<20; t++)
                {
                    if(remplace[t]=='\n'||remplace[t]=='\0')
                        t=21;
                    else
                        nbr2++;  // permet de compter le nombre de lettre
     
                }
     
                diff=nbr-nbr2; // permet de savoir le nombre de lettre qui diffère
                for (i=0; i<nbr; i++)
                {
                    bidule[i]=cible[i];
                }
                for (i=0; i<nbr2; i++)
                {
                    bidule2[i]=remplace[i];
                }
                // pour moi le bug ce trouve principalement ici car dans mes tests
                //mon programme plante là mais je ne comprend vraiment pas
                // pourquoi ça fait cela
     
                for (i=0; i<diff; i++)
                {
                    bidule3[i]=' ';
                }
     
     
                pch = strstr (str,bidule);
                nbr3=pch-str;
     
              //remplacement dans la phrase final
                for (i=0; i<nbr3; i++)
                {
                    final[i]=str[i];
                }
                for (i=0; i<nbr2; i++)
                {
                    final [nbr3+i]=bidule2[i];
                }
     
                for (i=0; str[nbr3+nbr+i]!='\0'; i++)
                {
                    final[nbr3+nbr2+i]=str[nbr3+nbr+i];
                }
                //on met \0 pour etre sur de la fin
                final[nbr3+nbr2+i]='\0';
                longue=nbr3+nbr2+i;
                pch1=0;
                pch1 = strstr (final,bidule);
                nbr4=pch1;
                if (nbr4==0)
                    finish=1;
     
                premier=1;
            }
     
    // si il y plusieurs foi le mot dans la phrase on recommence
            else
            {
     
     
                for (i=0;i<longue;i++)
                {
                    test[i]=final[i];
                }
     
                diff=nbr-nbr2;
                for (i=0; i<nbr; i++)
                {
                    bidule[i]=cible[i];
                }
                for (i=0; i<nbr2; i++)
                {
                    bidule2[i]=remplace[i];
                }
     
                char bidule3[diff];
     
                for (i=0; i<diff; i++)
                {
                    bidule3[i]=' ';
                }
     
     
                pch = strstr (test,bidule);
                nbr3=pch-test;
                for (i=0; i<nbr3; i++)
                {
                    final[i]=test[i];
                }
                for (i=0; i<nbr2; i++)
                {
                    final [nbr3+i]=bidule2[i];
                }
     
                for (i=0; test[nbr3+nbr+i]!='\0'; i++)
                {
                    final[nbr3+nbr2+i]=test[nbr3+nbr+i];
                }
     
                final[nbr3+nbr2+i]='\0';
                pch1=0;
                pch1 = strstr (final,bidule);
                nbr4=pch1;
                if (nbr4==0)
                    finish=1;
     
     
            }
     
            if (finish ==1)
            {
     
     
                printf ("phrase de base: %s\n",str);
                printf ("phrase de final: %s\n",final);
                return 0;
     
            }
        }
     
    }

    Si vous trouvez mon erreur ou vous avez une idée de où ça pourrait venir et me mettre sur la voix je vous en remercierais.

    Cordialement
    Un noob :p

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu n'actives pas les options de warning de ton compilateur (-Wall -Wextra pour gcc & CO) ou alors tu ne tiens pas compte des warnings. Moi j'ai tout ça :
    D:\C\dvpez.c||In function 'main':|
    D:\C\dvpez.c|99|warning: assignment makes integer from pointer without a cast [enabled by default]|
    D:\C\dvpez.c|126|warning: declaration of 'bidule3' shadows a previous local [-Wshadow]|
    D:\C\dvpez.c|23|warning: shadowed declaration is here [-Wshadow]|
    D:\C\dvpez.c|153|warning: assignment makes integer from pointer without a cast [enabled by default]|
    D:\C\dvpez.c|126|warning: variable 'bidule3' set but not used [-Wunused-but-set-variable]|
    D:\C\dvpez.c|24|warning: unused variable 'place' [-Wunused-variable]|
    D:\C\dvpez.c|23|warning: variable 'bidule3' set but not used [-Wunused-but-set-variable]|
    D:\C\dvpez.c|11|warning: unused parameter 'argc' [-Wunused-parameter]|
    D:\C\dvpez.c|11|warning: unused parameter 'argv' [-Wunused-parameter]|
    ||=== Build finished: 0 errors, 9 warnings (0 minutes, 0 seconds) ===|
    
    Les 2 premiers sont très mauvais. Il faut corriger tout cela.

    PS : Mince, je me suis foiré dans le copier-coller. Les numéros indiqués par mon compilateur doit avoir un offset de +3 par rapport au code de ton message.

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

    Je vois que tu utilises la fonction strstr, les fonctions strlen et strcpy te sont-elles interdites ? Elles t'éviteraient pas mal de boucles.

    Évite de nommer tes variables bidule (dont je trouve l'utilité plutôt réduite), c'est pas top côté compréhension de leur rôle D'ailleurs tu n'utilises jamais le contenu de bidule3.

    Le problème que tu as vient des copies de cible vers bidule et de remplace vers bidule : tu oublies de rajouter le '\0' final, ce qui fait que pch = strstr (str,bidule); ne trouve jamais bidule et pch est donc nul. nbr3=pch-str; est donc négatif ce qui fait foirer la suite, et en particulier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    final [nbr3+i]=bidule2[i];
    Dans tes tests, la chaine recherchée existe bien, mais dans le cas où elle n'existerait pas, tu devrais penser à tester le retour pch.

  4. #4
    Nouveau candidat au Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Par défaut
    Winjerome Grand merci à toi je n'avais pas réfléchi au \0 ... 4heure de recherche pour pas grand chose enfin bon quand on débute je suppose que c'est normal, mais encore merci

    strcpy je m'en étais servi au début mais vu que j'ai galéré j'ai remplacé toute les fonctions pour être sure.

    strlen avec le fgets prenait le saut de ligne automatique dans le comptage (enfin je crois)

    Bktero merci à toi aussi d'avoir regardé, c'est vrai que j'aurai pu faire le tri pour éviter autant de warning par contre va vouloir que je fouille pour mieux régler le compilateur car je suis pas sous linux ou max ^^ donc j'ai la configuration de base et je lance pas en ligne de commande. Mais je chercherais ça demain.

    En tout cas merci de m'avoir aider et surtout bravo pour votre rapidité.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Tapin Voir le message
    strlen avec le fgets prenait le saut de ligne automatique dans le comptage (enfin je crois)
    Salut
    Ce n'est pas comme cela qu'il faut raisonner. fgets() stocke tout ce que tape l'utilisateur au clavier. Or, tu ne pourras pas nier que l'utilisateur, pour valider sa saisie, tape sur la touche <enter> qui fait partie du clavier. Donc le contenu du tampon après saisie reste cohérent avec le fonctionnement annoncé de fgets().
    Ensuite strlen() compte tout caractère qui n'est pas '\0'. <enter> n'étant pas '\0', le nombre renvoyé par strlen() reste encore cohérent avec son fonctionnement annoncé.

    Donc il n'y a pas de souci avec strlen(fgets()) ; seulement un souci avec ta gestion de fgets(). Parce que si tu ne veux pas que la zone saisie se termine par un '\n", un des moyens les plus efficaces est de remplacer ce '\n' par un '\0'.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main()
    {
        char saisie[80 + 1];
        char *pt;
     
        fputs("Saisissez un texte :", stdout);
        fgets(saisie, 80 + 1, stdin);
        if ((pt=strrchr(saisie, '\n')) != NULL)
            *pt='\0';
        printf("Le texte saisi est [%s] est fait %d caractères\n", saisie,     strlen(saisie));
    }

    Ensuite, si tu as plusieurs saisies différentes, rien ne t'interdit de déléguer la saisie à une fonction spéciale qui s'occupera de la saisie et de son nettoyage...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. requête pour trouver un mot dans une phrase
    Par FRIGAUX dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/11/2006, 22h18
  3. recherche par mots dans une phrase ou titre
    Par pierrot67 dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/09/2006, 09h29
  4. Recherche d'un mot dans une phrase se touvant dans un champ
    Par Grandbastien dans le forum Access
    Réponses: 3
    Dernier message: 02/04/2006, 09h58

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