Le problème ici est, pour une entrée comme
abc XYZ
le code
scanf("%s",name);
lit ne la partie "abc" et "XYZ" est laissé dans le tampon d'entrée. Le plus tard gets()
lire cela, et puts()
imprime cela. Comme vous ne disposez pas d'un newline
après la printf()
, la sortie n'est pas vidées et le résultat du puts()
est en annexe au tampon de flux de sortie et une fois que le programme se termine l'exécution, l'ensemble tampon de sortie est rincée tout à fait l'impression de la ensemble entrée ensemble.
Ainsi, dans l'autre cas, lorsque vous déposez la printf()
, la valeur lue par scanf()
(« abc ») ne sont pas imprimés.
Pour élaborer, %s
avec scanf()
ne peut pas lire les entrées délimitées par des espaces, il arrête la lecture au premier espace rencontré.
En citant C11
. chapitre §7.21.6.2
s
correspond à une séquence de caractères non-espace blanc. [...]
qui indique, pour %s
, scanf()
arrête la lecture lors de la rencontre d'abord un espace.
venant au deuxième cas, lorsque l'entrée ne contiennent un espacement, (c.-à-pas d'entrée séparés par des espaces est donnée), scanf()
lit toute entrée(jusqu'à terminaison de saut de ligne) et, par conséquent, à la fois le printf()
et puts()
sort le même.
Ceci étant dit, DO NOT use gets()
, it is dangerous. utilisez plutôt fgets()
.
Quelle est votre question? – ForceBru