Existe-t-il un moyen de convertir un caractère en entier en C?
Par exemple, de '5'
à 5?
Comme dans les autres réponses, c'est très bien:
char c = '5';
int x = c - '0';
En outre, pour vérifier les erreurs, vous voudrez peut-être vérifier que isdigit (c) est vrai en premier. Notez que vous ne pouvez pas faire de même de manière totalement portable les lettres, par exemple:
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
La norme garantit que les caractères des chiffres «0» à «9» sont contigus, mais ne garantit pas les autres caractères tels que 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 son chiffre précédent (section 5.2.1/3
du brouillon C99 ). La même chose compte pour C++.
Si, par hasard, vous voulez convertir un string de caractères en un entier, vous pouvez le faire aussi!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val
est maintenant 1024. Apparemment, atoi()
convient, et ce que j'ai dit plus tôt ne s'applique qu'à moi (sous OS X (peut-être (insérez ici la blague LISP ici))). J'ai entendu dire qu'il s'agissait d'une macro qui correspond approximativement à 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 convertit *str
en une long
en le traitant comme s'il s'agissait d'un nombre base
de base. Si **endptr
n'est pas nul, il contient le premier caractère non numérique strtol()
trouvé (mais qui s'en soucie).
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
Soustrayez le caractère '0' ou int 48 comme ceci:
char c = '5';
int i = c - '0';
OR
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. Faites comme ci-dessous:
char c = '8';
int i = c - '0';
La logique derrière le calcul ci-dessus consiste à jouer avec les valeurs ASCII. ASCII la valeur du caractère 8 est 56, ASCII la valeur du caractère 0 est 48. ASCII la valeur du nombre entier 8 est 8.
Si nous soustrayons deux caractères, la soustraction aura lieu entre ASCII des 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 ASCII zéro de la valeur ASCII devrait fonctionner correctement.
Si vous voulez convertir des nombres plus grands, voici ce que vous ferez:
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.
Vérifie ça,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
pour seulement 0,1,2, ...., E, F.
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 !!!
}
Si votre chiffre est, par exemple, '5'
, dans 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 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 que ce soit, le chiffre. Dans asm, il utilise l'opération and
au lieu de sub
(comme dans les autres réponses).
Utilisez simplement la fonction atol()
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Quand j'ai besoin de faire quelque chose comme ça, je prépare un tableau avec les valeurs que je veux.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
Alors la conversion est facile
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
C'est en gros l'approche adoptée par de nombreuses implémentations de la bibliothèque ctype . Vous pouvez l'adapter trivialement pour qu'il fonctionne également avec des chiffres hexadécimaux.
Voici des fonctions d'assistance qui permettent de convertir digit en caractère en int et vice versa:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}