Как преобразовать один символ в int - PullRequest
53 голосов
/ 13 января 2009

У меня есть строка цифр, например, «123456789», и мне нужно извлечь каждый из них, чтобы использовать их в расчете. Конечно, я могу получить доступ к каждому символу по индексу, но как мне преобразовать его в int?

Я посмотрел в atoi (), но он принимает строку в качестве аргумента. Следовательно, я должен преобразовать каждый символ в строку и затем вызвать atoi. Есть ли лучший способ?

Ответы [ 10 ]

135 голосов
/ 13 января 2009

Вы можете использовать тот факт, что кодировки символов для цифр все в порядке от 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' гораздо более читабельным.

20 голосов
/ 08 декабря 2010
#define toDigit(c) (c-'0')
8 голосов
/ 13 января 2009

Или вы можете использовать «правильный» метод, аналогичный вашему первоначальному подходу atoi, но вместо этого с std :: stringstream. Это должно работать как с символами в качестве входных данных, так и со строками. (boost :: lexical_cast - еще одна опция для более удобного синтаксиса)

(atoi - старая функция C, и обычно рекомендуется использовать более гибкие и безопасные с точки зрения типов эквиваленты C ++, где это возможно. Std :: stringstream охватывает преобразование в и из строк)

4 голосов
/ 19 июля 2016

Вы можете использовать функцию atoi ()

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
    int num ;
    num = atoi(argv[1]);
    printf("\n%d", num);
}
3 голосов
/ 15 мая 2009

Предоставленные ответы хороши, если вы хотите обрабатывать только арабские цифры и работаете в кодировке, в которой эти цифры являются последовательными, и там же, где и ASCII.

Это почти всегда так.

Если это не так, вам нужна соответствующая библиотека, чтобы помочь вам.

Давайте начнем с ICU .

  1. Сначала преобразуйте строку байта в строку Unicode. (Оставлено как упражнение для читателя).
  2. Затем используйте uchar.h для просмотра каждого символа.
  3. если мы персонаж UBool u_isdigit (UChar32 c)
  4. тогда значение равно int32_t u_charDigitValue ( UChar32 c )

Или, может быть, ICU имеет какую-то функцию, чтобы сделать это для вас - я не рассматривал это подробно.

2 голосов
/ 01 февраля 2009
#include<iostream>
#include<stdlib>
using namespace std;

void main()
{
     char ch;
     int x;
     cin >> ch;
     x = char (ar[1]);
     cout << x;
}
1 голос
/ 03 января 2017

Таким образом, вы можете легко преобразовать char в int и int в char:

int charToInt(char c)
{
   int arr[]={0,1,2,3,4,5,6,7,8,9};
   return arr[c-'0'];
}
1 голос
/ 14 января 2009

Есть проблемы со следующим способом сделать это?

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;
    }
}
1 голос
/ 13 января 2009

Если вы беспокоитесь о кодировании, вы всегда можете использовать оператор switch.

Только будьте осторожны с форматом, в котором хранятся эти большие числа. Максимальный размер целого числа в некоторых системах составляет всего 65 535 (32 767 со знаком). В других системах у вас есть 2 147 483 647 (или 4 294 967 295 неподписанных)

0 голосов
/ 18 октября 2018

Для меня вполне сработало следующее:

QChar c = '5';
int x = c.digitValue();
// x is now 5

Документация: int QChar :: digitValue () const , которая говорит:

Возвращает числовое значение цифры или -1, если символ не цифра.

...