Преобразование символьной цифры в соответствующее целое число в C

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

int i = c - '0';

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

Ответ 3

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

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() найденный (но кому это интересно).

Ответ 4

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

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

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

ИЛИ ЖЕ

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

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

Ответ 5

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

Ответ 6

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

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

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

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

int i = 56 - 48;   
i = 8;

Ответ 7

Если это всего лишь один символ 0-9 в ASCII, то вычитание значения нулевого символа ASCII из значения ASCII должно работать нормально.

Если вы хотите преобразовать большие числа, выполните следующие действия:

char *string = "24";

int value;

int assigned = sscanf(string, "%d", &value);

** не забудьте проверить статус (который должен быть 1, если он работал в вышеуказанном случае).

Павел.

Ответ 8

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 !!!
}

Ответ 9

Когда мне нужно сделать что-то подобное, я предваряю массив со значениями, которые я хочу.

const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };

Тогда преобразование легко

int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }

Это в основном подход, используемый многими реализациями библиотеки ctype. Вы можете тривиально адаптировать это для работы с шестнадцатеричными цифрами.

Ответ 10

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

char s='A';

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

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

Ответ 11

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

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

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

}

Ответ 12

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

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

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

Ответ 13

Вот вспомогательные функции, которые позволяют преобразовать цифру в char в int и наоборот:

int toInt(char c) {
    return c - '0';
}

char toChar(int i) {
    return i + '0';
}

Ответ 14

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

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

Ответ 15

Вы передали бы его int (или float или double или что еще вы хотите с ним делать) и сохраните его в переменной anoter.