comment scanf() vérifie si l'entrée est un nombre entier ou un caractère?
Je me demande comment est la bibliothèque standard C de la fonction scanf() vérifie si l'entrée est un nombre entier ou un caractère lorsque nous appelons scanf("%d",&var) lorsqu'un personnage est lui-même qu'un nombre?
Je sais que lorsqu'il rencontre un non-entier, il le remet dans la mémoire tampon d'entrée et retourne -1 mais comment sait-il que l'entrée n'est pas un nombre entier?
OriginalL'auteur vjain27 | 2011-04-12
Vous devez vous connecter pour publier un commentaire.
Vous avez raison en ce que chaque personnage est vraiment représenté sous forme d'un entier 8 bits. La solution est simple: regardez le nombre, et voir si elle est dans la gamme 48-57, qui correspond à la plage de SCII codes pour les caractères '0' - '9'.
De départ sur la ligne de 1315 du
scanf()
le code source nous pouvons le voir en action.scanf()
est en fait plus compliqué, bien qu'il se penche également sur des caractères multi-octets pour déterminer la valeur numérique. Ligne de 1740 est là que la magie opère et que le personnage est réellement convertie en un nombre. Enfin, et c'est peut-être la plus utile, lastrtol()
fonction de la boucle pour effectuer cette conversion.OriginalL'auteur poundifdef
L'entrée est toujours une chaîne de caractères. Si
scanf
attend un entier (parce que vous avez passé il"%d"
), il tente de convertir la chaîne en nombre entier pour vous.ASCII des valeurs qui représentent des nombres, tu veux dire. scanf prend le caractère '9', décide qu'il représente un nombre, et le convertit en un nombre entier 9.
Oui, c'est ce qu'il doit faire. Le clavier s'envoyer des caractères ascii.
OriginalL'auteur BlueRaja - Danny Pflughoeft
Dans le scanf énoncé de vous mentionner %d, qui est entier uniquement donc, par défaut elle a compris que la variable de type entier
OriginalL'auteur Ramya D
Fondamentalement, la
scanf
fonction correspond à des expressions régulières basées sur les indicateurs de conversion vous passer. Si vous spécifiez%d
, qui racontescanf
pour le match d'entrée contre une expression régulière qui de l'un ou de plusieurs caractères entre'0'
et'9'
(éventuellement avec l'un des principaux+
ou-
caractère). Il convertit ensuite cette séquence de caractères à l'équivalent de la valeur de type entier.Un très version simpliste pourrait ressembler à quelque chose comme ceci:
où
isdigit
est une bibliothèque standard fonction qui retourne vrai (non-nulle) si la valeur du caractère représente un chiffre décimal, etvalueOf
est une fonction définie par l'utilisateur que les cartes de la de caractères représentant un nombre entier ('0'
-'9'
) à l'équivalent de la valeur de type entier (0
-9
) (je ne suis pas au courant d'une bibliothèque standard fonction qui fait que pour le caractère individuel des valeurs). Pourquoi ne pas juste soustraire'0'
dec
pour obtenir l'équivalent de la valeur entière? Selon le codage, il n'est pas garanti que tout nombre entier décimal personnages seront disposées dans l'ordre (Tout Le Monde n'Est Pas ASCII); le mieux déléguer la conversion à une fonction qui est au courant de l'codage en cours.OriginalL'auteur John Bode
Il essaie d'analyser un nombre décimal valide entier depuis le début de la rivière, dans la pratique, en option + ou -, puis séquence d'un ou de plusieurs chiffres.
Euh peu essaie de lire le code ASCII du caractère de la représentation d'un entier décimal ici. La lettre A ne fait pas partie de ces.
OriginalL'auteur Antti Huima
Il utilise essentiellement une boucle comme:
OriginalL'auteur Jerry Coffin
Vous comprenez mal le
%d
spécificateur de format. Il ne pas retourner la valeur ASCII du caractère (vous pouvez utiliser%c
); elle renvoie le nombre entier que les personnages représentent. Donc, sur une entrée de caractères de'9'
,%d
renvoie la valeur 9 - pas la valeur ASCII de'9'
.(Bien,
%d
ressemble en fait à une séquence de caractères, si l'entrée est'9'
suivie par'0'
suivie par' '
, il va interpréter cela comme 90).OriginalL'auteur caf