Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Получить два числа из строки C++

#cpp #строки


Есть строка формата "123,456,123,23,789,67". 6 чисел разделены запятыми.
Необходимо получить 2 последних числа в переменные типа int.

Проблема решается легко при помощи sscanf():

#include 

int main(int argc, char* argv[])
{
    char buf[] = "123,456,123,23,789,67";
    int a1, a2, a3, a4, a5, p1, p2;

    sscanf(buf, "%d,%d,%d,%d,%d,%d", &a1, &a2, &a3, &a4, &p1, &p2);

    return 0;
}


Вопрос: Как решить эту проблему при помощи iterator'ов и методов класса string?
    


Ответы

Ответ 1



Для начала можно разбить строку на подстроки. Вариантов реализаций этого (фактически - метод split) - вагон и маленькая тележка. Приведу один, совсем примитивный, для примера: #include #include #include std::vector split(std::string & s, char delimeter) { std::stringstream ss(s); std::string item; std::vector tokens; while (std::getline(ss, item, delimeter)) { tokens.push_back(item); } return tokens; } Соответственно, std::string s("123,456,123,23,789,67"); std::vector tokens = split(s, ','); Ну а что делать с получившимся вектором - уже творчески :)

Ответ 2



Если требуется получить несколько последних чисел, то и читать логично с конца, чтобы не обрабатывать потенциально лишние данные. #include #include int main() { const std::string buf = "123,456,123,23,789,67"; size_t ppos = std::string::npos; do { size_t pos = buf.find_last_of(',', ppos - 1); int v = stoi(buf.substr(pos + 1, ppos - (pos + 1))); std::cout << v << "\n"; // Используем `v` по назначению ppos = pos; } while( ppos != std::string::npos ); } Посмотреть результат После получения нужного количества данных, цикл можно прервать.

Комментариев нет:

Отправить комментарий