2017-04-18 4 views
0

J'ai travaillé sur un programme qui nécessite des entrées entières, mais chaque fois qu'un nombre entier est accidentellement saisi, la fonction scanf cesse de fonctionner ou reste coincée dans une boucle.en utilisant scanf pour entrer uniquement des entiers?

Voici un exemple de ce que j'ai essayé de faire:

int n; 
    printf("please enter 0 or 1\n"); 
top: 
    scanf("%i",&n); 
    if(n == 0) 
    { 
     printf("you entered 0!\n"); 
    } 
    if(n == 1) 
    { 
     printf("you entered 1!\n"); 
    } 
    if(n != 0 && n != 1) 
    { 
     printf("please enter either 0 or 1."); 
     goto top; 
    } 

Le troisième est si vous renvoie vers le haut si vous n'avez pas entré le bon numéro, mais cela ne fonctionne pas pour les lettres et d'autres caractères. Comment pouvez-vous le renvoyer en haut si une entrée non-entière est donnée?

+1

Dodge en entrant avec '' fgets' et l'application sscanf' et vérifier sa valeur de retour (recherche la page man: quelle est la fonction return value de la famille 'scanf'?). Si vous n'obtenez pas ce que vous voulez, vider la chaîne d'entrée et en obtenir une autre. –

+1

"Comment pouvez-vous le renvoyer en haut si une entrée non-entière est donnée?" -> lire le non-entier et le jeter d'abord. – chux

+0

Vous devriez vérifier la valeur de retour de 'scanf()' pour reconnaître quand des erreurs se sont produites, telles que l'entrée n'étant pas numérique. Quand un tel échec de correspondance se produit, vous devez lire au moins un caractère de l'entrée standard - celui 'scanf()' est actuellement en train de s'étouffer - sinon il restera juste là pour causer des problèmes lors de la prochaine tentative. –

Répondre

0

Ceci peut être résolu en remplaçant l'appel scanf("%i",&n); ce qui suit:

char buffer[256]; 
char *s = fgets(buffer, 256, stdin); 

if (s != buffer) 
{ 
    // Some error occurred 
    goto top; 
} 

int error = sscanf(buffer, "%i", &n); 

if (error == 0) 
{ 
    // The string read is not a number! 
    printf("please enter either 0 or 1."); 
    goto top; 
} 
0

essayer cette

#include <stdio.h> 

int main(void){ 
    int n; 
    printf("please enter 0 or 1\n"); 

    for(;;){ 
     int status; 
     char ch; 
     status = scanf("%i%c", &n, &ch);//check return value of scanf, ch : for check rest input 
     if(status == EOF){ 
      printf("Bye!!\n", n); 
      return 0; 
     } else if(status == 2 && ch == '\n'){ 
      if(n == 0 || n == 1){ 
       printf("you entered %i!\n", n); 
       break; 
      } 
     } else { 
      while(getchar() != '\n');//clear input 
     } 
     printf("please enter either 0 or 1.\n"); 
    } 
    return 0; 
}