Преобразуйте цифру символа в соответствующее целое число в C
-
07-07-2019 - |
Вопрос
Есть ли способ преобразовать символ в целое число в C?
Например, из '5'
до 5?
Решение
Как и в других ответах, это нормально:
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 являются смежными, но не дает никаких гарантий для других символов, таких как буквы алфавита.
Другие советы
Вычтите '0' следующим образом:
int i = c - '0';
Стандарт C гарантирует, что каждая цифра в диапазоне '0' .. '9'
больше, чем ее предыдущая цифра (в разделе 5.2.1 / 3
черновик C99 ). То же самое относится к C ++.
Если по стечению обстоятельств вы хотите преобразовать строку символов в целое число, вы тоже можете это сделать!
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 ()
(но кого это волнует).
Вычтите 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 из любого цифрового символа он автоматически преобразует целое число.
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
Чтобы преобразовать символьную цифру в соответствующее целое число. Сделайте, как показано ниже:
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–9 в ASCII, то вычитание значения нулевого символа ASCII из значения ASCII должно работать нормально.
Если вы хотите конвертировать большие числа, то подойдет следующее:
char *string = "24";
int value;
int assigned = sscanf(string, "%d", &value);
** не забудьте проверить статус (который должен быть равен 1, если в приведенном выше случае это сработало).
Павел.
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 !!!
}
Когда мне нужно сделать что-то подобное, я предварительно запекаю массив с нужными значениями.
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. Вы можете легко адаптировать это для работы с шестнадцатеричными цифрами.
Проверьте это,
char s='A';
int i = (s<='9')?(s-'0'):(s<='F')?((s-'A')+10):((s-'a')+10);
только для 0,1,2, ...., E, F.
Просто используйте функцию atol ()
:
#include <stdio.h>
#include <stdlib.h>
int main()
{
const char *c = "5";
int d = atol(c);
printf("%d\n", d);
}
Если ваша цифра, скажем, '5'
, в ASCII она представляется в виде двоичного числа 0011 0101
(53). Каждая цифра имеет старшие четыре бита 0011
, а младшие 4 бита представляют цифру в bcd. Так что вы просто делаете
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
чтобы получить младшие 4 бита или, что то же самое, цифру. В asm он использует операции и
вместо sub
(как в других ответах).
использовать функцию: atoi для массива в целое число, atof для массива в тип с плавающей точкой; или
char c = '5';
int b = c - 48;
printf("%d", b);
Вы могли бы привести его к типу int (или к числу с плавающей точкой, или к двойному, или к тому, что еще вы хотите сделать с ним) и сохранить его в переменной anoter.