Ayant des problèmes importants avec cela ...
printf("> ");
int x = getchar();
printf("got the number: %d", scanf("%d", &x));
> 1234
got the number: 1
Je ne suis pas sûr que ce soit ce que vous cherchez, mais si votre question est de savoir comment lire un entier en utilisant <stdio.h>
, la syntaxe appropriée est
int myInt;
scanf("%d", &myInt);
Vous devrez faire beaucoup de gestion des erreurs pour vous assurer que cela fonctionne correctement, bien sûr, mais cela devrait être un bon début. En particulier, vous devrez gérer les cas où
stdin
est fermé ou cassé, vous n'obtenez donc rien du tout.Pour vérifier cela, vous pouvez capturer le code retour de scanf
comme ceci:
int result = scanf("%d", &myInt);
Si stdin
rencontre une erreur lors de la lecture, result
sera EOF
, et vous pouvez vérifier des erreurs comme celle-ci:
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
Si, d'autre part, l'utilisateur entre quelque chose de non valide, comme une chaîne de texte poubelle, alors vous devez lire les caractères de stdin
jusqu'à ce que vous consommiez toutes les entrées incriminées. Vous pouvez le faire comme suit, en utilisant le fait que scanf
renvoie 0 si rien n'a été lu:
int myInt;
int result = scanf("%d", &myInt);
if (result == EOF) {
/* ... you're not going to get any input ... */
}
if (result == 0) {
while (fgetc(stdin) != '\n') // Read until a newline is found
;
}
J'espère que cela t'aides!
MODIFIER : En réponse à la question plus détaillée, voici une réponse plus appropriée. :-)
Le problème avec ce code est que lorsque vous écrivez
printf("got the number: %d", scanf("%d", &x));
Ceci imprime le code retour de scanf
, qui est EOF
sur une erreur de flux, 0
si rien n'a été lu, et 1
autrement. Cela signifie que, en particulier, si vous entrez un entier, cela affichera toujours 1
parce que vous imprimez le code d'état à partir de scanf
, pas le nombre que vous lisez.
Pour résoudre ce problème, remplacez-le par
int x;
scanf("%d", &x);
/* ... error checking as above ... */
printf("got the number: %d", x);
J'espère que cela t'aides!
La manière typique est avec scanf
:
int input_value;
scanf("%d", &input_value);
La solution est assez simple ... vous lisez getchar () qui vous donne le premier caractère dans le tampon d'entrée, et scanf vient de l'analyser (vraiment je ne sais pas pourquoi) en un entier, si vous oubliez juste le getchar pour une seconde, il lira le tampon complet jusqu'à ce qu'un caractère de nouvelle ligne.
printf("> ");
int x;
scanf("%d", &x);
printf("got the number: %d", x);
> [Prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234