Il y a plusieurs problèmes à utiliser scanf
avec le %d
pour ce faire :
-
Si la chaîne d'entrée commence par un entier valide (tel que "12abc"), alors le "12" sera lu à partir du flux d'entrée et converti et assigné à num
y scanf
retournera 1, donc vous indiquerez un succès alors que vous ne devriez (probablement) pas ;
-
Si la chaîne d'entrée n'a pas commencer par un chiffre, puis scanf
ne liront pas tout les caractères du flux d'entrée, num
ne sera pas modifié, et la valeur de retour sera 0 ;
-
Vous ne précisez pas si vous devez gérer des formats non décimaux, mais cela ne fonctionnera pas si vous devez gérer des valeurs entières au format octal ou hexadécimal (0x1a). Le site %i
gère les formats décimal, octal et hexadécimal, mais les deux premiers problèmes subsistent.
Tout d'abord, vous devrez lire l'entrée sous forme de chaîne de caractères (de préférence en utilisant la fonction fgets
). Si vous n'êtes pas autorisé à utiliser atoi
vous n'êtes probablement pas autorisé à utiliser strtol
soit. Vous devrez donc examiner chaque caractère de la chaîne. La manière la plus sûre de vérifier les valeurs numériques est d'utiliser la fonction isdigit
(il existe également la fonction de bibliothèque isodigit
y isxdigit
pour vérifier les chiffres octaux et hexadécimaux, respectivement), tels que
while (*input && isdigit(*input))
input++;
(si vous n'êtes même pas autorisé à utiliser isdigit
, isodigit
o isxdigit
puis giflez votre professeur pour avoir rendu le devoir plus difficile qu'il ne doit l'être).
Si vous devez être en mesure de gérer des formats octaux ou hexagonaux, les choses se compliquent un peu plus. La convention C veut que les formats octaux soient précédés d'un signe 0
et pour les formats hexadécimaux, un chiffre de tête 0x
. Ainsi, si le premier caractère non blanc est un 0, vous devez vérifier le caractère suivant avant de savoir quel format non décimal utiliser.
Le schéma de base est le suivant
- Si le premier caractère non blanc n'est pas un '-', un '+', un '0' ou un chiffre décimal non nul, il ne s'agit pas d'une chaîne d'entiers valide ;
- Si le premier caractère non blanc est '-', il s'agit d'une valeur négative, sinon nous supposons une valeur positive ;
- Si le premier caractère est '+', il s'agit d'une valeur positive ;
- Si le premier caractère autre qu'un espace et un signe est un chiffre décimal non nul, alors l'entrée est au format décimal, et vous utiliserez la fonction
isdigit
pour vérifier les caractères restants ;
- Si le premier caractère autre qu'un espace et un signe est un '0', l'entrée est au format octal ou hexadécimal ;
- Si le premier caractère qui n'est ni un espace ni un signe est un '0' et que le caractère suivant est un chiffre compris entre '0' et '7', alors l'entrée est au format octal et vous utiliserez la fonction
isodigit
pour vérifier les caractères restants ;
- Si le premier caractère non blanc et non signe était un 0 et que le deuxième caractère est
x
o X
Dans ce cas, l'entrée est au format hexadécimal et vous utiliserez la fonction isxdigit
pour vérifier les caractères restants ;
- Si l'un des caractères restants ne satisfait pas à la fonction de vérification spécifiée ci-dessus, il ne s'agit pas d'une chaîne d'entiers valide.