En théorie, oui, mais il manque un paramètre essentiel : la taille
maximale du tableau de char. La saisie ne peut donc être évitée, et
En théorie, oui, mais il manque un paramètre essentiel : la taille
maximale du tableau de char. La saisie ne peut donc être évitée, et
En théorie, oui, mais il manque un paramètre essentiel : la taille
maximale du tableau de char. La saisie ne peut donc être évitée, et
C'est décrit comme ça dans le K&R ...
En théorie, oui, mais il manque un paramètre essentiel : la taille
maximale du tableau de char. La saisie ne peut donc être évitée, et
c'est un trou de sécurité bien connu et imparable.
Combien de fois ai-je lu cette plainte :
"je comprends pas pourquoi mais scanf lit le jour mais pas le mois ?
Comment je fais ?"
Pff... tu te répètes et ça n'a aucun intérêt...
2°) Utilise gets().
Faux. Inciter un débutant à utiliser un trou de sécurité est soit de
l'ignorance soit du sabotage.
et si je tapes 100 caractères, il se passe quoi ? UB. Tout peut
arriver.
:~$ c99 fclc.c
/tmp/ccyhtwXO.o: In function `main':
fclc.c:(.text+0x23): warning: the `gets' function is dangerous and
should not be used.
Tiens tiens ! Jamais tu lis les messages ?
C'est décrit comme ça dans le K&R ...
En théorie, oui, mais il manque un paramètre essentiel : la taille
maximale du tableau de char. La saisie ne peut donc être évitée, et
c'est un trou de sécurité bien connu et imparable.
Combien de fois ai-je lu cette plainte :
"je comprends pas pourquoi mais scanf lit le jour mais pas le mois ?
Comment je fais ?"
Pff... tu te répètes et ça n'a aucun intérêt...
2°) Utilise gets().
Faux. Inciter un débutant à utiliser un trou de sécurité est soit de
l'ignorance soit du sabotage.
et si je tapes 100 caractères, il se passe quoi ? UB. Tout peut
arriver.
candide@candide-desktop:~$ c99 fclc.c
/tmp/ccyhtwXO.o: In function `main':
fclc.c:(.text+0x23): warning: the `gets' function is dangerous and
should not be used.
Tiens tiens ! Jamais tu lis les messages ?
C'est décrit comme ça dans le K&R ...
En théorie, oui, mais il manque un paramètre essentiel : la taille
maximale du tableau de char. La saisie ne peut donc être évitée, et
c'est un trou de sécurité bien connu et imparable.
Combien de fois ai-je lu cette plainte :
"je comprends pas pourquoi mais scanf lit le jour mais pas le mois ?
Comment je fais ?"
Pff... tu te répètes et ça n'a aucun intérêt...
2°) Utilise gets().
Faux. Inciter un débutant à utiliser un trou de sécurité est soit de
l'ignorance soit du sabotage.
et si je tapes 100 caractères, il se passe quoi ? UB. Tout peut
arriver.
:~$ c99 fclc.c
/tmp/ccyhtwXO.o: In function `main':
fclc.c:(.text+0x23): warning: the `gets' function is dangerous and
should not be used.
Tiens tiens ! Jamais tu lis les messages ?
Et alors ? Je ne dis pas le contraire, tu me sors l'argumentaire que je
connais par coeur. T'as jamais joué aux pétards ? Ben il jamais trop
tard. Les entrées/sorties quand tu débutes, c'est du bling-bling, c'est
pour faire semblant, c'est juste pour donner de la "convivialité",
c'est pour que le débutant parte pas trop vite.
Et alors quel est le problème si c'est pour un programme-jouet ?
Quand on débute et qu'on fait des E/S, on se base sur l'adage suivant :
"Always trust user input"
Apprendre fgets correctement est un cauchemar, pas simplement pour le
débutant. Même des programmeurs chevronnés ont des doutes sur la
sémantique de fgets(), voici ce que je le lis en commentaire dans les
sources de CPython :
------------------------
CAUTION: The C std isn't clear about this: in those cases where fgets
writes something into the buffer, can it write into any position beyond
the required trailing null byte?
Pour des saisies au clavier, fgets ne suffit pas, il faut gérer le
buffer de stdin et il faut gérer la conformité de ce qui est capturé
avec ce qui est envoyé ce qui transforme un programme-jouet en un
monstre. Et même pour les besoins les plus triviaux du débutants, fgets
ne donne pas satisfaction car la plupart du temps, l'utilisateur ne veut
pas du 'n' final et par contre il veut le ' ' à sa place ce qui est
compliqué par le fait que, en fonction de l'entier donné en paramètre à
fgets(), le saut de ligne pourra ne pas être capturé. Bref, une prise de
tête pas possible pour saisir une malheureuse date ou un prénom+nom et
qui se trouve être juste un prétexte dans un programme. T'as pas le
temps de te retourner que ton débutant il est déjà parti apprendre
Python ou java ...
Et alors ? Je ne dis pas le contraire, tu me sors l'argumentaire que je
connais par coeur. T'as jamais joué aux pétards ? Ben il jamais trop
tard. Les entrées/sorties quand tu débutes, c'est du bling-bling, c'est
pour faire semblant, c'est juste pour donner de la "convivialité",
c'est pour que le débutant parte pas trop vite.
Et alors quel est le problème si c'est pour un programme-jouet ?
Quand on débute et qu'on fait des E/S, on se base sur l'adage suivant :
"Always trust user input"
Apprendre fgets correctement est un cauchemar, pas simplement pour le
débutant. Même des programmeurs chevronnés ont des doutes sur la
sémantique de fgets(), voici ce que je le lis en commentaire dans les
sources de CPython :
------------------------
CAUTION: The C std isn't clear about this: in those cases where fgets
writes something into the buffer, can it write into any position beyond
the required trailing null byte?
Pour des saisies au clavier, fgets ne suffit pas, il faut gérer le
buffer de stdin et il faut gérer la conformité de ce qui est capturé
avec ce qui est envoyé ce qui transforme un programme-jouet en un
monstre. Et même pour les besoins les plus triviaux du débutants, fgets
ne donne pas satisfaction car la plupart du temps, l'utilisateur ne veut
pas du 'n' final et par contre il veut le ' ' à sa place ce qui est
compliqué par le fait que, en fonction de l'entier donné en paramètre à
fgets(), le saut de ligne pourra ne pas être capturé. Bref, une prise de
tête pas possible pour saisir une malheureuse date ou un prénom+nom et
qui se trouve être juste un prétexte dans un programme. T'as pas le
temps de te retourner que ton débutant il est déjà parti apprendre
Python ou java ...
Et alors ? Je ne dis pas le contraire, tu me sors l'argumentaire que je
connais par coeur. T'as jamais joué aux pétards ? Ben il jamais trop
tard. Les entrées/sorties quand tu débutes, c'est du bling-bling, c'est
pour faire semblant, c'est juste pour donner de la "convivialité",
c'est pour que le débutant parte pas trop vite.
Et alors quel est le problème si c'est pour un programme-jouet ?
Quand on débute et qu'on fait des E/S, on se base sur l'adage suivant :
"Always trust user input"
Apprendre fgets correctement est un cauchemar, pas simplement pour le
débutant. Même des programmeurs chevronnés ont des doutes sur la
sémantique de fgets(), voici ce que je le lis en commentaire dans les
sources de CPython :
------------------------
CAUTION: The C std isn't clear about this: in those cases where fgets
writes something into the buffer, can it write into any position beyond
the required trailing null byte?
Pour des saisies au clavier, fgets ne suffit pas, il faut gérer le
buffer de stdin et il faut gérer la conformité de ce qui est capturé
avec ce qui est envoyé ce qui transforme un programme-jouet en un
monstre. Et même pour les besoins les plus triviaux du débutants, fgets
ne donne pas satisfaction car la plupart du temps, l'utilisateur ne veut
pas du 'n' final et par contre il veut le ' ' à sa place ce qui est
compliqué par le fait que, en fonction de l'entier donné en paramètre à
fgets(), le saut de ligne pourra ne pas être capturé. Bref, une prise de
tête pas possible pour saisir une malheureuse date ou un prénom+nom et
qui se trouve être juste un prétexte dans un programme. T'as pas le
temps de te retourner que ton débutant il est déjà parti apprendre
Python ou java ...
On apprend à utiliser fgets().
On apprend à utiliser fgets().
On apprend à utiliser fgets().
Ni l'un ni l'autre. On s'autorise à utiliser scanf avec le spécifieur %s
et on interdirait pas gets() ? Tu n'as jamais proposé à des débutan ts
d'utiliser scanf avec %s ???
"Always trust user input"
Apprendre fgets correctement est un cauchemar, pas simplement pour le
débutant. Même des programmeurs chevronnés ont des doutes sur la
sémantique de fgets(), voici ce que je le lis en commentaire dans les
sources de CPython :
------------------------
CAUTION: The C std isn't clear about this: in those cases where fge ts
writes something into the buffer, can it write into any position beyond
the required trailing null byte?
Pour des saisies au clavier, fgets ne suffit pas, il faut gérer le
buffer de stdin et il faut gérer la conformité de ce qui est captur é
avec ce qui est envoyé
ce qui transforme un programme-jouet en un
monstre. Et même pour les besoins les plus triviaux du débutants, fge ts
ne donne pas satisfaction car la plupart du temps, l'utilisateur ne veut
pas du 'n' final et par contre il veut le ' ' à sa place ce qui es t
compliqué par le fait que, en fonction de l'entier donné en paramèt re à
fgets(), le saut de ligne pourra ne pas être capturé. Bref, une prise de
tête pas possible pour saisir une malheureuse date ou un prénom+nom e t
qui se trouve être juste un prétexte dans un programme. T'as pas le
temps de te retourner que ton débutant il est déjà parti apprendre
Python ou java ...
Ni l'un ni l'autre. On s'autorise à utiliser scanf avec le spécifieur %s
et on interdirait pas gets() ? Tu n'as jamais proposé à des débutan ts
d'utiliser scanf avec %s ???
"Always trust user input"
Apprendre fgets correctement est un cauchemar, pas simplement pour le
débutant. Même des programmeurs chevronnés ont des doutes sur la
sémantique de fgets(), voici ce que je le lis en commentaire dans les
sources de CPython :
------------------------
CAUTION: The C std isn't clear about this: in those cases where fge ts
writes something into the buffer, can it write into any position beyond
the required trailing null byte?
Pour des saisies au clavier, fgets ne suffit pas, il faut gérer le
buffer de stdin et il faut gérer la conformité de ce qui est captur é
avec ce qui est envoyé
ce qui transforme un programme-jouet en un
monstre. Et même pour les besoins les plus triviaux du débutants, fge ts
ne donne pas satisfaction car la plupart du temps, l'utilisateur ne veut
pas du 'n' final et par contre il veut le ' ' à sa place ce qui es t
compliqué par le fait que, en fonction de l'entier donné en paramèt re à
fgets(), le saut de ligne pourra ne pas être capturé. Bref, une prise de
tête pas possible pour saisir une malheureuse date ou un prénom+nom e t
qui se trouve être juste un prétexte dans un programme. T'as pas le
temps de te retourner que ton débutant il est déjà parti apprendre
Python ou java ...
Ni l'un ni l'autre. On s'autorise à utiliser scanf avec le spécifieur %s
et on interdirait pas gets() ? Tu n'as jamais proposé à des débutan ts
d'utiliser scanf avec %s ???
"Always trust user input"
Apprendre fgets correctement est un cauchemar, pas simplement pour le
débutant. Même des programmeurs chevronnés ont des doutes sur la
sémantique de fgets(), voici ce que je le lis en commentaire dans les
sources de CPython :
------------------------
CAUTION: The C std isn't clear about this: in those cases where fge ts
writes something into the buffer, can it write into any position beyond
the required trailing null byte?
Pour des saisies au clavier, fgets ne suffit pas, il faut gérer le
buffer de stdin et il faut gérer la conformité de ce qui est captur é
avec ce qui est envoyé
ce qui transforme un programme-jouet en un
monstre. Et même pour les besoins les plus triviaux du débutants, fge ts
ne donne pas satisfaction car la plupart du temps, l'utilisateur ne veut
pas du 'n' final et par contre il veut le ' ' à sa place ce qui es t
compliqué par le fait que, en fonction de l'entier donné en paramèt re à
fgets(), le saut de ligne pourra ne pas être capturé. Bref, une prise de
tête pas possible pour saisir une malheureuse date ou un prénom+nom e t
qui se trouve être juste un prétexte dans un programme. T'as pas le
temps de te retourner que ton débutant il est déjà parti apprendre
Python ou java ...
Tiens à propos, tu parles de fgets() dans "ta" faq sur developpez :
http://c.developpez.com/faq/?page=clavier_ecran#CONS_fgets
Tu t'es planté sur le prototype de fgets() : le 2nd paramètre est de
type int et pas size_t. Ça fait des années que ta question est dans
cette FAQ, des milliers de personnes l'ont lu et l'erreur est toujours
là, c'est assez éloquent.
Sinon, tes explications sont imbitables pour celui qui ne connait pas,
c'est vraiment d'une confusion ...
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à c e que
j'ai pu constater.
Dans ta fonction read_stdin(), tu utilises strchr(), pourtant il est
quand même moins couteux d'utiliser strlen() et de se placer en avant
dernière position puisque c'est le seul endroit où 'n' pourrait se
trouver dans le buffer.
Tiens à propos, tu parles de fgets() dans "ta" faq sur developpez :
http://c.developpez.com/faq/?page=clavier_ecran#CONS_fgets
Tu t'es planté sur le prototype de fgets() : le 2nd paramètre est de
type int et pas size_t. Ça fait des années que ta question est dans
cette FAQ, des milliers de personnes l'ont lu et l'erreur est toujours
là, c'est assez éloquent.
Sinon, tes explications sont imbitables pour celui qui ne connait pas,
c'est vraiment d'une confusion ...
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à c e que
j'ai pu constater.
Dans ta fonction read_stdin(), tu utilises strchr(), pourtant il est
quand même moins couteux d'utiliser strlen() et de se placer en avant
dernière position puisque c'est le seul endroit où 'n' pourrait se
trouver dans le buffer.
Tiens à propos, tu parles de fgets() dans "ta" faq sur developpez :
http://c.developpez.com/faq/?page=clavier_ecran#CONS_fgets
Tu t'es planté sur le prototype de fgets() : le 2nd paramètre est de
type int et pas size_t. Ça fait des années que ta question est dans
cette FAQ, des milliers de personnes l'ont lu et l'erreur est toujours
là, c'est assez éloquent.
Sinon, tes explications sont imbitables pour celui qui ne connait pas,
c'est vraiment d'une confusion ...
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à c e que
j'ai pu constater.
Dans ta fonction read_stdin(), tu utilises strchr(), pourtant il est
quand même moins couteux d'utiliser strlen() et de se placer en avant
dernière position puisque c'est le seul endroit où 'n' pourrait se
trouver dans le buffer.
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
A part ça, fgets() est tellement bien pensée que la première chose qu'on
fait c'est de ... la recoder. Et c'est une pratique générale à ce que
j'ai pu constater.
On 5 nov, 11:26, candide wrote:"Always trust user input"
Pourquoi ne pas raisonner juste dès le début ? Pourquoi consttruire du
faux qu'il faudra ensuite démolir et reconstrtuire ensuite ? Quel
intérêt ?
Le bon adage est "Never trust user input". C'est quoi ce jeu
d'inversion des valeurs ?
On 5 nov, 11:26, candide <cand...@free.invalid> wrote:
"Always trust user input"
Pourquoi ne pas raisonner juste dès le début ? Pourquoi consttruire du
faux qu'il faudra ensuite démolir et reconstrtuire ensuite ? Quel
intérêt ?
Le bon adage est "Never trust user input". C'est quoi ce jeu
d'inversion des valeurs ?
On 5 nov, 11:26, candide wrote:"Always trust user input"
Pourquoi ne pas raisonner juste dès le début ? Pourquoi consttruire du
faux qu'il faudra ensuite démolir et reconstrtuire ensuite ? Quel
intérêt ?
Le bon adage est "Never trust user input". C'est quoi ce jeu
d'inversion des valeurs ?
Le 06-11-2009, -ed- a écrit :On 5 nov, 11:26, candide wrote:"Always trust user input"
Pourquoi ne pas raisonner juste dès le début ? Pourquoi consttruire du
faux qu'il faudra ensuite démolir et reconstrtuire ensuite ? Quel
intérêt ?
Pour borner le périmètre des choses à maitriser, puis l'angrandir
peu à peu ?
On n'apprend pas à conduire sur l'autoroute dès la première leçon.
On n'apprend pas la numérations en maternelle par les entiers
de Peano. Etc.Le bon adage est "Never trust user input". C'est quoi ce jeu
d'inversion des valeurs ?
Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
Le 06-11-2009, -ed- <emmanuel.delahaye@gmail.com> a écrit :
On 5 nov, 11:26, candide <cand...@free.invalid> wrote:
"Always trust user input"
Pourquoi ne pas raisonner juste dès le début ? Pourquoi consttruire du
faux qu'il faudra ensuite démolir et reconstrtuire ensuite ? Quel
intérêt ?
Pour borner le périmètre des choses à maitriser, puis l'angrandir
peu à peu ?
On n'apprend pas à conduire sur l'autoroute dès la première leçon.
On n'apprend pas la numérations en maternelle par les entiers
de Peano. Etc.
Le bon adage est "Never trust user input". C'est quoi ce jeu
d'inversion des valeurs ?
Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
Le 06-11-2009, -ed- a écrit :On 5 nov, 11:26, candide wrote:"Always trust user input"
Pourquoi ne pas raisonner juste dès le début ? Pourquoi consttruire du
faux qu'il faudra ensuite démolir et reconstrtuire ensuite ? Quel
intérêt ?
Pour borner le périmètre des choses à maitriser, puis l'angrandir
peu à peu ?
On n'apprend pas à conduire sur l'autoroute dès la première leçon.
On n'apprend pas la numérations en maternelle par les entiers
de Peano. Etc.Le bon adage est "Never trust user input". C'est quoi ce jeu
d'inversion des valeurs ?
Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
In article <hd11j5$3ck$,Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
C'est debile. Passer cinq minutes a "je valide ce qui a ete entre, si
c'est pas bon -> abort", c'est quand meme pas serieux.
In article <hd11j5$3ck$1@news.cict.fr>,
Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
C'est debile. Passer cinq minutes a "je valide ce qui a ete entre, si
c'est pas bon -> abort", c'est quand meme pas serieux.
In article <hd11j5$3ck$,Un moyen pédogogique clair pour indiquer aux étudiants qu'on
commence par raisonner dans un monde gentil, puis qu'on passera
aux choses sérieuses par la suite.
C'est debile. Passer cinq minutes a "je valide ce qui a ete entre, si
c'est pas bon -> abort", c'est quand meme pas serieux.