Как преобразовать один 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'];
}