Как преобразовать один char в int
У меня есть строка цифр, например. "123456789", и мне нужно извлечь каждый из них, чтобы использовать их в расчете. Я могу, конечно, получить доступ к каждому char по индексу, но как преобразовать его в int?
Я просмотрел atoi(), но в качестве аргумента он принимает строку. Следовательно, я должен преобразовать каждый char в строку, а затем вызвать atoi на нем. Есть ли лучший способ?
Ответы
Ответ 1
Вы можете использовать тот факт, что кодировки символов для цифр находятся в порядке от 48 (для "0" ) до 57 (для "9" ). Это справедливо для ASCII, UTF-x и практически всех других кодировок (подробнее см. Комментарии ниже).
Поэтому целочисленное значение для любой цифры - это цифра минус '0' (или 48).
char c = '1';
int i = c - '0'; // i is now equal to 1, not '1'
является синонимом
char c = '1';
int i = c - 48; // i is now equal to 1, not '1'
Однако я нахожу первый c - '0'
более читаемым.
Ответ 2
#define toDigit(c) (c-'0')
Ответ 3
Или вы можете использовать "правильный" метод, похожий на ваш исходный подход atoi, но вместо этого вместо std:: stringstream. Это должно работать с символами как входными, так и строковыми. (boost:: lexical_cast - еще один вариант для более удобного синтаксиса)
(atoi - старая функция C, и, как правило, рекомендуется использовать более гибкие и типичные эквиваленты С++, где это возможно. std:: stringstream охватывает преобразование в строки и из них)
Ответ 4
Вы можете использовать функцию atoi()
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int num ;
num = atoi(argv[1]);
printf("\n%d", num);
}
Ответ 5
#include<iostream>
#include<stdlib>
using namespace std;
void main()
{
char ch;
int x;
cin >> ch;
x = char (ar[1]);
cout << x;
}
Ответ 6
Полученные ответы являются замечательными, пока вы только хотите обрабатывать арабские цифры и работаете в кодировке, где эти цифры являются последовательными, и в том же месте, что и ASCII.
Это почти всегда так.
Если это не так, вам нужна правильная библиотека, которая поможет вам.
Начнем с ICU.
- Сначала преобразуйте байтовую строку в строку юникода. (Слева в качестве упражнения для читателя).
- Затем используйте uchar.h, чтобы посмотреть на каждый символ.
- если символ
UBool u_isdigit (UChar32 c)
- тогда значение
int32_t u_charDigitValue ( UChar32 c )
Или, возможно, у ICU есть определенная функция, чтобы сделать это для вас - я не смотрел на нее подробно.
Ответ 7
Если вы беспокоитесь о кодировании, вы всегда можете использовать оператор switch.
Просто будьте осторожны с форматом, в котором вы храните эти большие числа. Максимальный размер для целого числа в некоторых системах составляет всего 65 535 (32 767 подписанных). В других системах у вас есть 2 147 483 647 (или 4 294 967 295 неподписанных)
Ответ 8
Любые проблемы со следующим образом:
int CharToInt(const char c)
{
switch (c)
{
case '0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
default:
return 0;
}
}
Ответ 9
Таким образом, вы легко конвертируете char в int и int в char:
int charToInt(char c)
{
int arr[]={0,1,2,3,4,5,6,7,8,9};
return arr[c-'0'];
}