Convertir un chiffre de caractère en entier correspondant en C
14 réponses
Comme pour les autres réponses, c'est très bien:
char c = '5';
int x = c - '0';
aussi, pour la vérification des erreurs, vous pouvez vérifier si isdigit(c) est true en premier. Notez que vous ne pouvez pas faire complètement la même chose pour les lettres, par exemple:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
la norme garantit que les valeurs de caractères pour les chiffres " 0 " à " 9 " sont contiguës, mais ne garantit rien 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 gamme '0'..'9'
est supérieur à son chiffre précédent (dans la section 5.2.1/3
du C99 draft ). La même chose vaut pour le C++.
si, par une coïncidence folle, vous voulez convertir une chaîne de caractères à un entier, vous pouvez le faire aussi!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
est maintenant 1024. Apparemment atoi()
est très bien, et ce que j'ai dit à ce sujet plus tôt ne s'applique qu'à moi (sur OS X (peut-être (insérez la blague de 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 faire 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 convertit *str
en long
, le traitant comme s'il s'agissait d'un numéro de base base
. Si **endptr
n'est pas nul, il contient le premier caractère strtol()
trouvé (mais qui s'en soucie).
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
soustraire char '0' ou int 48 comme ceci:
char c = '5';
int i = c - '0';
ou
char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48
pour convertir le chiffre de caractère en entier correspondant. Faire 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 les ASCII des caractères.
int i = 56 - 48;
i = 8;
si c'est juste un seul caractère 0-9 en ASCII, alors soustraire la valeur du zéro ascii de la valeur ASCII devrait fonctionner très bien.
si vous voulez convertir des nombres plus grands alors le suivant fera:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
* * n'oubliez pas de vérifier le statut (qui devrait être 1 s'il a fonctionné dans le cas ci-dessus).
Paul.
char chVal = '5';
char chIndex;
if ((chVal >= '0') && (chVal <= '9')) {
chIndex = chVal - '0';
}
else
if ((chVal >= 'a') && (chVal <= 'z')) {
chIndex = chVal - 'a';
}
else
if ((chVal >= 'A') && (chVal <= 'Z')) {
chIndex = chVal - 'A';
}
else {
chIndex = -1; // Error value !!!
}
quand j'ai besoin de faire quelque chose comme ça, je prebake un tableau avec les valeurs que je veux.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
puis 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 trivialement adapte à travailler avec des chiffres hexadécimaux.
Check this,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
pour seulement 0,1,2,....,E, F.
il suffit D'utiliser la fonction atol()
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
si votre chiffre est, disons, '5'
, en ASCII il est représenté par le nombre binaire 0011 0101
(53). Chaque chiffre a les quatre bits les plus élevés 0011
et les 4 bits les plus bas représentent le chiffre dans bcd. Donc vous faites juste
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
pour obtenir les 4 bits les plus bas, ou, quoi qu'il en soit, le chiffre. Dans asm, il utilise and
opération au lieu de sub
(comme dans les autres réponses).
utilisation de la fonction: atoi pour le tableau en entier, atof pour tableau de type float; ou
char c = '5';
int b = c - 48;
printf("%d", b);
vous le moulez à un int (ou float ou double ou ce que vous voulez en faire d'autre) et le stockez dans une variable anoter.