Преобразовать символьную цифру в соответствующее целое число в C - PullRequest
83 голосов
/ 10 марта 2009

Есть ли способ преобразовать символ в целое число в C?

Например, от '5' до 5?

Ответы [ 14 ]

111 голосов
/ 10 марта 2009

Как и в других ответах, это нормально:

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

Также, для проверки ошибок, вы можете сначала проверить, что isdigit (c) - true. Обратите внимание, что вы не можете полностью переносить то же самое для букв, например:

char c = 'b';
int x = c - 'a'; // x is now not necessarily 1

Стандарт гарантирует, что значения символов для цифр от 0 до 9 являются смежными, но не дает гарантий для других символов, таких как буквы алфавита.

36 голосов
/ 10 марта 2009

Вычтите '0' так:

int i = c - '0';

Стандарт C гарантирует, что каждая цифра в диапазоне '0'..'9' больше, чем ее предыдущая цифра (в разделе 5.2.1/3 черновика C99 ). То же самое относится к C ++.

25 голосов
/ 10 марта 2009

Если по случайному совпадению вы хотите преобразовать строку символов в целое число, вы тоже можете это сделать!

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

val теперь 1024. Очевидно, atoi() в порядке, и то, что я сказал об этом ранее, относится только ко мне (на OS X (возможно (вставьте шутку Lisp здесь))). Я слышал, что это макрос, который приблизительно соответствует следующему примеру, в котором вместо преобразования используется strtol(), функция более общего назначения:

char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long

strtol() работает так:

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

Он преобразует *str в long, рассматривая его как базовое base число. Если **endptr не равно нулю, он содержит первый найденный нецифровый символ strtol() (но кого это волнует).

6 голосов
/ 30 августа 2015

Вычтите char '0' или int 48 следующим образом:

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

Объяснение: Внутренне оно работает со значением ASCII . Из таблицы ASCII десятичное значение символа 5 составляет 53 , а 0 - 48 . Итак 53 - 48 = 5

OR

char c = '5';
int i = c - 48; // Because decimal value of char '0' is 48

Это означает, что если вычесть 48 из любого числового символа, он автоматически преобразует целое число.

5 голосов
/ 10 марта 2009
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
3 голосов
/ 05 марта 2018

Чтобы преобразовать символьную цифру в соответствующее целое число. Сделайте как показано ниже:

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

Логика, лежащая в основе приведенного выше расчета, заключается в игре со значениями ASCII. Значение ASCII символа 8 равно 56, значение ASCII символа 0 равно 48. Значение ASCII целого числа 8 равно 8.

Если мы вычтем два символа, между ASCII символов произойдет вычитание.

int i = 56 - 48;   
i = 8;
0 голосов
/ 10 августа 2018

Если ваша цифра, скажем, '5', в ASCII она представляется как двоичное число 0011 0101 (53). Каждая цифра имеет старшие четыре бита 0011, а младшие 4 бита представляют цифру в bcd. Так что вы просто делаете

char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5

чтобы получить младшие 4 бита или, что то же самое, цифру. В asm он использует and операцию вместо sub (как в других ответах).

0 голосов
/ 03 июня 2017

Просто используйте функцию atol():

#include <stdio.h>
#include <stdlib.h>

int main() 
{
    const char *c = "5";
    int d = atol(c);
    printf("%d\n", d);

}
0 голосов
/ 18 марта 2017

использовать функцию: atoi для массива в целое число, atof для массива в тип с плавающей запятой; или

char c = '5';
int b = c - 48;
printf("%d", b);
0 голосов
/ 05 января 2015

Проверьте это,

char s='A';

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

только для 0,1,2, ...., E, F.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...