Составить и настроить программу, формирующую результирующую строку, содержащую все последовательности цифр максимальной длины в предложении

дорогие друзья. Помогите написать программу на С++ ибо вы - моя последняя надежда. Нужно выбрать из строки char максимальные последовательности цифр. Например для текста: "11 cars in the garage, 11 cars. Take 1 down to drive, 10 cars in the garage. 10 cars in the garage, 10 cars. Take 1 down to drive, 9 cars in the garage. 9 cars in the garage, 9 cars." должна быть сформирована строка "11 11 10 10 10". При выполнении этой задачи можно использовать стандартные функции обработки строк strcat, strspn, strcspn и т.п

Вот мой код:

#include <iostream>

using namespace std;

int main()
{
    char s1[256] = "11 cars in the garage, 11 cars. Take 1 down to drive, 10 cars in the garage. 10 cars in the garage, 10 cars. Take 1 down to drive, 9 cars in the garage. 9 cars in the garage, 9 cars.";

    cout << "Input string: " << s1 << endl;

    for (int i = 0; i < strlen(s1); i++)
    {
        if (isdigit(s1[i]))
        {
            char temp[2] = { s1[i] };
            cout << atoi(temp) << " ";
        }
    }

    return 0;
}

Но он только выбирает в выводит цифры, а мне нужно максимальные последовательности. Буду очень благодарен кто поможет мне).


Ответы (1 шт):

Автор решения: DmitryK

Если с использованием словаря из стандартной библиотеки, то как-то так:

#include <iostream>
#include <cstring>
#include <stdio.h>
#include <map>

using namespace std;

int main()
{
    char s1[256] = "11 cars in the garage, 11 cars. Take 1 down to drive, 10 cars in the garage. 10 cars in the garage, 10 cars. Take 1 down to drive, 9 cars in the garage. 9 cars in the garage, 9 cars.";

    cout << "Input string: " << s1 << endl;
    map< int, int> counters;
    char * pch;
    pch = strtok (s1, " ,.!?"); // получаем лексему из строки
    while (pch != NULL) // пока строка не закончится
    { 
        if(isdigit(*pch)) // если первый символ - цифра
        {
            int i = atoi(pch); // переводим лексему (подстроку) в целое число
            counters[i]++; // если элемента нет - добавляем его и увеличиваем счетчик
        }
        pch = strtok (NULL, " ,.!?"); // получаем следующую лексему из строки
    }
    
    for(auto c : counters) // просто выводим наши подсчеты
    {
        cout << c.first << " " << c.second << "\n";
    }
    
    return 0;
}

В последнем цикле выводится количество чисел на экран, что легко преобразовать в поиск максимума и вывод числа нужное количество раз.

→ Ссылка