Envoyé par
yo_haha
Sinon, on appelle scanf avec %c en type attendu, mais on fourni un pointeur sur int... qui n'a pas été initialisé.
Pourriez-vous m'expliquer un peu plus (je suis débutant).
Lorsqu'on utilise scanf, par le premier paramètre, on lui donne la forme des données attendues.
Exemple : %d dit qu'on attend un entier (int), %c un caractère (char).
Les paramètres suivants de scanf sont des pointeurs qui sur des variables où scanf va écrire les données décodées. Ainsi, dans le code suivant, scanf va écrire l'entier qu'il vient de lire à l'emplacement de i qui est un entier.
1 2
| int i;
scanf("%d", &i); |
En revanche, si on écrit
1 2
| int i;
scanf("%c", &i); |
scanf va stocker un char dans une variable entière. Or un char est en général plus petit (1) qu'un int. Sur x86, c'est souvent char de 8 bits et int de 32 bits.
Que fait scanf ? il a 8 bits à écrire, il commence donc à remplir les 8 premiers bits de la variable entière, mais ne touche pas aux 24 derniers bits.
Après l'appel de scanf, 24 bits sur 32 dans notre entier valent donc n'importe quoi.
scanf n'est pas une fonction évidente, il est préférable de lui préférer fgetc ou getchar.
Envoyé par
yo_haha
char est chaîne de caractères, donc lue par %s non?
Non char est un char, une chaine de caractère est un tableau de char terminée par un zero.
Envoyé par
yo_haha
Pourquoi faut-il purger stdin? (avec fflush non?)
Quand on entre une lettre au clavier puis qu'on valide avec la touche entrée, stdin contient de touche pressée, suivit du caractère fin de ligne ('\n').
Il faut donc vider stdin pour vider ce qui n'a pas été lu par scanf, et qui pourrait polluer la prochaine lecture par scanf.
Envoyé par
yo_haha
Avec getc on ne purge pas stdin?
C'est getc ou bien getch ou bien gets ...????
Non, getc récupère un char du flux donné.
getch n'est pas standard.
gets ne doit pas être utilisé
Envoyé par
yo_haha
Remarque 2 : system("pause"); n'est pas portable.
Je ne comprends pas ce que vous voulez dire.
Je veux dire que chez moi, quand je lance le programme depuis un terminal, quand le programme arrive à l'instruction "system("PAUSE");", mon système me dit que cette fonction (pause) n'existe pas.
(1)
sizeof(char) <= sizeof(short) <= sizeof(int)
Partager