Как преобразовать один символ в 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'
гораздо более читабельным.
Или вы можете использовать "правильный" метод, похожий на ваш оригинальный подход 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.
- Сначала преобразуйте строку байта в строку Unicode. (Оставлено как упражнение для читателя).
- Затем используйте uchar.h, чтобы посмотреть на каждого персонажа.
- если мы персонаж
UBool u_isdigit (UChar32 c)
- тогда значение
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, если символ не является цифрой.