OVH Cloud OVH Cloud

printf et scanf

102 réponses
Avatar
Pascal
Bonjour,

J'ai des pb bizarres : dans une fonction j'ai besoin que l'utilisateur
me donne plusieurs infos, je fais donc des printf("question") et des scanf.

Sur les 3 premieres questions, ca marche bien, sur les 2 dernières, le
programme les affiche, mais le scanf ne semble pas marcher. Pourtant le
scanf recup sur les 5 fois un char *. C'est un bug? D'ailleurs si je ne
mets pas de \n sur le printf, parfois c'est encore pire...
voici un ex :
char *nom;
printf("nom\n");
scanf("%s", nom);
etc .. prenom, adress, tel, mail...

Parfois le scanf est comme sauté. Dans une autre fonction, je fais la
meme chose : une question, une reponse. Il m'affiche bien la question,
mais le scanf comme s'il était inactif, le programme ne me laisse pas
répondre, et passe à l'instruction suivante...

10 réponses

Avatar
Emmanuel Delahaye
Richard Delorme wrote on 05/11/04 :
Des gens pensent le contraire, et qu'il faut laisser tomber fgets() en faveur
de scanf :


Je n'en connais qu'un, c'est Dan Pop.

http://groups.google.fr/groups?threadmÉpifa%248jn%244%40sunnews.cern.ch


Gagné!

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Charlie Gordon
"Emmanuel Delahaye" wrote in message
news:
Charlie Gordon wrote on 05/11/04 :
Il faut écrire :

while ((c = getc(fp)) != EOF && c!= 'n')
continue;

le continue redondant est là pour éviter le statement vide, que je préfère
ne jamais utiliser, en particulier sur la même ligne que le while ou le for.


Je mets

while ((c = getc(fp)) != EOF && c!= 'n')
{
}

En fait, je mets toujours les {}


Question de goût et surtout de conventions.
Je ne mets pas les {} pour les if/for/while qui ne commandent qu'un statement
simple d'une ligne. Comme c'est un peu risqué, je suis très strict quant au
style général : jamais plus d'un statement par ligne, jamais de statements
vides, jamais de {}, indentation et espacements strictement codifiés et imposés,
constructions non standard interdites... Je mettrai tout cela en ligne un de
ces 4.

Chqrlie.


Avatar
Charlie Gordon
"Jean-Marc Bourguet" wrote in message
news:
Laurent Deniau writes:

Je suis d'accord que ca aurait put etre mieux pense. Mais cela doit tout de
meme etre pratique pour que C++ (Boost) et Java (PrintStream) cherchent a
refaire la meme chose (en plus securise certes).


Pour les sorties, l'interet principal de l'utilisation des formats est
l'internationalisation et la possibilite de mettre les parametres dans
des ordres differents suivant les langages.


Tu plaisantes ? Je n'ai pas vu de ;-)
Mettre les paramètres dans un ordre différent selon les langues n'est permis que
par une extension de la glibc qui n'est pas particulièrement élégante et dont
l'implémentation, que j'ai cru devoir me cogner dans une libc perso, est
vraiment sordide.

Il est clair qu'en C++, le mécanisme des streams rend tout cela carrément
impossible sans recompilation. En plus leur surcharge abusive des << rend le
code totalement illisible, en particulier quand on veut exercer un minimum de
contrôle sur le formatage. L'utilisation de + en javascript ne donne pas de
résultat satisfaisant non plus... Bref printf, qui trouve ses racines
directement dans le FORTRAN est encore un moindre mal, mais pas très plaisant il
faut bien reconnaitre.

Chqrlie.

PS: anglais amusant : langue se traduit par 'tongue' (prononcer comme les
sandales, même origine ;-) dans la plupart des contextes : langues étrangères ->
'foreign tongues', langue maternelle -> 'mother tongue' ! incroyable n'est-ce
pas.


Avatar
Charlie Gordon
"Antoine Leca" wrote in message
news:cmg76c$d1p$
En cmfv8i$pqd$, Charlie Gordon va escriure:
Des données suffisamment bien travaillées permettront de faire
faire à peu près n'importe quoi au programme qui execute ce code.


On s'en moque. En fait, au vu de cet exemple, le programmeur normal devrait
être effrayé par la complexité de scanf et donc fuir, ce qui est plutôt
sain, non ?


Alors "%49[012346789]" aurait encore mieux fait l'affaire ;-)

éventuellement "%49[0-9]".


Non légal.


Légal, mais la signification est implementation defined ! Les normateurs sont
trop mous.

Conclusion : laisser tomber cette daube de scanf.


La daube, c'est bon. Et plus elle est élaborée, meilleur c'est. ;-)


OK : laisser tomber cette fiente de scanf... et je suis à court de vocabulaire
non grossier pour gets ou strncpy ;-)

Chqrlie.


Avatar
Charlie Gordon
"Richard Delorme" wrote in message
news:418bca21$0$15756$
Il me semble qu'il y a des discussions pour utiliser %.*s, voire un
autre opérateur symétrique avec printf.

[...]

Conclusion : laisser tomber cette daube de scanf.


Des gens pensent le contraire, et qu'il faut laisser tomber fgets() en
faveur de scanf :

http://groups.google.fr/groups?threadmÉpifa%248jn%244%40sunnews.cern.ch



Dan Pop est très minoritaire sur ce point.
Je suis plutôt d'accord avec PJ Plauger, dans ce thread.
C'est quand même triste qu'il ait fallu attendre Microsoft pour aller dans la
donne direction, alors même que les plus innocents d'entre nous supposent déjà
que %.*s a cette signification par analogie avec printf !

Chqrlie.


Avatar
Jean-Marc Bourguet
"Charlie Gordon" writes:

"Jean-Marc Bourguet" wrote in message
news:
Laurent Deniau writes:

Je suis d'accord que ca aurait put etre mieux
pense. Mais cela doit tout de meme etre pratique pour
que C++ (Boost) et Java (PrintStream) cherchent a
refaire la meme chose (en plus securise certes).


Pour les sorties, l'interet principal de l'utilisation
des formats est l'internationalisation et la possibilite
de mettre les parametres dans des ordres differents
suivant les langages.


Tu plaisantes ? Je n'ai pas vu de ;-)


Non. C'est l'intérêt principal que je vois à l'utilisation
de formats.

Mettre les paramètres dans un ordre différent selon les
langues n'est permis que par une extension de la glibc qui
n'est pas particulièrement élégante et dont
l'implémentation, que j'ai cru devoir me cogner dans une
libc perso, est vraiment sordide.


C'est plus que du glibc, c'est POSIX (et c'est même XPG4).

Il est clair qu'en C++, le mécanisme des streams rend tout
cela carrément impossible sans recompilation. En plus
leur surcharge abusive des << rend le code totalement
illisible,


Non. C'est l'utilisation de << pour les shifts que je
trouve illisible. Quand on a l'habitude du C++, << est
d'abord l'opérateur d'affichage.

en particulier quand on veut exercer un minimum de
contrôle sur le formatage. L'utilisation de + en
javascript ne donne pas de résultat satisfaisant non
plus...


+ est clairement de l'abus.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
Pierre Maurette
"Stephane Legras-Decussy" a écrit:


Charlie Gordon a écrit dans le message :
cmiitn$9rt$
Je mettrai tout cela en ligne un de
ces 4.


je bookmark d'avance...
Je m'inscris également.

Si en plus le [futur] texte de Charlie peut remplacer "statement" par
"instruction", ce sera parfait.
J'aime bien l'idée du "tout carré sauf":
if(condition)action;
L'éditeur de C++BuilderX (issu directement de JBuilder) est assez
pratique sur ce plan.
--
Pierre


Avatar
Stephane Legras-Decussy
Charlie Gordon a écrit dans le message :
cmiitn$9rt$
Je mettrai tout cela en ligne un de
ces 4.


je bookmark d'avance...

Avatar
Charlie Gordon
"Pierre Maurette" wrote in message
news:
"Stephane Legras-Decussy" a écrit:


Charlie Gordon a écrit dans le message :
cmiitn$9rt$
Je mettrai tout cela en ligne un de
ces 4.


je bookmark d'avance...
Je m'inscris également.

Si en plus le [futur] texte de Charlie peut remplacer "statement" par
"instruction", ce sera parfait.


Ben il faudra que tu fasses la traduction complète alors, mes conventions sont
rédigées en anglais.

J'aime bien l'idée du "tout carré sauf":
if(condition)action;
L'éditeur de C++BuilderX (issu directement de JBuilder) est assez
pratique sur ce plan.


Je ne suis pas sûr de comprendre.
J'interdis les if /for/while en une seule ligne, et je n'omets les {} que dans
les cas ou (condition) et action tiennent sont simples et en particulier
tiennent chacun sur une ligne.

Chqrlie.



Avatar
Pierre Maurette
"Charlie Gordon" a écrit:

"Pierre Maurette" wrote in message
news:
"Stephane Legras-Decussy" a écrit:


Charlie Gordon a écrit dans le message :
cmiitn$9rt$
Je mettrai tout cela en ligne un de
ces 4.


je bookmark d'avance...
Je m'inscris également.

Si en plus le [futur] texte de Charlie peut remplacer "statement" par
"instruction", ce sera parfait.


Ben il faudra que tu fasses la traduction complète alors, mes conventions sont
rédigées en anglais.
Dans ce cas ....


J'aime bien l'idée du "tout carré sauf":
if(condition)action;

L'éditeur de C++BuilderX (issu directement de JBuilder) est assez
pratique sur ce plan.


Je ne suis pas sûr de comprendre.
J'interdis les if /for/while en une seule ligne, et je n'omets les {} que dans
les cas ou (condition) et action tiennent sont simples et en particulier
tiennent chacun sur une ligne.
C'est moi qui avais mal compris.

Je n'omets les {} que quand j'ai:
if(condition)action;
C'est vrai que j'utilise cette forme alors que l'opérateur ternaire
irait bien. J'y viens peu à peu.
Je ne suis pas cohérent pour l'instant. Des fois j'enfonce le clou
avec:
for(action;condition;action){};
Je n'aime pas les for() bricolés à coup d'opérateur virgule.
Et puis des fois, je fais n'importe quoi pour améliorer le pas à pas
ou pour avoir des messages d'erreur plus explicites.
--
Pierre