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

  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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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').

  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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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.

  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 expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 652
    Points : 1 669
    Points
    1 669
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    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.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    J'ai relu tous les post et les modes d'emploi en français et en anglais.
    Je fais ce que je peux, et je suis le seul dans le groupe d'étudiants qui éprouve de la difficulté pour comprendre fgets : Je ne comprends toujours pas combien il faudrait en saisir après avoir définis à 5 une variable svp ? Je ne visualise pas là où il y a incohérence comme vous dites...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char srecherchee[5]; // 5 car je cherche 4 + 'c'  puisque qu'il faut 5 indices pour la chaine qui contiendra 'x','x','x','x','c','\n','\0'
    char sremplacement[5];
     
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, ..., stdin); // indiquer 6 ou 5+1 ???  le +1 pour le '\0' svp ?
     printf("Entrez une sous chaine de 4 caracteres pour le remplacement : \n"); 
     fgets(sremplacement, ..., stdin); // indiquer 6 ou 5+1 ???


    Concernant l'idée de tailler à 255+1 je préfère pour le moment etre au clair avec ce que je ne pige pas avec fgets car j'ai bien lu ceci :
    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é).
    sauf que je préfère d'abord piger la fonction fgets sinon je vais vraiment tout mélanger...


    Par ailleurs, j'apprendrai la méthode "MVC" (Modèle, Vue, Controleur) l'année prochaine en cours pour rendre les fonctions plus modulables et je reposerai cette question plus tard (probablement ici dans 'Débutant').
    Je reste ouvert à toute proposition avec la méthode MVC si quelqu'un veut me montrer clairement à partir d'un exemple ce que c'est sur base de cette exo, je le garderai au chaud et j'y reviendrai plus tard car là je galère toujours pour fgets...

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    et je suis le seul dans le groupe d'étudiants qui éprouve de la difficulté pour comprendre fgets
    Putain c'est pourtant pas compliqué: tu demandes fgets(..., X, ...) il t'en charge X-1 car il garde une place pour le 0.
    Donc d'abors tu définis ta chaine. Tu réfléchis à combien tu as besoin, et tu n'oublies pas aussi qu'il faut stocker le 0.
    Puis tu appelles fgets() en te souvenant que lui il t'en charge un de moins que demandé.

    Citation Envoyé par environnementBash Voir le message
    Je ne comprends toujours pas combien il faudrait en saisir après avoir définis à 5 une variable svp ?
    Puisque dans ta variable à 5 tu dois garder une place pour le 0, mais puisque fgets() garde lui-aussi cette place (et que tu n'as pas besoin d'en garder 2), à toi de trouver. Si c'est trop dur à visualiser ben tu prends un papier, tu dessines des cases et tu les remplis.

    Citation Envoyé par environnementBash Voir le message
    Je ne visualise pas là où il y a incohérence comme vous dites...
    L'incohérence (qui se situait dans ton premier code) pour ch1 tu définis à N et tu saisis N+1. Pour srecherche tu définis à 5 et tu saisis 5. Tu ne visualises vraiment pas le souci ???

    Citation Envoyé par environnementBash Voir le message
    char srecherchee[5]; // 5 car je cherche 4 + 'c' puisque qu'il faut 5 indices pour la chaine qui contiendra 'x','x','x','x','c','\n','\0'
    Déjà 'x','x','x','x','c','\n','\0' ça fait 7 !!!
    Donc 5 car 4 caractères saisis plus un pour le '\0'. Le 'c' il n'a pas à être stocké dans la chaine puisque tu le cherches manuellement.

    Citation Envoyé par environnementBash Voir le message
    Je reste ouvert à toute proposition avec la méthode MVC si quelqu'un veut me montrer clairement à partir d'un exemple ce que c'est sur base de cette exo, je le garderai au chaud et j'y reviendrai plus tard car là je galère toujours pour fgets...
    Déjà expliqué: la fonction de remplacement ne fait que le remplacement, pas la saisie.
    La saisie, elle, se fait ailleurs (dans le cas présent, probablement dans le main()).

  10. #10
    Invité
    Invité(e)
    Par défaut
    Putain t'as raison pour le dessin. donc là j'ai pigé car je comptais les indices au lieu de compter les éléments et en plus je ne devais pas y stocker 'c' dedans puisque je le cherchais manuellement.

    Donc j'ai dessiné et voilà ce qu'il faut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    char srecherchee[5]; // 'x','x','x','x','\0' donc 1 2 3 4 5
    char sremplacement[5];
     
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, 3 , stdin); // je dois en saisir 3 car la fonction fgets aussi rajoute un '\0' c'est-à-dire 5-2
     printf("Entrez une sous chaine de 4 caracteres pour le remplacement : \n"); 
     fgets(sremplacement, 3 , stdin); // je dois en saisir 3 car la fonction fgets aussi rajoute un '\0' c'est-à-dire 5-2


    tant que j'y suis, à ce propos :

    Citation Envoyé par Sve@r Voir le message
    Bonjour

    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)).

    Et pourquoi pas en rajoutant le signe '=' comme ceci ? while (indlect <= (lgChaine - 5)).

    Je ne trouve pas dans les manuels ce que c'est mais un collègue à moi préconise ce <= en disant que cela permettrait de mieux comprendre 'tant qu'il reste au moins 5 caractères avant la fin de chaîne' pour faire attention au 'c'



    mise à jour : ou alors je devrais écrire 4+1 pour en saisir autant dans le fgets ? 4 pour 6-2 en fait..
    Dernière modification par Invité ; 24/11/2022 à 16h37.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, 3 , stdin); // je dois en saisir 3 car la fonction fgets aussi rajoute un '\0' c'est-à-dire 5-2
    Donc tu en veux 4, tu en demandes 3 à fgets() qui, elle, t'en enlève 1. Combien tu en obtiens à l'arrivée???
    Et c'est quoi ce "-2"??? D'où a-t-il été question de "-2" quelque part? Accessoirement si tu en demandes 3 et qu'elle t'en enlève 2 tu ne vas pas en obtenir des masses à l'arrivée.

    Citation Envoyé par environnementBash Voir le message
    Et pourquoi pas en rajoutant le signe '=' comme ceci ? while (indlect <= (lgChaine - 5)).
    Tout à fait. J'avais écrit "<" en me basant sur l'autre exo mais effectivement il faut aller jusqu'à l'égalité. Si la chaine fait 5 caractères, elle peut contenir xxxxc donc il faut qu'elle soit évaluée donc quand indlect vaut 0 il faut quand-même entrer dans la boucle.
    D'ailleurs il se pourrait que l'autre exo soit alors faux (ou en tout cas, ne gère pas le cas extrème "la chaine se trouve à la fin")...

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Donc tu en veux 4, tu en demandes 3 à fgets() qui, elle, t'en enlève 1. Combien tu en obtiens à l'arrivée???
    Il aurait fallu l'expliquer comme à un enfant en âge d'aller à l'école primaire pour que je puisse comprendre... Je comprends ici qu'il faut simplement ecrire 5 pour en saisir 4 puisque la fonction fgets() fait automatiquement -1

    voici donc ce que j'estime correct : écrire 5 (sans faire +1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char srecherchee[5]; // 'x','x','x','x','\0' donc 1 2 3 4 5
    char sremplacement[5];
     
     printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
     fgets(srecherchee, 5 , stdin);
     printf("Entrez une sous chaine de 4 caracteres pour le remplacement : \n"); 
     fgets(sremplacement, 5 , stdin);
    si je ne piges pas ça j'abandonne


    Citation Envoyé par Sve@r Voir le message
    Tout à fait. J'avais écrit "<" en me basant sur l'autre exo mais effectivement il faut aller jusqu'à l'égalité. Si la chaine fait 5 caractères, elle peut contenir xxxxc donc il faut qu'elle soit évaluée donc quand indlect vaut 0 il faut quand-même entrer dans la boucle.
    D'ailleurs il se pourrait que l'autre exo soit alors faux (ou en tout cas, ne gère pas le cas extrème "la chaine se trouve à la fin")...
    Merci pour cette précision

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    Il aurait fallu l'expliquer comme à un enfant en âge d'aller à l'école primaire pour que je puisse comprendre...
    Tu n'as plus l'âge d'aller au primaire.

    Citation Envoyé par environnementBash Voir le message
    si je ne piges pas ça j'abandonne
    Ok, là c'est bon. On remarquera toutefois que c'était ce que tu avais écrit au tout début dans ton tout premier code. Et jamais je ne t'ai dit que c'était mauvais !!! Au contraire j'ai pris cet exemple correct pour te montrer en quoi la saisie de ch1, elle, était mauvaise. Mais comme dans une bd d'Iznogood (quand un des personnages dit au génie "regarde mon frère est aveugle et sourd et moi normal c'est injuste" le génie transforme le personnage en aveugle et sourd) tu as travaillé à l'envers.

    Maintenant, tu remplaces par
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char srecherchee[255+1];
    printf("Entrez une sous chaine de 4 caracteres a rechercher : \n");
    fgets(srecherchee, 255+1 , stdin);
    srecherchee[4]='\0';

  14. #14
    Invité
    Invité(e)
    Par défaut
    C'est noté. Merci beaucoup pour les infos.

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    Je reste ouvert à toute proposition avec la méthode MVC si quelqu'un veut me montrer clairement à partir d'un exemple ce que c'est sur base de cette exo, je le garderai au chaud et j'y reviendrai plus tard
    Code c : 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
    #include <stdio.h>
    #include <string.h>
     
    void saisie(char* const, const char* const, const size_t, const size_t);
    size_t remplace(char*, const char* const, const char* const, const char);
     
    #define N	(128)
    #define R	(4)
     
    int main() {
    	char chaine[N + 1];
    	saisie(chaine, "Chaine de base", N, 0);
     
    	char orig[R + 1];
    	saisie(orig, "Chaine à trouver", R, R);
     
    	char rempl[R + 1];
    	saisie(rempl, "Chaine à remplacer", R, R);
     
    	size_t n;
    	if ((n=remplace(chaine, orig, rempl, 'c')) != 0)
    		printf("Chaine remplacée [%s] (rempl=%lu)\n", chaine, n);
    	else
    		printf("Chaine non modifiée [%s]\n", chaine);
    	return 0;
    }
     
    void saisie(char* const s, const char* const prompt, const size_t max, const size_t min) {
    	char tmp[255 + 1];
    	while (1) {
    		if (prompt) printf("%s\n", prompt);
    		printf("Entrez une chaine de %lu caractères :", max); fflush(stdout);
    		fgets(tmp, 255 + 1, stdin);
    		char *pt;
    		if ((pt=strchr(tmp, '\n')) != NULL) *pt='\0';
    		if (strlen(tmp) >= min) break;
    		printf("Pas assez de lettres dans [%s] (%lu) !!!\n", tmp, strlen(tmp));
    	}
    	strncpy(s, tmp, max);
    	s[max]='\0';
    }
     
    size_t remplace(char* s, const char* const orig, const char* const rempl, const char end) {
    	size_t len=strlen(s);
    	if (len <= R) return 0;
     
    	size_t n=0;
    	size_t i=0;
    	while (i < (len - R)) {
    		if (strncmp(s, orig, R) == 0 && s[R] == end) {
    			strncpy(s, rempl, R);
    			i+=(R+1);
    			s+=(R+1);
    			n++;
    		}
    		else {
    			i++;
    			s++;
    		}
    	}
    	return n;
    }

  16. #16
    Invité
    Invité(e)
    Par défaut
    Merci d'avoir pris le temps de partager un programme qui m'a l'air bien réfléchit dès le début (notamment au niveau du préprocesseur) et qui apportera de la clarté pour faciliter ma compréhension du C lors des moments de lecture de manuel ou de mode d'emploi.


    Juste un truc, pourquoi avoir défini 2 fois const size_t dans les paramètre de saisie svp ?

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par environnementBash Voir le message
    Juste un truc, pourquoi avoir défini 2 fois const size_t dans les paramètre de saisie svp ?
    Valeur max et valeur min. Pour la chaine de base je lui en offre 128 mais s'il n'en rentre que 10 je suis d'accord. Mais pour les chaines à chercher et à remplacer, si je lui dis d'en rentrer 4 il doit en rentrer 4, pas moins.

  18. #18
    Invité
    Invité(e)
    Par défaut
    C'est noté, merci beaucoup.

+ 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