Как преобразовать символ, взятый из строки, в int? - PullRequest
2 голосов
/ 05 апреля 2020

Итак, у меня есть строка, содержащая числа, и я хочу взять одно из этих чисел и преобразовать его в целое число следующим образом:

string s = "13245";
int a = stoi(s.at(3));

Я пробовал стои:

int a = stoi(s.at(3));

Я попробовал atoi:

int a = atoi(s.at(3));

Но ни один из этих способов не работает, единственный способ, который я нашел, - это C способ:

int a = s.at(3)-'0';

Знаете ли вы, почему стои / атой не работают? У вас есть какой-нибудь другой способ преобразовать символ, взятый из строки, в int?

Ответы [ 4 ]

4 голосов
/ 05 апреля 2020

Функция stoi ожидает объект типа std :: string. Функция C atoi ожидает объект типа char *, который указывает на строку. Пока вы имеете дело с объектом типа char.

Этот

int a = s.at(3)-'0';

является распространенным подходом для преобразования внутреннего представления символа di git в соответствующее целочисленное значение, поскольку коды цифр следуют друг за другом без пробелов.

Из стандарта C ++ (2.3 набора символов)

... В исходных и исполняющих наборах символов c значение каждого символа после 0 в приведенном выше списке десятичных цифр должно быть на единицу больше, чем значение предыдущего.
1 голос
/ 05 апреля 2020

std :: string - это массив символов, и .at (3) или [3] вернет вам один символ. Stoi и Atoi работают со строками (многие символы) и преобразуют строку типа «-42» в ее числовое представление -42.

#include <iostream>
#include <string>


int main() {
    const std::string str = "1324509";

    for(const char ch: str) {
        const int a = ch & 0x0f; // the same as  ch - '0';
        printf("%i,",a);
    }

    return 0;
}

Live Code

0 голосов
/ 05 апреля 2020

Согласно документации:

Stoi анализирует str, интерпретируя его содержимое как целое число указанной базы, и возвращает значение типа int.

int stoi (const string&  str, size_t* idx = 0, int base = 10);

Параллельно с Ваш код:

#include <iostream>
#include <string>
#include <typeinfo> 

using namespace std;

string s = "13245";
cout << typeid(s.at(3)).name();
// Prints out 'c' which means 'char'

Поэтому вам необходимо преобразовать char в string перед использованием stoi

#include <iostream>
#include <string>

using namespace std

string s = "13245";
string m(1,s.at(3));
int a = stoi(m);
0 голосов
/ 05 апреля 2020

atoi принимает const char *, тогда как s.at (index) возвращает char, следовательно, компилятор возвращает ошибку типа, вместо этого вы можете сделать следующее:

    string s = "13245";
    auto c = s.at(3);
    int a = atoi(&c);
...