2016-12-29 3 views
0
main() 
{ 
char name[20]; 

printf("enter your name\n"); 

scanf("%s",name);  
printf("%s",name); 

gets(name); 
puts(name); 
} 
entrée

: Sampad SahaComment fonctionnent les fonctions puts et gets?

Sortie

Sampad Saha

met ici utilise uniquement l'entrée de prise gets().

que, si je ne fournissez pas ce printf() la sortie serait

Saha

donc ici met n'imprime rien donné par scanf().

main() 
{ 
char color[20]; 

printf("enter your name\n"); 

scanf("%s",color); 
puts(color); 
} 

Mais ici puts() utilise l'entrée de prise scanf() aussi.

+6

Quelle est votre question? – ForceBru

Répondre

4

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().

+0

Je ne sais pas si j'ai tort ou raison ... mais n'est pas le cas d'omition d'impression (2ème exemple) impression de la Saha seulement parce que la même variable est utilisée dans ce cas? Et dans le premier cas, il est stocké dans le tampon de sortie avant qu'il ne soit perdu en lisant '' gets() 'Le troisième cas est évident .. – coderredoc

+0

@coderredoc Droite, aussi longtemps que la paire' pf/sf' et 'gets/puts' utilise la même variable, ce sera la même chose. la variable _between_ la paire peut changer mais pas le résultat. :) –

+0

ok .. merci. Je l'ai bien compris. – coderredoc