demande petite aide pour newbi du C :) - C - Programmation
Marsh Posté le 05-09-2005 à 14:52:49
1. Ne jamais, jamais, jamais utiliser gets(). C'est un bug ambulant cette fonction, et elle est dépréciée depuis quelques années (elle n'est encore là que pour des raisons de compatibilité). Utiliser fgets() à la place.
2. Définition de la fonction lecture() fausse, il faut donner un type à l'argument "t" qu'elle reçoit. Ne pas redéfinir la variable t dans la fonction non plus, relis l'énoncé, tu as fait une erreur. Enoncé qui d'ailleurs est obsolète, car on ne définit plus les fonctions comme ça depuis longtemps:
void lecture(char *t) { |
Relis ton cours, recherche des tutoriaux, et réessaie.
PS : on ne donne pas de programme tout fait sur ce forum, encore moins de réponses à des exercices, juste de l'aide, des exemples, ou des morceaux précis.
EDIT : plein d'edit, a y est c'est fini, désolé j'avais mal lu le sujet.
Marsh Posté le 05-09-2005 à 15:40:45
nDeXok a écrit : je suis en formation de programmeur micro.
|
Une formation qui propose d'écrire une fonction de saisie aussi mal prototypée que gets() [1] n'est pas sérieuse. Change d'urgence d'organisme et fait toi rembourser.
Donne le nom de l'organisme, qu'on le mette en liste noire.
----------------------
[1] et en plus dans un style obsolète depuis 1989
Marsh Posté le 05-09-2005 à 15:56:28
Je fais ça chez Educatel... vous avez un autre organisme à me conseiller en formations à distance ?
Marsh Posté le 05-09-2005 à 15:59:46
nDeXok a écrit : Educatel |
Eh beh !
Marsh Posté le 06-09-2005 à 10:45:47
Emmanuel Delahaye a écrit : Une formation qui propose d'écrire une fonction de saisie aussi mal prototypée que gets() [1] n'est pas sérieuse. Change d'urgence d'organisme et fait toi rembourser. |
C'est assez facile comme conseil. En général, il est difficile de se faire rembourser un truc commencé. Et va donc prouver que cette formation est nulle. Le moins qu'on puisse faire c'est d'essayer de limiter les dégats
nDeXok a écrit : Voici le code que j'ai commencé :
|
Voici les soucis et erreurs (déjà dit par Elmoricq)
1) on ne redéfinit pas le paramètre comme si c'était une nouvelle variable. Il faut seulement le déclarer entre le nom de la fonction et l'accolade ouvrante (relis ton cours sur la syntaxe des fonctions)
Code :
|
2) ce genre de syntaxe (on liste les paramètres puis on les déclare) est périmé depuis qu'on peut faire les deux à la fois
Code :
|
3) la fonction "gets" doit recevoir un "char *". Si tu lui passes "*t", tu lui passes un "char". Ce n'est pas ce qu'elle attend.
Quand tu écris "char *t", tu définis deux item
a) tu définis l'item "etoile t" de type "char"
b) tu définis l'item "t" de type "char étoile"
Les deux item ont leur utilité et sont utilisables (si on le fait correctement)
Donc si la fonction "gets" attend un "char étoile", passe lui un "char étoile" donc passe-lui simplement "t". C'est d'ailleurs ce que tu fais quand tu appelles "lecture" qui attend un "char étoile", tu lui passes "t". Pourquoi changer avec "gets" qui attend la même chose ???
Une fois que tu auras corrigé cela, tu auras répondu à l'énoncé de l'exercice. Le problème c'est que, en utilisant "gets", tu ne limites pas la saisie. Et ainsi ta fonction "lecture" pourra tenter d'engranger plus de caractères que ce que ta zone "t" peut en stocker (et le C ne vérifie pas ça).
Il vaut donc mieux ne pas (ne jamais) utiliser "gets" mais "fgets" qui permet de donner une limite à la saisie.
Marsh Posté le 06-09-2005 à 13:58:34
c'etait quoi l'idée geniale presidant a la creation de la vieille formulation ? (la void truc(t) char *t { ..} )
Marsh Posté le 07-09-2005 à 13:29:41
nDeXok a écrit : merci bien |
moi je dirais que FGETS ben c'est pas encore génial non plus!
faut utilisé GETCHAR()
une petite boucle et c'est parti
Code :
|
Voila le programme est correcte mtn! ;-) quelques petite fautes de frappe vite corrigées
Marsh Posté le 07-09-2005 à 13:30:56
moi23372 a écrit : moi je dirais que FGETS ben c'est pas encore génial non plus!
|
N'oublie quand-même pas de rajouter le '\0' final, sinon ce n'est plus une chaîne !!!
Marsh Posté le 07-09-2005 à 13:40:00
moi23372 a écrit : moi je dirais que FGETS ben c'est pas encore génial non plus! |
Pour quelle raison ?
Marsh Posté le 07-09-2005 à 13:53:22
chrisbk a écrit : pis il est bugueux ce code, nom d'un sexe d'autriche |
Ah oui, je m'étais arrêté au "faut pas utiliser fgets()" moi
C'est vraiment la peine de s'embêter avec un getchar() si c'est pour écrire ce genre de chose.
Marsh Posté le 07-09-2005 à 14:18:05
chacun fait ce qu'il faut! Je ne suis pas certain que FGETS est standars sur tout les compilateurs! Or getchar est standars sur tout les compilo, donc portable!
Mon code n'est pas infesté de bug, même si j'ai oublié une étoile! Elle fait tout ce qu'il faut pour faire une saisie clavier tout simplement!
Marsh Posté le 07-09-2005 à 14:21:38
moi23372 a écrit : faut utilisé GETCHAR() |
Correct ? Non. (Probablement jamais compilé, donc jamais testé...)
Ceci fonctione :
[EDIT] : Nouvelle version sécurisée.
Code :
|
|
[EDIT] Ouin: Pourquoi quand je tape '\n', ça affiche 'n' dans [fixed ] et [cpp ]? C'est nouveau ? Et '\0', ça fait un carré. C'est quoi ce bins!
Marsh Posté le 07-09-2005 à 14:25:25
moi23372 a écrit : chacun fait ce qu'il faut! Je ne suis pas certain que FGETS est standars sur tout les compilateurs! Or getchar est standars sur tout les compilo, donc portable! |
Euh faut arrêter, fgets() c'est du C89, ça fait plus de quinze ans que c'est standard.
moi23372 a écrit : Mon code n'est pas infesté de bug, même si j'ai oublié une étoile! Elle fait tout ce qu'il faut pour faire une saisie clavier tout simplement! |
C'est déjà un bon gros bug.
EDIT : Ah ouais zarb le coup du '\n' dans le [ fixed], je pensais que c'était une erreur de moi686554.
Marsh Posté le 07-09-2005 à 14:32:01
j'aime bien veux bien un gros bug! mais je ne l'ai pas testé, j'ai fais ça de mémoire en 30 secondes!
Mon code marche, je viens de le tester
Code :
|
Marsh Posté le 07-09-2005 à 14:34:55
moi23372 a écrit : j'aime bien veux bien un gros bug! mais je ne l'ai pas testé, j'ai fais ça de mémoire en 30 secondes!
|
Euuh :
char *lecture(char *t, size_t maxlength) |
Et puis ça ne mérite même pas une fonction ce truc.
Marsh Posté le 07-09-2005 à 14:40:17
chrisbk a écrit : Ah nan j'avais pas vu la feinte, rien dit |
Ouais enfin ceci dit, suffit de faire : "LireVchar(NULL, -1);"
Marsh Posté le 07-09-2005 à 14:42:07
oui ça va! quand on veut faire planter un programme il y a tjs moyen! Naturellement faut savoir programmer aussi, passer null c'est une erreur de débutant!
Et puis merde, c'est du C, les fonctions ne sont pas destinées ici à être réutillisé comme les classes! Vive la POO
Marsh Posté le 07-09-2005 à 14:43:47
moi23372 a écrit : Et puis merde, c'est du C, les fonctions ne sont pas destinées ici à être réutillisé comme les classes! Vive la POO |
Ben et les shared-lib, elles servent à quoi alors ?
Marsh Posté le 07-09-2005 à 14:43:47
ne pas vérifier NULL c'est une erreur de jeanjean
bin oui c'est du C, un langage de merde par excellence, tout a fait, enfin meme en C++ faut vérifier les NULL
Marsh Posté le 07-09-2005 à 14:45:08
oui mais la POO dispose des exceptions! Il y a tjs moyen d'intercepter ce genre d'erreur!
Puis il aurait ici suffit simplement de faire
if (t == null || n <= 0)
return -1;
Marsh Posté le 07-09-2005 à 14:51:20
moi23372 a écrit : j'aime bien veux bien un gros bug! mais je ne l'ai pas testé, j'ai fais ça de mémoire en 30 secondes! |
C'est OK, mais ces '-1', c'est un peu compliqué . Et puis comme tu as un index (i), autant utiliser directement la notation [i] et laisser le pointeur tranquille (il n'est jamais bon de modifier un paramètre).
D'autre part, si on passe NULL, le comportement est indéfini.
Marsh Posté le 07-09-2005 à 14:53:15
Elmoricq a écrit :
|
Pas pareil (tu laisses le '\n');
Nota dans les deux cas, stdin n'est pas purgé en cas de débordement. En plus, on a aucun moyen de le savoir.
J'ai integré une purge à mon code. La fonction s'appelle get_line() et elle est libre ! Si on ne veut pas de la purge automatique, on prends fgets()...
Marsh Posté le 05-09-2005 à 14:45:27
Bonjour je suis en formation de programmeur micro. Et comme je débute, j'ai un peu du mal.
Voici l'énoncé de mon exercice :
Ecrire une fonction qui permet d'entrer des caractères du clavier dans un tableau t, y compris espaces et tabulations, ce que ne peut faire l'instruction scanf("%s",t);. L'entrée des caractères se termine par un retour-chariot. La fonction sera définie comme suit :
On prendra le programme principal suivant pour tester la fonction.
Voici le code que j'ai commencé :
#include <stdio.h>
je sais qu'il est bourré de conneries. Quelqu'un peut t'il m'aider ou me filer le code pour que je puisse comprendre avec mon cours svp.
Un grand merci d'avance.