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
drkm
Jean-Marc Bourguet writes:

"Charlie Gordon" writes:

L'utilisation de + en
javascript ne donne pas de résultat satisfaisant non
plus...


+ est clairement de l'abus.


Que fait-il ?

--drkm


Avatar
drkm
"Charlie Gordon" writes:

"Jean-Marc Bourguet" wrote in message
news:

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.



[...]

Il est clair qu'en C++, le mécanisme des streams rend tout cela carrément
impossible sans recompilation.


Que veux-tu dire ?

--drkm


Avatar
Jean-Marc Bourguet
drkm writes:

Jean-Marc Bourguet writes:

"Charlie Gordon" writes:

L'utilisation de + en
javascript ne donne pas de résultat satisfaisant non
plus...


+ est clairement de l'abus.


Que fait-il ?


Je ne connais pas javascript, mais utiliser + pour effectuer
des E/S comme à l'air de l'indiquer Charlie c'est pire que
du Perl...

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
Jean-Marc Bourguet
drkm writes:

"Charlie Gordon" writes:

"Jean-Marc Bourguet" wrote in message
news:

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.



[...]

Il est clair qu'en C++, le mécanisme des streams rend tout cela carrément
impossible sans recompilation.


Que veux-tu dire ?


Que si tu utilises les IOStreams et que tu veux modifier
l'ordre de deux éléments dans un sortie (ce qui est possible
simplement en changeant le format -- récupéré par le
méchanisme de localisation -- avec un printf POSIX ou avec
le formatage de boost) il faut modifier ton code et
recompiler.

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
drkm
Jean-Marc Bourguet writes:

drkm writes:

Jean-Marc Bourguet writes:

"Charlie Gordon" writes:

L'utilisation de + en
javascript ne donne pas de résultat satisfaisant non
plus...


+ est clairement de l'abus.


Que fait-il ?


Je ne connais pas javascript, mais utiliser + pour effectuer
des E/S comme à l'air de l'indiquer Charlie c'est pire que
du Perl...


Ok. Une sorte d'opérateur de concaténation avec entrée. J'étais
resté dans les caractères spéciaux dans les chaînes de formatage
(a.k.a. '%').

--drkm




Avatar
drkm
Jean-Marc Bourguet writes:

drkm writes:

"Charlie Gordon" writes:

Il est clair qu'en C++, le mécanisme des streams rend tout cela carrément
impossible sans recompilation.


Que veux-tu dire ?


Que si tu utilises les IOStreams et que tu veux modifier
l'ordre de deux éléments dans un sortie (ce qui est possible
simplement en changeant le format -- récupéré par le
méchanisme de localisation -- avec un printf POSIX ou avec
le formatage de boost) il faut modifier ton code et
recompiler.


Mais Boost.Format permet justement de spécifier l'ordre dans la
chaîne de formatage, sans modifier l'ordre des opérandes dans les
sources. Et il utilise bien les IOStreams standards, non ?

Le GB_Format de James également, si je ne m'abuse.

--drkm



Avatar
Jean-Marc Bourguet
drkm writes:

Jean-Marc Bourguet writes:

drkm writes:

"Charlie Gordon" writes:

Il est clair qu'en C++, le mécanisme des streams rend tout cela carrément
impossible sans recompilation.


Que veux-tu dire ?


Que si tu utilises les IOStreams et que tu veux modifier
l'ordre de deux éléments dans un sortie (ce qui est possible
simplement en changeant le format -- récupéré par le
méchanisme de localisation -- avec un printf POSIX ou avec
le formatage de boost) il faut modifier ton code et
recompiler.


Mais Boost.Format permet justement de spécifier l'ordre dans la
chaîne de formatage, sans modifier l'ordre des opérandes dans les
sources. Et il utilise bien les IOStreams standards, non ?

Le GB_Format de James également, si je ne m'abuse.


C'est la beauté des templates :-)

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
drkm
Jean-Marc Bourguet writes:

C'est la beauté des templates :-)


Bof. En C, on a les macros de préprocesseur ;-)

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| Jean-Marc Bourguet writes:
|
| > C'est la beauté des templates :-)
|
| Bof. En C, on a les macros de préprocesseur ;-)

T'as essayé ? semi ;-)

-- Gaby
Avatar
Charlie Gordon
"Jean-Marc Bourguet" wrote in message
news:
drkm writes:

Jean-Marc Bourguet writes:

"Charlie Gordon" writes:

L'utilisation de + en
javascript ne donne pas de résultat satisfaisant non
plus...


+ est clairement de l'abus.


Que fait-il ?


Je ne connais pas javascript, mais utiliser + pour effectuer
des E/S comme à l'air de l'indiquer Charlie c'est pire que
du Perl...


Non, + fait juste la concaténation des chaines en javascript.
Le problème est à la fois une question de lisibilité et un problème de typage.
On peut comparer la lisibilité respective de :

C: printf("x=%d, y=%dn", x, y);
C++: cout << "x=" << x << ", y=" << y << "n";
Javascript: document.write("x=" + x + ", y=" + y + "n");
Perl: print("x=$x, y=$yn");

Il faut bien reconnaitre que Perl est de loin le plus lisible.

Le problème de typage est causé par la combinaison du polymorphisme de
l'opérateur + et du typage dynamique des variables en javascript. Il arrive
souvent que les variables n'ont pas le type que le programmeur intuite lorsqu'il
écrit une expression. Or la sémantique de l'addition des nombres et de la
concaténation des chaines sont fort différentes, comme la comparaison numérique
et lexicographique. Utiliser la meme syntaxe pour ces deux concepts est une
source de bugs.
Ce problème ne se pose pas en C : il n'y a pas d'opérateur de concaténation de
chaines.
En C++ ou en java, le type des opérandes est mieux contrôlé par le programmeur
parce que le typage est statique. Mais il arrive quand meme lors des
comparaisons si les conventions de nommages ne sont pas assez claires. Le grand
classique est :

if (this->montant > this->montant_max) {
/* traiter l'erreur */
}

si ces champs sont des chaines, le code reste correct, mais la sémantique
change.
C++, javascript, et surtout PHP ont ce problème. Il peut meme se produire en C
!
En Perl, les opérations de comparaisons numériques et lexicographiques
s'expriment avec des opérateurs différents. Pareil pour l'addition et la
concaténation.

Enfin pour ce qui est de la flexibilité pour la traduction avec changement
d'ordre des paramètres, des quatre seuls C et Perl s'y prêtent, et encore pour C
il faut une extension POSIX assez illisible, et pour Perl c'est grâce à la
recompilation que cela se fait bien.

J'ai étudié comment faire une extension de syntaxe au langage C pour supporter
la substitution de variables dans les chaines, avec autant que possible de
bonnes propriétés pour la localisation sans recompilation : on peut obtenir des
résultats intéressants dans des contextes spécifiques comme le formatage des
sorties, mais pour le cas général, il faut un mécanisme de gestion des chaines
de caractères dynamiques, qui a des implications assez lourdes partout. Ce
serait beaucoup plus facile à faire pour java.

Chqrlie.