web-dev-qa-db-fra.com

Comment obtenir int de stdio en C?

Ayant des problèmes importants avec cela ...

printf("> ");
int x = getchar();

printf("got the number: %d", scanf("%d", &x));

sortie

> 1234
got the number: 1
26
maček

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ù

  1. Le fichier stdin est fermé ou cassé, vous n'obtenez donc rien du tout.
  2. L'utilisateur entre quelque chose de non valide.

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!

52
templatetypedef

La manière typique est avec scanf:

int input_value;

scanf("%d", &input_value);
7
Jerry Coffin

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);

Les sorties

> [Prompt expecting input, lets write:] 1234 [Enter]
got the number: 1234
2
josegomezr