Je debute en C et déjà un pbl avec scanf

Fermé
leninja - 2 juil. 2003 à 14:39
 Pascal - 2 juil. 2003 à 15:15
Dans un livre on ns propose comme exercice de faire un programme permettant de lire une suite de caractères puis de les compter .et voici le corrigé :

#include <stdio.h>

main()
{
char c;
int n;
printf("entrez un texte quelconque: \n");
n = 0 ;
do

{
scanf("%c", &c );
n = n + 1 ;
}
while (c != '\n');
n = n - 1 ;
printf("vs avez entré %i caractère(s).", n);
}

je suis d'accord avec le programme mais il ya un truc que je ne comprend pas : comment on passe de
scanf("%c", &c );
à :
n = n + 1 ;
sans avoir valider.Je m'explique :
à chaque fois qu'on tape un caractère le compteur va incrémenter sans qu'on appuie sur 'entrée' et qd on appuie sur entrée le pgm passe à la dernière instruction printf. Ce que je ne comprends pas c'est comment le compteur incremente sans qu'on valide une fois qu'on a entré un lettre ??? je suis clair là ???

merci

1 réponse

Ce que tu ne comprends pas c'est le fonctionnement du scanf.

En faite le scanf ne lis pas chaque caractére à chaque fois que tu le tapes et il n'attends pas non plus qu etu tapes sur entrées pour fonctionner.

Explication:
Quand le prog rencontre un scanf %c il lit le premier caractére qui est entrée dans le buffer du pc puis le supprime, le second caractére du buffer devient alors premier. Si il n'y a pas de caractére dans le buffer il attend. Le %s marche pareil sauf qu'il lit tout les caractére du buffer au lieu d'un seul.
Voila pour le scanf.

Ce qu'il faut aussi comprendre c'est comment marche le buffer. Quand tu tapes des caractéres il ne rentre pas directement dans le buffer. C'est lorsque tu tape entrée que tout les caractére que tu as saisis partent dans le buffer.

Ainsi dans ton prog. Quand tu arrives au scanf le buffer est vide donc il s'arrete et attend.
Tu saisis la liste de caractére puis tu tapes entrée tous partent dans le buffer.
Alors le scanf prend le premier caractére et le supprime du buffer. Au 2eme passage de ta boucle le scanf prends le 1er caractére du buffer qui est en faite le 2eme de ta chaine. Et ainsi de suite : tant qu'il ya des caractéres dans le buffer le scanf continue sans arréter le prog. Le '\n' est le dernier caractére de ta chaine donc tu fini ta boucle en ayant vidé le buffer.
0