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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut remplacer une occurrence d'une sous-chaîne contenant 4 caractères par une autre sous-chaîne contenant 4 caract
    Bonjour à tous, on est étudiants on se donne à fond en C et on voudrait bien avoir votre avis sur ce code svp car on galère un peu.

    la consigne :
    "
    Remplacer, au sein d’une chaîne de caractères originale (ici ch1), toute occurrence (apparition) d'une sous-chaîne contenant 4 caractères par une autre sous-chaîne contenant également 4 caractères.

    Les 2 sous-chaînes devront être initialisées au clavier par l'utilisateur qui aura la possibilité de le faire, pour chaque sous-chaîne, avec les caractères de son choix. Le nombre de remplacements effectués devra également pouvoir être récupéré et affiché.
    ATTENTION: le remplacement ne sera effectuée dans la chaîne d'origine que si le caractère qui suit l'apparition de la sous-chaîne recherchée dans la chaîne originale vaut 'c'. (c minuscule).
    "
    On ne comprend/visualise pas vraiment la phrase qui commence par 'ATTENTION'... Merci pour celui qui voudra nous l'expliquer à sa manière...


    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #define N 128
     
     
    int remplace (char * );
     
    int main(int argc, char *argv[])
    {
     char ch1 [N];
     int nbremplacement;
     
     printf(" Entrez la chaine originale contenant maximum %d caracteres :\n\n ", N - 1);
     fgets(ch1, N+1, stdin);
     nbremplacement = remplace (ch1);
     
    if (nbremplacement)
     {
     printf("Voici le nombre de remplacement(s) effectue(s) : %d\n", nbremplacement);
     printf("Chaine modifiee :");
     puts(ch1);
     }
     else
     printf("La chaine originale n'a pas ete modifiee.\n"); 
     
     system("PAUSE");
     return 0;
    }
     
     
     
    int remplace (char * s)
    {
     int cpt = 0;
     char srecherchee[5], sremplacement[5];
     
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, 4+1, stdin); //gets(srecherchee);
     printf("Entrez une sous chaine de 4 caracteres pour le remplacement : \n");
     fgets(sremplacement, 4+1, stdin);
     
     while (*(s + 4)) // on ne sait pas comment l'écrire autrement
     
     {
     if 
    ( 
     s[0] == srecherchee[0]
     && s[1] == srecherchee[1]
     && s[2] == srecherchee[2]
     && s[3] == srecherchee[3] 
     && s[4] == ['c'] 
    ) // on se demande si il faudrait ici indiquer 'c' entre crochet svp ?
     
    {
     s[0] = sremplacement[0];
     s[1] = sremplacement[1]; 
     s[2] = sremplacement[2];
     s[3] = sremplacement[3]; 
     s = s + 4;
     cpt++;
    } 
     
     else
     s++;
     } 
     
     
     return cpt; 
     
    }
    Merci de nous avoir lu

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par environnementBash Voir le message
    On ne comprend/visualise pas vraiment la phrase qui commence par 'ATTENTION'... Merci pour celui qui voudra nous l'expliquer à sa manière...
    Si la chaine à remplacer vaut "xxxx", alors elle ne sera remplacée que si elle est suivie d'un 'c'. Donc si la chaine d'origine contient "....xxxxc...." Si la chaine d'origine contient "....xxxxy...." ça ne marche pas.

    Citation Envoyé par environnementBash Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char ch1 [N];
     int nbremplacement;
     
     printf(" Entrez la chaine originale contenant maximum %d caracteres :\n\n ", N - 1);
     fgets(ch1, N+1, stdin);
    Tu as bien suivi mon conseil concernant fgets() mais tu as oublié, dans la déclaration, la place pour le '\0' => char ch1[N+1]. Et dans le message d'invite, il faut offrir N caractères à la saisie et non pas N-1.
    En plus tu y as pensé pour l'autre, tu as besoin de 4 caractères dans srecherchee tu la définis à 5, tu mets un fgets() à 5 et tu préviens bien d'en saisir 4 !!!
    Donc pour N c'est la même chose, tu as besoin de N tu définis à N+1, tu mets un fgets() à N+1 et tu préviens d'en saisir N.

    Citation Envoyé par environnementBash Voir le message
    while (*(s + 4)) // on ne sait pas comment l'écrire autrement
    C'est la même chose que dans l'exo où il fallait supprimer 4 caractères. Le but est de balayer toute la chaine mais en s'arrêtant 4 caractères avant la fin. Non, 5 en fait car il faut que le 5° soit un 'c'.
    Donc while (indlect < (lgChaine - 5)).

    Citation Envoyé par environnementBash Voir le message
    // on se demande si il faudrait ici indiquer 'c' entre crochet svp ?
    Hé non, les crochets indiquent un accès à un tableau. Ici tu veux juste regarder si le 5° caractère du tableau s (donc là il y a des crochets) vaut le caractère 'c'. Donc if (s[4] == 'c').
    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]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci Sve@r pour toutes ces informations . Est-ce que je peux vous demander si le code est ainsi correct svpc ar j'ai mis en caractères gras là où j'ai apporté des modifications en essayant de comprendre vos remarques pertienentes.

    à ce sujet, je ne comprends pas très bien à quoi fait référence la phrase que vous avez écrite : l'autre quoi exactement svp ? la fonction remplace ou l'exercice d'un autre post svp ?
    "
    En plus tu y as pensé pour l'autre, tu as besoin de 4 caractères dans srecherchee tu la définis à 5, tu mets un fgets() à 5 et tu préviens bien d'en saisir 4 !!!
    "

    Aussi une dernière question, où est-ce qu'il faudrait définir et initialiser la var indlect si je devrais le citer pour la boucle while svp ?

    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
    #include <stdio.h>
    #include <stdlib.h>
    #define N 128
    
    
    int remplace (char * );
    
    int main(int argc, char *argv[])
    {
     char ch1 [N+1]; //+1 pour la place pour le '\0'
     int nbremplacement;
     
     printf(" Entrez la chaine originale contenant maximum %d caracteres :\n\n ", N ); // offrir N caractères à la saisie et non pas N-1
     fgets(ch1, 4+1, stdin); // partie que j'ai pas bien compris "tu mets un fgets() à N+1 et tu préviens d'en saisir N"
     nbremplacement = remplace (ch1);
     
    if (nbremplacement)
     {
     printf("Voici le nombre de remplacement(s) effectue(s) : %d\n", nbremplacement);
     printf("Chaine modifiee :");
     puts(ch1);
     }
     else
     printf("La chaine originale n'a pas ete modifiee.\n"); 
     
     system("PAUSE");
     return 0;
    }
    
    
    
    int remplace (char * s)
    {
     int cpt = 0;
     char srecherchee[5], sremplacement[5];
     
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, 4+1, stdin); //gets(srecherchee);
     printf("Entrez une sous chaine de 4 caracteres pour le remplacement : \n");
     fgets(sremplacement, 4+1, stdin);
    
     while (indlect < (lgChaine - 5)) //donc il faudrait déclarer et initialiser quelque part indlect ?
     {
     if 
    ( 
     s[0] == srecherchee[0]
     && s[1] == srecherchee[1]
     && s[2] == srecherchee[2]
     && s[3] == srecherchee[3] 
     && s[4] == 'c' // pas besoin de crochet car je ne cherche pas à accéder au tableau ici 
    ) // je veux juste regarder si le 5e caractère du tableau s (donc s[4]) vaut (donc ==) le caractère 'c'.
     
    {
     s[0] = sremplacement[0];
     s[1] = sremplacement[1]; 
     s[2] = sremplacement[2];
     s[3] = sremplacement[3]; 
     s = s + 4;
     cpt++;
    } 
    
     else
     s++;
     } 
    
    
     return cpt; 
    
    }
    Merci.


    PS. : je pense qu'il y a une parenthèse fermante de trop dans votre précédent post : un ')' à la fin de la phrase suivante :
    Donc while (indlect < (lgChaine - 5)).)


    mise à jour : je ne comprends pas pourquoi il n'y a pas de couleur dans mon code. J'ai pourtant bien mis les balises

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    fgets(ch1, 4+1, stdin); // partie que j'ai pas bien compris "tu mets un fgets() à N+1 et tu préviens d'en saisir N"
    Tu as tellement bien compris que tu en fais saisir 4 !!!

    Citation Envoyé par environnementBash Voir le message
    à ce sujet, je ne comprends pas très bien à quoi fait référence la phrase que vous avez écrite : l'autre quoi exactement svp ? la fonction remplace ou l'exercice d'un autre post svp ?
    "L'autre" fait référence à la notion principale de ce paragraphe, donc l'autre fgets(). D'autant plus que ma phrase se continue par une citation de srecherche donc "l'autre" fait référence à fgets(srecherche).
    En plus j'ai mis deux phrases similaires l'une sous l'autre, la première se référant à ch1 et l'autre se référant à srecherche, la similarité étant là pour te montrer les différences de traitement que tu fais entre les deux fgets().
    Pour ch1 tu définis à N et tu saisis N+1. Pour srecherche tu définis à 5 et tu saisis 5. Il y a là incohérence. Donc l'une des deux façons de faire est incorrecte. En réfléchissant sur le fait que
    • il faut toujours penser que la chaine que tu définis devra contenir un '\0' en plus de ce que tu veux y mettre
    • fgets() fait saisir un de moins que demandé (car lui il rajoute le '\0' sur la case suivante celle contenant le dernier caractère saisi)

    ... tu sauras laquelle des deux est correcte et laquelle ne l'est pas.

    Citation Envoyé par environnementBash Voir le message
    Aussi une dernière question, où est-ce qu'il faudrait définir et initialiser la var indlect si je devrais le citer pour la boucle while svp ?
    Tu n'as pas appris qu'en C on définit les variables avant de les utiliser??? Si je te donne une mini-exemple contenant une nouvelle variable, c'est en partant du principe évident que tu devras la définir et que tu es censé savoir le faire. Et n'oublie pas non plus lgChaine.
    Et maintenant qu'on peut définir des variables n'importe où (auparavant il fallait impérativement les définir au début du bloc), on aime bien les définir au plus proche de leur utilisation. Donc juste avant le while().

    Citation Envoyé par environnementBash Voir le message
    je ne comprends pas pourquoi il n'y a pas de couleur dans mon code. J'ai pourtant bien mis les balises
    Tu as forcé des effets de gras. Dans ce cas, comme tu as mis des effets manuellement, la zone d'affichage du code du forum considère que tu veux gérer le tout et te laisse réellement tout gérer, y compris les couleurs.

    Maintenant il y a un gros souci auquel je n'avais pas pensé: la fonction fgets() ne fait aucun filtrage de ce qui est tapé. Tu tapes "Hello" puis tu valides par <return>, la chaine contiendra alors 'H', 'e', 'l', 'l', 'o', '\n' et '\0' (le '\n' représentant le <return> tapé).
    Solution: tu définis ta chaine plus large (exemple char srecherche[256]) et tu écris, après la saisie (que tu définis dans fgets() à 256, pas à 5 !!!), srecherche[4]='\0' comme ça tu peux entrer ce que tu veux (enfin jusqu'à 255) mais seuls les 4 premiers caractères sont pris en considération (en présumant évidemment que l'utilisateur en rentrera effectivement 4 avant de valider).

    Autre détail; en prog professionnelle on aime bien séparer les choses. Si une fonction doit remplacer, alors elle remplace, elle ne fait rien d'autre et surtout pas saisir les chaines. Celles-ci sont saisies ailleurs et sont passées à la fonction en paramète. Autrement dit, la saisie doit se faire dans le main() et la fonction doit simplement recevoir les 3 chaines et faire le remplacement.
    Cela rend les fonctions plus modulables. Ainsi les chaines pourront être saisies au clavier, provenir d'un fichier, etc.
    On appelle ça la méthode "MVC" (Modèle, Vue, Controleur). La Vue c'est la saisie/affichage. Le Controleur c'est tout ce qui est calcul/travail et le Modèle (non utilisé ici) c'est tout ce qui est stockage.
    En faisant en sorte que chaque fonction ne s'occupe que de sa partie MVC, on peut en changer plus facilement.
    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]

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai compris mes erreurs. Je comptais le 'c' au moment remplacer alors qu'il ne fallait pas. Dans ma tête je cherchais à réécrire le 'c' alors que ce n'était pas demandé dans la consigne.

    Je pense que c'est ocrrect ainsi :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     char srecherchee[4], sremplacement[3];   //3 car il ne faut pas compter le 'c' ici pour remplacer
     
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, 4+1, stdin); // +1 pour le '\0'
     printf("Entrez une sous chaine de 4 caracteres pour le remplacement : \n"); 
     fgets(sremplacement, 3+1, stdin); // +1 pour le '\0'


    Un retour svp ?

  6. #6
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 792
    Par défaut
    Hello,

    Rien de tel que de lire le mode d'emploi d'une fonction: pour fgets(), c'est ici (en anglais). C'est un réflexe à prendre.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 841
    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 841
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    Je pense que c'est ocrrect ainsi :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     char srecherchee[4];
     fgets(srecherchee, 4+1, stdin); // +1 pour le '\0'
    Taillé à 4 et saisie à 4+1 !!! Ca veut vraiment pas rentrer hein ???

    Citation Envoyé par environnementBash Voir le message
    Citation Envoyé par Sve@r Voir le message
    Si la chaine à remplacer vaut "xxxx", alors elle ne sera remplacée que si elle est suivie d'un 'c'. Donc si la chaine d'origine contient "....xxxxc...." Si la chaine d'origine contient "....xxxxy...." ça ne marche pas.
    Un retour svp ?
    sremplacement doit aussi en faire 4. Tu cherches 4 + 'c' (donc 5) mais tu remplaces les 4 par 4 autres comme je l'ai dit au début.
    Parce que remplacer 4 par 3 c'est faire à la fois
    • du remplacement
    • du décalage de ce qui reste

    Et en réalité il serait mieux qu'ils soient taillés à quelque chose comme 255+1 permettant, comme je l'ai dit dans mon précédent post, d'en saisir 255 ce qui, au-moins, ne laissera pas des caractères en trop dans stdin si l'utilisateur tape "titititoto" quand on lui demande d'en saisir 4.
    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: 1
    Dernier message: 13/01/2016, 23h34
  2. [Débutant] Remplacer une sélection avec des caractères "*" par un autre
    Par canardav77 dans le forum VB.NET
    Réponses: 6
    Dernier message: 26/10/2012, 16h29
  3. [AC-2010] Remplacer caractères par d'autres dans une chaîne
    Par Invité dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/05/2011, 11h03
  4. Remplacer un caractère par un autre dans une String
    Par djack44 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 12/03/2008, 15h16
  5. Réponses: 3
    Dernier message: 21/07/2007, 01h48

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