Ответы:
Согласно другим ответам, это нормально:
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» являются смежными, но не дает никаких гарантий для других символов, таких как буквы алфавита.
Вычтем «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 (возможно (вставьте шутку о Лиспе))). Я слышал, что это макрос, который примерно соответствует следующему примеру, который 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не null, он содержит первый strtol()найденный нецифровой символ (но кого это волнует).
itoa_s().
Вычтите 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');
numeralChar - '0'уже имеет тип int, поэтому приведение не требуется. Даже если бы его не было, гипс не нужен.
Преобразовать символьную цифру в соответствующее целое число. Сделайте как показано ниже:
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, если он работал в приведенном выше случае).
Павел.
Когда мне нужно сделать что-то подобное, я предварительно запекаю массив с нужными мне значениями.
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. Вы можете легко адаптировать это для работы с шестнадцатеричными цифрами.
Просто используйте 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а четыре младших бита представляют цифру в двоично-десятичном формате. Так ты просто делаешь
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
чтобы получить младшие 4 бита или, что то же самое, цифру. В asm он использует andоперацию вместо sub(как в других ответах).
'5'is 53 ( 00110101)
Вот вспомогательные функции, которые позволяют преобразовывать цифру из char в int и наоборот:
int toInt(char c) {
return c - '0';
}
char toChar(int i) {
return i + '0';
}
используйте функцию: atoi для преобразования массива в целое число, atof для преобразования массива в тип с плавающей запятой; или
char c = '5';
int b = c - 48;
printf("%d", b);