Convertir un chiffre de caractère en entier correspondant en C

y a-t-il un moyen de convertir un caractère en entier en C?

par exemple, de '5' à 5?

61
demandé sur nbro 2009-03-10 05:53:12

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.

86
répondu Chris 2009-03-10 02:59:39

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++.

28
répondu Johannes Schaub - litb 2009-03-10 02:54:52

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).

21
répondu Chris Lutz 2016-12-09 17:28:51
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
4
répondu Kevin Conner 2009-03-10 02:55:30

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
4
répondu Arif 2017-06-09 09:34:26

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;
1
répondu Ashish 2018-03-05 08:58:20

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.

0
répondu Paul W Homer 2009-03-10 03:05:54
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 !!!
}
0
répondu Alphaneo 2009-03-10 14:43:59

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.

0
répondu Michael Anderson 2010-02-26 04:38:31

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.

0
répondu Shiva 2015-01-05 10:18:54

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);

}
0
répondu Dylan halls 2017-06-03 01:27:10

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).

0
répondu Garmekain 2018-08-10 14:59:56

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);
-2
répondu K.tin 2017-03-18 05:14:09

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.

-3
répondu SeanJA 2009-03-10 02:59:49