Existe-t-il un moyen de convertir un caractère en entier en C?
Par exemple, de '5'
à 5?
c
type-conversion
Couler
la source
la source
Soustrayez «0» comme ceci:
La norme C garantit que chaque chiffre de la plage
'0'..'9'
est supérieur de un à son chiffre précédent (dans la section5.2.1/3
du projet C99 ). La même chose vaut pour C ++.la source
Si, par une folle coïncidence, vous voulez convertir une chaîne de caractères en entier, vous pouvez le faire aussi!
val
est maintenant 1024. Apparemmentatoi()
, ça va, et ce que j'ai dit plus tôt ne s'applique qu'à moi (sur OS X (peut-être (insérer une blague Lisp ici))). J'ai entendu dire que c'est une macro qui correspond à peu près à l'exemple suivant, qui utilisestrtol()
une fonction plus générale pour effectuer la conversion à la place:strtol()
fonctionne comme ceci:Il se convertit
*str
en along
, le traitant comme s'il s'agissait d'unbase
nombre de base . S'il**endptr
n'est pas nul, il contient le premier caractère non numériquestrtol()
trouvé (mais qui s'en soucie).la source
itoa_s()
.Soustrayez le caractère '0' ou int 48 comme ceci:
Explication: En interne, il fonctionne avec la valeur ASCII . Dans la table ASCII, la valeur décimale du caractère 5 est 53 et 0 est 48 . Donc 53 - 48 = 5
OU
Cela signifie que si vous déduisez 48 de n'importe quel caractère numérique, il convertira automatiquement l'entier.
la source
la source
numeralChar - '0'
est déjà de typeint
, vous n'avez donc pas besoin de la distribution. Même si ce n'était pas le cas, le casting n'est pas nécessaire.Pour convertir un chiffre de caractère en entier correspondant. Faites comme indiqué ci-dessous:
La logique derrière le calcul ci-dessus est de jouer avec les valeurs ASCII. La valeur ASCII du caractère 8 est 56, la valeur ASCII du caractère 0 est 48. La valeur ASCII de l'entier 8 est 8.
Si nous soustrayons deux caractères, la soustraction se produira entre ASCII de caractères.
la source
S'il ne s'agit que d'un seul caractère 0-9 en ASCII, la soustraction de la valeur du caractère zéro ASCII de la valeur ASCII devrait fonctionner correctement.
Si vous souhaitez convertir des nombres plus grands, procédez comme suit:
** n'oubliez pas de vérifier le statut (qui devrait être 1 si cela a fonctionné dans le cas ci-dessus).
Paul.
la source
la source
Quand j'ai besoin de faire quelque chose comme ça, je pré-cuit un tableau avec les valeurs que je veux.
Ensuite, la conversion est facile
C'est essentiellement l'approche adoptée par de nombreuses implémentations de la bibliothèque ctype. Vous pouvez facilement l'adapter pour qu'il fonctionne également avec des chiffres hexadécimaux.
la source
Vérifie ça,
pour seulement 0,1,2, ...., E, F.
la source
Utilisez simplement la
atol()
fonction:la source
Si votre chiffre est, par exemple,
'5'
en ASCII, il est représenté par le nombre binaire0011 0101
(53). Chaque chiffre a les quatre bits0011
les plus élevés et les 4 bits les plus bas représentent le chiffre en bcd. Alors tu fais justepour obtenir les 4 bits les plus bas, ou, quoi de neuf, le chiffre. Dans asm, il utilise l'
and
opération au lieu desub
(comme dans les autres réponses).la source
'5'
est 53 (00110101
)Voici des fonctions d'assistance qui permettent de convertir un chiffre de char en int et vice versa:
la source
use function: atoi pour un tableau à un entier, atof pour un tableau à un type flottant; ou
la source
Vous le convertiriez en un int (ou float ou double ou tout ce que vous voulez en faire) et le stocker dans une variable.
la source