2010-01-07 10 views
11

De la manière la plus simple possible, comment puis-je vérifier si un nombre entier initialisé à partir de la fonction scanf est un nombre?Vérifiez si une valeur de scanf est un nombre?

+1

Je crois que cette question répond à la vôtre. http://stackoverflow.com/questions/456303/how-to-validate-input-using-scanf – hometoast

+0

si un nombre entier est un nombre? –

+2

J'ai lu la question comme "si la chaîne lue est un nombre entier valide." – hometoast

Répondre

8

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

En cas de succès, [scanf] renvoie le nombre d'articles lu avec succès. Ce nombre peut correspondre au nombre attendu de lectures ou moins, voire zéro, si un échec correspondant se produit. Dans le cas d'une panne d'entrée avant que toutes les données puissent être lues avec succès, EOF est renvoyé.

Ainsi, vous pouvez faire quelque chose comme ceci:

#include <stdio.h> 

int main() 
{ 
    int v; 
    if (scanf("%d", &v) == 1) { 
     printf("OK\n"); 
    } else { 
     printf("Not an integer.\n"); 
    } 
    return 0; 
} 

Mais il est vous suggérons d'utiliser à la place fgets et strtol.

+0

Merci mec, ça marche mais si je mets ça en boucle, ça ne marche pas correctement, si l'entrée est une chaîne au début, la boucle est infinie, je peux résoudre? – genesisxyz

+0

Je mets un getchar(); inside ... fonctionne maintenant – genesisxyz

+1

'sscanf' et' scanf' est une mauvaise idée. Les deux produisent un comportement indéfini en cas de débordement. – AnT

6

Votre question est formulée de façon étrange. Un entier initialisé est toujours un nombre (mis à part les cas exotiques de représentation de trap), ce qui signifie qu'il n'est pas nécessaire de vérifier quoi que ce soit.

Je suppose que vous devez vérifier si la chaîne donnée est une représentation valide d'un nombre. Pour cela, vous devez d'abord définir à quoi doit ressembler la représentation valide. Autorisez-vous le signe? Un + redondant est-il autorisé (comme un signe)? Qu'en est-il du préfixe 0x pour les hexadécimaux? Etc.

Le langage C propose son propre ensemble de règles qui définissent l'idée du langage d'une représentation de chaîne valide d'un entier. Si c'est ce dont vous avez besoin, afin de vérifier si la chaîne donnée satisfait ces règles, la meilleure façon est d'utiliser la fonction de conversion chaîne-nombre entier comme strtol (et d'autres fonctions du groupe strto...) puis vérifiez la condition d'erreur.

Méfiez-vous des réponses qui suggèrent d'écrire votre propre fonction pour vérifier ces règles. Cela n'a tout simplement aucun sens, puisque la fonction standard existe déjà. En outre, à proprement parler, dans la programmation réelle, il est rarement nécessaire d'effectuer une vérification sans la conversion réelle. strto... fera les deux.

De même, éloignez-vous des fonctions du groupe scanf pour convertir les chaînes en nombres entiers. Ces fonctions produisent un comportement indéfini en cas de débordement (c'est-à-dire si la représentation de la chaîne d'entrée est trop longue). En général, la seule façon appropriée de faire une telle conversion dans C est les fonctions du groupe strto....

Questions connexes