web-dev-qa-db-fra.com

comment vérifier si l'entrée est un nombre ou non en C?

Dans la fonction principale de C:

void main(int argc, char **argv)
{
   // do something here
}

Dans la ligne de commande, nous allons taper n'importe quel nombre, par exemple 1 ou 2 en entrée, mais il sera traité comme un tableau de caractères pour le paramètre d'argv, mais comment s'assurer que l'entrée est un nombre, au cas où les gens auraient tapé hello ou c?

11
user2131316

Une autre façon de le faire est d'utiliser la fonction isdigit. Voici le code pour cela:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXINPUT 100
int main()
{
    char input[MAXINPUT] = "";
    int length,i; 

    scanf ("%s", input);
    length = strlen (input);
    for (i=0;i<length; i++)
        if (!isdigit(input[i]))
        {
            printf ("Entered input is not a number\n");
            exit(1);
        }
    printf ("Given input is a number\n");
}
18
Kranthi Kumar

Vous pouvez utiliser une fonction comme strtol() qui convertira un tableau de caractères en un long.

Il a un paramètre qui est un moyen de détecter le premier caractère qui ne s'est pas converti correctement. Si c'est autre chose que la fin de la chaîne, vous avez un problème.

Voir le programme suivant pour un exemple:

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

int main( int argc, char *argv[]) {
    int i;
    long val;
    char *next;

    // Process each argument given.

    for (i = 1; i < argc; i++) {
        // Get value with failure detection.

        val = strtol (argv[i], &next, 10);

        // Check for empty string and characters left after conversion.

        if ((next == argv[i]) || (*next != '\0')) {
            printf ("'%s' is not valid\n", argv[i]);
        } else {
            printf ("'%s' gives %ld\n", argv[i], val);
        }
    }

    return 0;
}

En exécutant cela, vous pouvez le voir en fonctionnement:

pax> testprog hello "" 42 12.2 77x

'hello' is not valid
'' is not valid
'42' gives 42
'12.2' is not valid
'77x' is not valid
12
paxdiablo

L'utilisation de scanf est très simple, voici un exemple:

if (scanf("%d", &val_a_tester) == 1)) {
    ... // it's an integer
}
3
Adrien.C

Une solution sur mesure:

bool isNumeric(const char *str) 
{
    while(*str != '\0')
    {
        if(*str < '0' || *str > '9')
            return false;
        str++;
    }
    return true;
}

Notez que cette solution ne doit pas être utilisée dans le code de production, car elle présente de sérieuses limitations. Mais je l'aime pour comprendre C-Strings et ASCII.

3
Marius

Utiliser un code assez simple:

int i;
int value;
int n;
char ch;

/* Skip i==0 because that will be the program name */
for (i=1; i<argc; i++) {
    n = sscanf(argv[i], "%d%c", &value, &ch);

    if (n != 1) {
        /* sscanf didn't find a number to convert, so it wasn't a number */
    }
    else {
        /* It was */
    }
}
2
Neil Townsend