36 votes

Conversion de char en int en C

Si je veux convertir un unique numérique char à la valeur numérique, par exemple, si:

char c = '5';

et je veux c de détenir 5 au lieu de '5', c'est 100% portable de le faire comme ça?

c = c - '0';

J'ai entendu dire que tous les jeux de caractères stocker les numéros dans l'ordre consécutif, donc je suppose que oui, mais j'aimerais savoir si il y a une bibliothèque organisée fonction pour faire cette conversion, et comment il est fait de manière conventionnelle. Je suis un vrai débutant :)

28voto

unwind Points 181987

Oui, c'est sûr, à la conversion. C impose de le travail. Cette garantie est dans la section 5.2.1 du paragraphe 2 de la dernière ISO C standard, un récent projet de qui est N1570:

De base, la source et la base de l'exécution des jeux de caractères sont les suivants membres:
[...]
le 10 décimal chiffres
0 1 2 3 4 5 6 7 8 9
[...]
À la fois la source et l'exécution de base des jeux de caractères, le la valeur de chaque caractère après 0 dans la liste ci-dessus de chiffres après la virgule doit être plus grand que la valeur de la précédente.

ASCII et EBCDIC, et les jeux de caractères dérivés, de satisfaire à cette exigence, qui est pourquoi le C standard a été en mesure de l'imposer. Notez que les lettres ne sont pas contigus en EBCDIC, et C ne les oblige pas à être.

Il n'existe pas de fonction de bibliothèque à le faire pour un seul char, vous auriez besoin de construire une chaîne de première:

int digit_to_int(char d)
{
 char str[2];

 str[0] = d;
 str[1] = '\0';
 return (int) strtol(str, NULL, 10);
}

Vous pouvez également utiliser l' atoi() fonction pour faire la conversion, une fois que vous avez une chaîne de caractères, mais strtol() est meilleur et plus sûr.

Comme les commentateurs l'ont souligné, c'est l'extrême exagéré d'appeler une fonction pour effectuer cette conversion; votre approche initiale de la soustraire '0' est la bonne façon de le faire. Je voulais juste montrer comment la norme recommandée approche de la conversion d'un nombre en une chaîne de caractères à un "vrai" nombre serait utilisé, ici.

9voto

lsalamon Points 5192

Essaye ça :

char c = '5' - '0';

5voto

weloytty Points 621

Vous pouvez utiliser atoi, qui fait partie de la bibliothèque standard, voir http://www.cppreference.com/wiki/c/string/atoi

5voto

spinfire Points 901
int i = c - '0';

Vous devez être conscient que ce n'effectue pas de validation par le caractère - par exemple, si le personnage était " a " alors, vous obtiendrez 91 - 48 = 49. Surtout si vous traitez avec l'utilisateur ou le réseau d'entrée, il vous faudra probablement effectuer une validation pour éviter le mauvais comportement de votre programme. Il suffit de cocher la gamme:

if ('0' <= c &&  c <= '9') {
    i = c - '0';
} else {
    /* handle error */
}

Notez que si vous voulez que votre conversion à la poignée de chiffres hexadécimaux, vous pouvez consulter la gamme et d'effectuer le calcul correspondant.

if ('0' <= c && c <= '9') {
    i = c - '0';
} else if ('a' <= c && c <= 'f') {
    i = 10 + c - 'a';
} else if ('A' <= c && c <= 'F') {
    i = 10 + c - 'A';
} else {
    /* handle error */
}

Qui vous permet de convertir un seul hex de caractères, majuscules ou minuscules indépendant, en un entier.

1voto

Joe Corkery Points 906

Oui. C'est sûr tant que vous utilisez des caractères ascii standard, comme vous le faites dans cet exemple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X