Question

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

Par exemple, de '5' à 5?

Était-ce utile?

La solution

Comme dans les autres réponses, c'est correct:

char c = '5';
int x = c - '0';

En outre, pour la vérification des erreurs, vous pouvez vérifier si 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 valeurs de caractère pour les chiffres "0" à "9" sont contiguës, mais ne garantit pas les autres caractères tels que les lettres de l'alphabet.

Autres conseils

Soustrayez '0' comme ceci:

int i = c - '0';

La norme C garantit que chaque chiffre de l'intervalle '0' .. '9' est supérieur de son chiffre précédent (dans la section 5.2.1 / 3 de le brouillon C99 ). Même chose pour C ++.

Si, par une folle coïncidence, vous souhaitez convertir une chaîne de caractères en un entier, vous pouvez également le faire!

char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int

val est maintenant 1024. Apparemment, atoi () convient, et ce que j'en ai dit précédemment ne s'applique qu'à moi (sous OS X (peut-être (insérer une 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 suit:

long strtol(const char *str, char **endptr, int base);

Il convertit * str en un long , en 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 non numérique strtol () trouvé (mais qui s'en soucie).

Soustrayez le caractère '0' ou l'int 48 comme ceci:

char c = '5';
int i = c - '0';

Explication: En interne, cela fonctionne avec la valeur ASCII . Dans la table ASCII, la valeur décimale du caractère 5 correspond à 53 et 0 à 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 tout caractère numérique, le nombre entier sera converti automatiquement.

char numeralChar = '4';
int numeral = (int) (numeralChar - '0');

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. La valeur ASCII du caractère 8 est 56, la valeur ASCII du caractère 0 est 48. La valeur ASCII du nombre entier 8 est 8.

Si nous soustrayons deux caractères, la soustraction se produira entre les caractères ASCII.

int i = 56 - 48;   
i = 8;

S'il ne s'agit que d'un seul caractère compris entre 0 et 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 l'état (qui devrait être égal à 1 si cela 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 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 également adapter cela de manière triviale à l’utilisation de chiffres hexadécimaux.

Cochez cette case,

char s='A';

int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);

pour seulement 0,1,2, ...., E, F.

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

}

Si votre chiffre est, par exemple, '5' , il est représenté en ASCII comme 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. 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 que ce soit, le chiffre. Dans asm, il utilise les opérations et au lieu de sub (comme dans les autres réponses).

use function: atoi pour un tableau entier, atof pour un tableau flottant; ou

char c = '5';
int b = c - 48;
printf("%d", b);

Vous le jetteriez dans un int (ou un float ou un double ou quoi que ce soit d'autre que vous souhaitiez en faire) et le stockeriez dans une autre variable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top