Réponses:
Comme pour d'autres réponses, c'est bien:
char c = '5';
int x = c - '0';
De plus, pour la vérification des erreurs, vous souhaiterez peut-être vérifier que isdigit (c) est vrai en premier. Notez que vous ne pouvez pas faire de même pour les lettres, par exemple:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
La norme garantit que les valeurs char pour les chiffres «0» à «9» sont contiguës, mais n'offre aucune garantie pour les autres caractères comme les lettres de l'alphabet.
Soustrayez «0» comme ceci:
int i = c - '0';
La norme C garantit que chaque chiffre de la plage '0'..'9'
est supérieur de un à son chiffre précédent (dans la section 5.2.1/3
du projet C99 ). La même chose vaut pour C ++.
Si, par une folle coïncidence, vous voulez convertir une chaîne de caractères en entier, vous pouvez le faire aussi!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
est maintenant 1024. Apparemment atoi()
, ç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 utilise strtol()
une fonction plus générale pour effectuer la conversion à la place:
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol()
fonctionne comme ceci:
long strtol(const char *str, char **endptr, int base);
Il se convertit *str
en a long
, le traitant comme s'il s'agissait d'un base
nombre de base . S'il **endptr
n'est pas nul, il contient le premier caractère non numérique strtol()
trouvé (mais qui s'en soucie).
itoa_s()
.
Soustrayez le caractère '0' ou int 48 comme ceci:
char c = '5';
int i = c - '0';
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
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
Cela signifie que si vous déduisez 48 de n'importe quel caractère numérique, il convertira automatiquement l'entier.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'
est déjà de type int
, 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:
char c = '8';
int i = c - '0';
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.
int i = 56 - 48;
i = 8;
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:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** n'oubliez pas de vérifier le statut (qui devrait être 1 si cela a fonctionné dans le cas ci-dessus).
Paul.
Quand j'ai besoin de faire quelque chose comme ça, je pré-cuit un tableau avec les valeurs que je veux.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Ensuite, la conversion est facile
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
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.
Utilisez simplement la atol()
fonction:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Si votre chiffre est, par exemple, '5'
en ASCII, il est représenté par le nombre binaire 0011 0101
(53). Chaque chiffre a les quatre bits 0011
les plus élevés et les 4 bits les plus bas représentent le chiffre en bcd. Alors tu fais juste
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
pour obtenir les 4 bits les plus bas, ou, quoi de neuf, le chiffre. Dans asm, il utilise l' and
opération au lieu de sub
(comme dans les autres réponses).
'5'
est 53 ( 00110101
)
Voici des fonctions d'assistance qui permettent de convertir un chiffre de char en int et vice versa:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
use function: atoi pour un tableau à un entier, atof pour un tableau à un type flottant; ou
char c = '5';
int b = c - 48;
printf("%d", b);