Відповіді:
Як і в інших відповідях, це добре:
char c = '5';
int x = c - '0';
Також для перевірки помилок ви можете спочатку перевірити isdigit (c). Зверніть увагу, що ви не можете повністю переносити те саме для листів, наприклад:
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на a long, трактуючи його як би базове baseчисло. Якщо **endptrце не нуль, він містить перший strtol()знайдений нецифровий символ (але кого це хвилює).
itoa_s().
Віднімаємо знак "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а найнижчі 4 біти представляють цифру у bcd. Так ви просто зробите
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
щоб отримати найменші 4 біти, або, що це те саме, цифру. У asm він використовує andоперацію замість sub(як в інших відповідях).
'5'є 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);