web-dev-qa-db-fra.com

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

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

Par exemple, de '5' à 5?

72
Flow

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.

103
Chris

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

34

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

24
Chris Lutz
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
5
Kevin Conner

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
5
Arif

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;
3
Ashish

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.

0
Paul W Homer

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.

0
Shiva
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
Alphaneo

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

0
Garmekain

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

}
0
Dylan halls

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.

0
Michael Anderson

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';
}
0
Maxim Makhun