2009-11-08 5 views
0

Je veux empêcher mon programme de tout autre type d'entrée au lieu de int. Comment vérifier le type d'une entrée sans l'affecter à une variable? dans Ccomment limiter une entrée dans c

+0

De quelle forme parlez-vous? Entrée de la console? Entrée d'un fichier? Entrée sur le réseau? – Storm

Répondre

1

vous devriez le mettre dans une variable char (ou une chaîne) vérifier sa validité, puis le mettre à l'int var. vous devez lire les données quelque part.

3

Voir strtod, strtol et amis.

Toutes ces fonctions prennent un paramètre out (généralement appelé endptr) qui vous montre où la conversion s'est terminée. Vous pouvez utiliser cette information pour décider si l'entrée que vous vouliez convertir était un entier ou un nombre à virgule flottante ou pas un nombre du tout.

La stratégie consiste à essayer d'analyser l'entrée en tant que base 10 de long. Si cela ne fonctionne pas (c'est-à-dire s'il y a des caractères non convertis), voyez si l'analyse en double fonctionne. Si aucun ne fonctionne, l'entrée n'est pas un nombre. De toute évidence, vous devez décider quel type de base vous souhaitez utiliser pour les nombres. Vous pouvez ajouter plus de vérifications et d'améliorations, mais voici un exemple simple.

#include <assert.h> 
#include <stdio.h> 
#include <stdlib.h> 

struct a_number { 
    unsigned char is_long; 
    union { 
     double d; 
     long i; 
    }; 
}; 

int main(void) { 
    int n; 
    char *input_strings[3] = { 
     "1234","1234.56", "12asdf" 
    }; 

    struct a_number *numbers[3]; 

    for (n = 0; n < 3; ++n) { 
     char *start = input_strings[n]; 
     char *end; 
     long i = strtol(start, &end, 10); 
     if (*end == '\0') { 
      struct a_number *num = malloc(sizeof(*num)); 
      assert(num); 
      num->is_long = 1; 
      num->i = i; 
      numbers[n] = num; 
     } 
     else { 
      double d = strtod(start, &end); 
      if (*end == '\0') { 
       struct a_number *num = malloc(sizeof(*num)); 
       assert(num); 
       num->is_long = 0; 
       num->d = d; 
       numbers[n] = num; 
      } 
      else { 
       numbers[n] = NULL; 
      } 
     } 
    } 

    for (n = 0; n < 3; ++n) { 
     if (numbers[n]) { 
      if (numbers[n]->is_long) { 
       printf("%ld\n", numbers[n]->i); 
      } 
      else { 
       printf("%g\n", numbers[n]->d); 
      } 
     } 
    } 

    return 0; 
} 
0

Sans affecter l'entrée à une variable, vous ne pouvez pas le faire.

Questions connexes