Как преобразовать один символ в int

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

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

11 ответов

Решение

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

#define toDigit(c) (c-'0')

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

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

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

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
    int num ;
    num = atoi(argv[1]);
    printf("\n%d", num);
}

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

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

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

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

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

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

#include<iostream>
#include<stdlib>
using namespace std;

void main()
{
     char ch;
     int x;
     cin >> ch;
     x = char (ar[1]);
     cout << x;
}

Я согласен с @jalf. Использование sstream библиотеки и Стой , как представляется , рекомендуемый подход:

      #include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {

  stringstream st;
  st << 1  << '2';

  cout << stoi(st.str()) + 1; 

  return 0;
}

Выход

      13

Я новый студент C++, но давний разработчик стека LAMP. Я надеялся, что у строкового класса будет больше вещей для плавного перехода между символами и строками, но я еще не нашел такой вещи, которая поддерживается изначально.

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

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

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

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;
    }
}

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

int charToInt(char c)
{
   int arr[]={0,1,2,3,4,5,6,7,8,9};
   return arr[c-'0'];
}

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

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

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

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

Другие вопросы по тегам