permettre à l’utilisateur de modifier une chaîne de caractères [C] - C - Programmation
Marsh Posté le 05-12-2022 à 14:48:26
Dommage qu'il soit obligé d'utiliser gets, cette fonction ne devrait plus être utilisée.
http://pwet.fr/man/linux/fonctions_bibliotheques/gets/
Citation : |
Par ailleurs, le début de ton programme comporte des erreurs :
- ligne 12 : ton printf est faux. Le N-1 doit être à l'extérieur des guillemets.
- ligne 15 : ton test va forcément échouter car nbremove est initialisée à 0 en ligne 11 et n'est pas modifiée ensuite.
Pour tes 2 fonctions remove et remplace :
- elles ne sont pas appelées pour le moment, elles ne vont donc rien faire.
- pour la fonction remove :
* ligne 32 à 34, tu demandes de saisir 3 caractères, mais ton tableau fait une taille 4. Attention au débordement de tableau comme expliqué précédemment, et cela suppose donc qu'on saisit 3 caractères sans espace, et seulement 3. Le premier est donc l'élément 0, le second 1, et le 3eme 2, tandisque que le dernier ( 4eme) est le caractère fin de ligne du tableau.
* ensuite dans ta boucle, tu compares avec xrecherchee[1] qui est le second caractère, or, c'est le premier qu'il te faut. ( ligne 39 )
* ton test ligne 36 va aller trop loin. En effet, lg contient la longeur de ta chaine. Par exemple "abcdef" , lg vaut 6. Par contre, les index de ton tableau vont de 0 à 5.
* ligne 47 , tu peux écrire x[indecrit++] = x[indlect++]; le ++ sera fait après chaque instruction.
* enfin, en faisant comme ça, tu ne vas pas décaler le caractère fin de ligne ( '\0' ). Il te manque quelque chose du genre x[indecrit] = '\0' à la fin de la boucle.
* la boucle entre 59 et 62 me fait dire que tu n'as peut être pas tout compris. Tu répètes des choses que tu as déjà faites auparavant. De plus indlect n'étant pas réinitialisé à 0, il commence à la fin de lg, donc il ne se passera rien ici en fait.
- pour la fonction remplace,
* idem remove, c'est xrecherchee[1]et xrecherchee[2] et non 2 et 3.
* tu ne lis pas sur l'entrée standard tes caractères, donc les tests suivants ne fonctionneront pas. Alors que tu as lu les 3 caractères avec ta fonction précédente, mais tu ne te sers que tu premier. Je pense que tu devrais lire les 3 caractères en dehors des fonctions, et ensuite tu passes en paramètres des 2 fonctions les caractères voulus. Par exemple :
-> int recherche( char*x , char remove ) { ... }
-> int remplace ( char*x , char from, char to ) { ... }
* ligne 78 , comme expliqué précédemment tu declares xrecherchee mais c'est un tableau non initialisé. Je suppose que tu penses que vu que ca a le même nom, ca a été modifié dans la fonction précédente ( xrecherchee[4] ) mais pas du tout, ce sont 2 variables différentes , quand bien même elles sont le même nom, elles sont déclarées localement à chaque fonction, leur scope (portée , existence ) se limite à la fonction.
* la suite est forcément fausse, même si la logique ne l'est pas complètement ( lg n'est pas non plus initialisée, c'est aussi une autre variable que celle dans "remove" )
* ligne 79, tu mets dans x3 quelque chose qui n'existe pas ( xremplacement n existe pas ) et tu ne te sers pas de x3. Ligne fausse et inutile
Bon courage
Marsh Posté le 06-12-2022 à 20:50:31
Merci pour tes précieux commentaires Oui je suis d'accord sur le fait qu'il soit dommage d'utiliser gets()....
Puis-je avoit un retour sir ce code svp ? :
Code :
|
Marsh Posté le 07-12-2022 à 16:26:08
Bonjour,
Quelques petites erreurs, voici la version corrigée pour que ça "compile" :
Code :
|
en vrac :
- ligne 8 et 9 : prototypes de fonction incorrects
- ligne 18 : mauvaise variable déclarée 2 fois, il manque work par contre.
- ligne 15 : guillemet au mauvais endroit
- ligne 24 26 29 31 : il faut mettre des %s %d pour que les variables s'affichent, de plus guillemet manqueant ligne 29
- après ligne 69 : manque accolade fermante
Tu peux tester ton code ici : https://www.onlinegdb.com/
tu verras qu'il y a plein de warnings
Marsh Posté le 04-12-2022 à 22:37:00
Bonjour,
Je suis en train d'apprendre la programmation en C et j'ai essayé de faire l'exercice ci-dessous (voir la consigne de du formateur) et j'aimerais avoir des retours svp
Voici la consigne de notre formateur concernant l'exercice à faire à la maison :
1) A l’aide du "squelette" de la fonction "main" fournit, définissez l’en-tête et le corps de la (ou des) fonction(s) permettant à l’utilisateur du programme de modifier une chaîne de caractères originale (ici ch1) avec les fonctionnalités suivantes :
- toutes les apparitions au sein de la chaîne originale, d’un premier caractère entré au clavier par l’utilisateur devront être éliminées ;
- toutes les apparitions au sein de la chaîne originale d’un deuxième caractère entré au clavier par l’utilisateur devront être remplacées par un troisième caractère, lui aussi saisi au clavier par l’utilisateur.
Vous avez la garantie que l’utilisateur saisira toujours 3 caractères différents.
Insérez également les appels de vos fonctions et les variables nécessaires au sein de la fonction "main".
Exemple :
Chaîne originale saisie : « CAractere »
1er caractère saisi : ‘e’
2ème caractère saisi : ‘a’
3ème caractère saisi : ‘u’
Chaîne originale modifiée : « CAructr »
ATTENTION : Pour cet exercice, la seule fonction de la librairie C que vous pouvez utiliser est la fonction strlen.
Commentez votre programme si nécessaire.
Attention, je dois utiliser gets() et donc je n'ai pas besoin d'utiliser fgets() à sa place pour cet exercice, même si cela aurait été plus pertinent.
Voici ce que je suis parvenu à faire :
Merci de m'avoir lu