Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/12/2008, à 04:04

luron

C: isdigit me retourne toujours 0

Salut,

Je teste la fonction isdigit dont le prototype est dans ctype.h:

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

int main (void)
{
	int d;
	int retour;
	
	d = 5;
	
	retour = isdigit (d);
	
	if (retour != 0)
	{
		printf ("La variable (%d) est un entier (la valeur de retour est %d).\n", d, retour);
	}
	
	else
	{
		printf ("La variable n'est pas un entier (la valeur de retour est %d).\n", retour);
	}
	
	return EXIT_SUCCESS;
}

Je compile avec:

gcc -ansi -pedantic -Wall exemple.c -o exemple

Pas d'erreur lors de la compilation, mais isdigit (d) me renvoie toujours 0. Dans le manuel, ça dit pourtant que «Les valeurs renvoyées sont non nulles si le caractère c entre dans la catégorie testée, et zéro sinon.»

Une idée pourquoi j'ai toujours 0?

Merci.

Hors ligne

#2 Le 04/12/2008, à 09:03

nicolas.sitbon

Re : C: isdigit me retourne toujours 0

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

int main (void)
{
    int d = '5';
    int retour = isdigit (d);
    
    if (retour != 0)
    {
        printf ("Le caractere (%c) est un entier (la valeur de retour est %d).\n", d, retour);
    }
    else
    {
        printf ("Le caractere (%c) n'est pas un entier (la valeur de retour est %d).\n", d, retour);
    }
    
    return 0;
}

Hors ligne

#3 Le 04/12/2008, à 11:24

Didouuuuuu

Re : C: isdigit me retourne toujours 0

C'est insensé, ça :
j'ai vérifié le prototype de la fonction sur le web. Il est spécifié un int en paramètre alors que le bon sens veut que ce soit un char.
Ca porte à confusion. Comment ensuite faire la part des choses.
Et on perd son temps à débugger des problèmes techniques d'utilisation du langage et de ses librairies.

#4 Le 04/12/2008, à 11:27

nicolas.sitbon

Re : C: isdigit me retourne toujours 0

Didouuuuuu a écrit :

C'est insensé, ça :
j'ai vérifié le prototype de la fonction sur le web. Il est spécifié un int en paramètre alors que le bon sens veut que ce soit un char.
Ca porte à confusion. Comment ensuite faire la part des choses.
Et on perd son temps à débugger des problèmes techniques d'utilisation du langage et de ses librairies.

Une constante caractère est de type int.

Hors ligne

#5 Le 04/12/2008, à 11:52

Didouuuuuuu

Re : C: isdigit me retourne toujours 0

Une raison de plus pour s'y perdre. wink

#6 Le 04/12/2008, à 12:27

nicolas.sitbon

Re : C: isdigit me retourne toujours 0

Il y a aussi une histoire de cohérence, getchar() renvoi un int donc ces fonctions demandent un int.

Hors ligne

#7 Le 04/12/2008, à 13:25

mUbuntu

Re : C: isdigit me retourne toujours 0

man isdigit

DESCRIPTION
       These  functions  check  whether  c,  which  must  have the value of an
       unsigned char or EOF, falls into a certain character class according to
       the current locale.

Donc on taffe sur des entiers pour ne pas etre limite a la simple table ascii (ce qui ne serait pas du tout portable).

Hors ligne

#8 Le 04/12/2008, à 13:36

Le Farfadet Spatial

Re : C: isdigit me retourne toujours 0

Salut à tous !

   Pour en revenir à la question initiale :

luron a écrit :

Pas d'erreur lors de la compilation, mais isdigit (d) me renvoie toujours 0.

C'est tout à fait normal. Il n'y a pas d'erreur de compilation parce qu'il n'y a rien qui contredise la grammaire du C ou la bonne utilisation de la bibliothèque dans ton code. Comme l'a indiqué, en creux, Nicolas Sitbon, la fonction te renvoie toujours 0, car le caractère que tu lui donnes n'est pas un chiffre. Il n'y a aucune bogue là dedans, il se passe exactement ce qui doit se passer.

   Si tu veux que la fonction retourne la valeur 5, il ne faut pas écrire :

d = 5;

Mais bien :

d = '5';

À bientôt.

                                                                                                                                             Le Farfadet Spatial

Hors ligne

#9 Le 09/12/2008, à 20:20

luron

Re : C: isdigit me retourne toujours 0

Merci pour vos réponses. On file à la fonction le code ascii du caractère à analyser. En mettant d = 5, j'envoyais le code ascii 5, mais le chiffre 5 a le code ascii 53, ce qui fait que d = 53 ou d = '5' va donner le même résultat.

Hors ligne

#10 Le 09/12/2008, à 21:38

nicolas.sitbon

Re : C: isdigit me retourne toujours 0

luron a écrit :

ce qui fait que d = 53 ou d = '5' va donner le même résultat.

Non, typiquement cela dépend de l'encodage du caractère (ASCII, EBCDIC) et de la locale, n'as tu pas lu la norme de cette fonction? Le fait de mettre '5' est portable, mais 53 ne l'est pas.

Hors ligne