Le problème que vous voyez est qu'il est vraiment en train de lire un personnage, mais il est tout simplement pas le personnage que vous vous attendez. scanf fait une entrée formatée. La première fois que vous l'appelez, vous lui dites d'attendre un numéro. Mais vous êtes vraiment entrer dans plus qu'un simple numéro:
Number?
1234.5678<enter>
Lorsque vous appuyez sur la touche entrée, il insère en fait un caractère dans votre flux d'entrée. Comme vous le savez, nous utilisons \ n pour représenter newline, le caractère que vous obtenez lorsque vous appuyez sur Entrée. Votre flux d'entrée ressemble donc à "1234.5678 \ n". Alors scanf fait son truc et lit 1234.5678, puis il voit '\ n'. Il dit "oh, ça ne fait pas partie du numéro, alors je vais arrêter." Eh bien, votre entrée a toujours le '\ n'. La prochaine fois que vous appelez scanf, vous lui dites de lire un caractère. L'utilisateur tape tout ce qu'il veut, mais cela va derrière le '\ n' du scanf précédent. Alors scanf essaie de faire correspondre le flux d'entrée avec un caractère et dit "ok, la première chose dans ce flux d'entrée est un caractère, et c'est '\ n', donc je vais retourner ça." Les données saisies par l'utilisateur restent dans le flux d'entrée.
Donc, un moyen simple de s'en débarrasser est d'avoir une boucle qui vide tous les caractères restants du flux d'entrée jusqu'à ce qu'il trouve '\ n'.
printf("Number?\n");
scanf("%f", &number1);
while(getchar() != '\n');
Après l'exécution de cette boucle, votre flux d'entrée sera vide. Ainsi, la prochaine fois que vous appellerez scanf, il attendra que l'utilisateur tape quelque chose et utilisera tout ce que l'utilisateur a tapé.
Notez également que scanf a une valeur de retour que vous devriez vérifier après l'avoir appelée. Lisez à propos de scanf pour voir ce qu'il retourne.
Il n'est pas clair si vous voulez une solution C ou C++, car votre liste de titres et de mots-clés est en conflit. –
Sonne comme des devoirs pour moi – Glen
Votre question contient déjà la réponse. –