Разбор чисел на позиции в данной строке - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть std::string со значением 1T23:

Как я могу получить x = 1, y = 2, z = 3;

Я пытался:

int x = std::atoi(&myString.at(0));
int y = std::atoi(&myString.at(2));
int z = std::atoi(&myString.at(3));

, но он вернул: x = 0, y = 23, z = 3?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2020

Если это все цифры сиглов, это может быть просто:

int x = myString.at(0) - '0';
int y = myString.at(2) - '0';
int z = myString.at(3) - '0';

Конечно, вам нужно обрабатывать потенциальные исключения (например, myString имеет менее 4 символов). at оператор может выдать std::out_of_range.

Также учтите, что если интересующие символы не являются цифрами в myString.

3 голосов
/ 21 апреля 2020

Вы можете сделать это:

int x = std::stoi(myString.substr(0, 1));
int y = std::stoi(myString.substr(2, 1));
int z = std::stoi(myString.substr(3, 1));
2 голосов
/ 21 апреля 2020

std::atoi будет обрабатывать ввод как char const * и попытаться преобразовать из этой позиции в нулевой терминатор.

В этом случае

int x = std::atoi(&myString.at(0));

строка 1T23 преобразуется в int. Поскольку это преобразование невозможно, вы получите результат 0.

Для других случаев:

int y = std::atoi(&myString.at(2));  // converts "23" to 23
int z = std::atoi(&myString.at(3));  // converts "3" to 3

Фактические числа можно получить с помощью std::stoi и с использованием соответствующих подстрок. В качестве альтернативы, поскольку вам нужны только однозначные цифры, вы можете индексировать строку и вычитать '0'. Другие ответы показывают, как именно это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...