IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Vérifier si un entier introduit par scanf() est vraiment de type int


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut Vérifier si un entier introduit par scanf() est vraiment de type int
    Bonjour,

    Je cherche une fonction en C sous Linux qui permet de vérifier si un entier entrée par clavier (par scanf() ou autre fonction) est vraiment de type int (entier).

    Merci.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 31
    Par défaut
    bonjour,

    si le texte est saisi dans une chaîne de caractères, vous pouvez faire un sscanf de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char *text = ...;
    int entier = 0;
    char dummy;
     
    if (sscanf(text, "%d%c", &entier, &dummy)==1) {
       // OK (un entier suivi de rien)
    } else {
       // KO (pas un entier ou un entier suivi d'autre chose
    }

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Bonsoir.
    Je vais reformuler ma question, il y a des bibliothèques externes à la bibliothèque standard du du langage C/C++, tels que la bibliothèque raknet (http://www.jenkinssoftware.com), pour la programmation réseaux qui permet d'éviter l'utilisation directe des socketes, ou la bibliothèque SDL pour la programmation graphique, ... etc. je cherche à éviter l'utilisation de scanf(), isdigit(), ...etc. voici un pseudo-code de mon problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int main()
    {
    	int nombre;
     
    	printf(" veuillez introduire un nombre:");
    	scanf("%d", & nombre);
     
    /* vérification si le nombre introduit par scanf() est vraiment un nombre entier, c'est ici que réside mon problème */
     
    	return 0;
    }
    Y a-t-il pas une bibliothèque qui me permet de faire cette vérification son utilisation des outils classiques ou standards ?

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut
    Voici un code qui test tout dabord si le nombre est à virgule ou non; puis, dans le cas ou ce n'est pas un nombre a virgule s'il contient (commence plus précisement) par des caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
       char nombre[50] = "";
       int num = 0;
     
       scanf("%49s", nombre);
     
       if(strchr(nombre, '.') != 0)
    		puts("nb decimal");
     
    	else {
     
    		num = strtol(nombre, NULL, 10);
     
    		if(0 == num)
    			puts("contient caractere(s)");
    		else
    			puts("ok");
    	}
     
    	return 0;
    }
    Poses des questions en cas d'incompréhension.

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Merci beaucoup _concept_, ça a marché très bien pour moi, je vais l'adopter tel qu'il est, car c'est ce que je cherché exactement, il va régler mon problème.

    Ce code a marché pour les cas suivants :
    10.52 ->nb decimal; bien
    10->OK; bien
    a22->contient caractere(s); bien

    mais pour le cas particulier: 22a->ok; en ajoutant: printf("num = %d", num); à la fin du code il affiche: num = 22. Ce n'est pas grave _concept_ car le code m'arrange tel qu'il est.

    Merci

  6. #6
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par linuxeur
    Ce code a marché pour les cas suivants :
    10.52 ->nb decimal; bien
    10->OK; bien
    a22->contient caractere(s); bien
    Voilà ce que j'obtiens moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    1234.........
    nb decimal
     
    ................................
    nb decimal
     
    123ABCDEFGHIJKL45
    ok
     
    1HOMER
    ok
     
    .HOMER.
    nb decimal

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut
    Oui dans un scanf() qui attend une saisie de nombre, si tu insères des chiffres puis au moins un caractère il ne considèrera que la série de chiffre avant ce caractère.
    J'ai pensé que dans ton cas ça aurait peu d'importance, de plus l'implémentation pour vérifier si la chaîne contient au moins un caractère est un peu lourde (pas compliquée pour autant )

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 59
    Par défaut
    A "ssmario2" -> Tu as raison pour le sytème des points ça n'est pas très sécurié... Mais je pense qu'en remplaçant la condition par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strchr(nombre, '.') == strrchr(nombre, '.'))
    ça élimine le problème.
    Pour les nombres contenant des caractères ailleurs qu'en début de chaîne; c'est, comme dit plus haut, un choix de ne pas signaler une erreur car il ne seront de toute façon pas pris en compte.
    Les repérer, les enlever du tableau et obtenir un nombre correct rendrait le code posté bien plus compliqué et serait de peu d'utiliter au PO.
    Amicalement.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par linuxeur Voir le message
    Je cherche une fonction en C sous Linux qui permet de vérifier si un entier entrée par clavier (par scanf() ou autre fonction) est vraiment de type int (entier).
    Si tu mets une valeur dans un int, elle est de type int, cest certain.

    Ta vrai question, je suppose, est plutôt :

    "Est-ce que telle chaine de caractères représente bien un entier ?"

    • Qu'appelle-tu 'entier' ?
    • Y'a-t-il une valeur minimale ? Maximale ? La valeur peu elle être signée ?
    • Est-ce que 123. ou 123.0 sont des entiers ?
    • Est-ce que le format hexadécimal est accepté : 0x123a ?
    • Est-ce que le format octal est accepté : 0123 ?

    Il faut être précis dans la définition, ça permet d'écrire du code qui fonctionne...

  10. #10
    Membre averti
    Étudiant
    Inscrit en
    Février 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 23
    Par défaut
    Bonsoir tout le monde,

    voici une fonction que j'ai programmée et qui vérifie si un entier introduit par clavier est vraiment un entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include <stdio.h>
    #include <string.h>
     
    int estint(char *str)  /* fonction de verification d'un entier */
    {
    	int i = 0;
     
    	for(i = 0; i < strlen(str); i++)
    	{
    		if((str[i] < 48) || (str[i] > 57))
    			return -1;
    	}
    	return 0;
    }
     
    int main(int argc,char **argv)
    {
    	int entier = 0;
     
    	if (argc != 2)
    	{
    		printf("Untiliser: ./estint <entier>\n");
    		printf("Exemple:   ./estint 13\n");
    		return -1;
    	}
     
    	if(estint(argv[1]) == -1)
    	{
    		printf("Entree un entier SVP\n");
    		return -1;
    	}
     
    	entier = atoi(argv[1]); /* convertire du char ver int */
     
    	printf("\n\nl'entier est |%d|.\n\n", entier);
     
    	return 0;
    }
    Remarque : j'ai fait le test de ce programme sous Linux.

  11. #11
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par linuxeur Voir le message
    Bonsoir tout le monde,

    voici une fonction que j'ai programmée et qui vérifie si un entier introduit par clavier est vraiment un entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include <stdio.h>
    #include <string.h>
     
    int estint(char *str)  /* fonction de verification d'un entier */
    {
    	int i = 0;
     
    	for(i = 0; i < strlen(str); i++)
    	{
    		if((str[i] < 48) || (str[i] > 57))
    			return -1;
    	}
    	return 0;
    }
     
    int main(int argc,char **argv)
    {
    	int entier = 0;
     
    	if (argc != 2)
    	{
    		printf("Untiliser: ./estint <entier>\n");
    		printf("Exemple:   ./estint 13\n");
    		return -1;
    	}
     
    	if(estint(argv[1]) == -1)
    	{
    		printf("Entree un entier SVP\n");
    		return -1;
    	}
     
    	entier = atoi(argv[1]); /* convertire du char ver int */
     
    	printf("\n\nl'entier est |%d|.\n\n", entier);
     
    	return 0;
    }
    Remarque : j'ai fait le test de ce programme sous Linux.
    Non portable ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    bool is_integer(char const *str)  /* en théorie, il faut éviter les identificateurs commençant par is */
    {
       bool ret = false;
     
       if(str == NULL)
       {
          errno = EINVAL;
       }
       else
       {
          ret = true;
     
          for(size_t i = 0, length = strlen(str); i < length; i++)
          {
             if(!isdigit((unsigned char)str[i]))
             {
                ret = false;
                break;
             }
          }
       }
     
       return ret;
    }
    mais le mieux est encore d'utiliser la fonction que j'ai donné plus haut.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/04/2009, 14h07
  2. Réponses: 1
    Dernier message: 19/02/2009, 11h15
  3. Réponses: 5
    Dernier message: 12/10/2006, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo