Как мне заставить мой код работать так, чтобы не обрезать слова (строки)?

Целью этой программы должно быть создание такой выходной строки, что:

  1. Выходная строка + с пробелами между ними == ширине.
  2. Строки не обрезаются. Таким образом, он выдает полные слова в строке.

Это то, что у меня есть до сих пор:

int main()
{
    int width= 15;
    vector<string> line;
    line.push_back("Hello");
    line.push_back("My");
    line.push_back("Name");
    line.push_back("Is");
    line.push_back("John");

    auto s = line.front();
    for (auto i = std::size_t {1}; i < line.size(); ++i) s += ' ' + line[i];


    for (size_t i = 0; i < s.length(); i+=width+1)
    {
        s.insert(i,"\n");
    }

    cout<<s;

}

Я не хочу добавлять пробелы между словами равномерно, чтобы последняя строка не обрезалась и не перемещалась на следующую строку.

Это похоже на вопрос о полном выравнивании текста C++ , но я хочу исправить свой собственная реализация решения этой проблемы.


person Sadij    schedule 18.03.2016    source источник
comment
Я не уверен, что совсем понимаю, вы хотите, чтобы он напечатал Hello My Name Is John, где John находится на новой строке?   -  person Reousa Asteron    schedule 18.03.2016
comment
Вы пытаетесь уместить предложение по ширине консоли?   -  person NathanOliver    schedule 18.03.2016
comment
Возможно, это то, что вы ищете: stackoverflow.com/questions/22983008/   -  person Flovdis    schedule 18.03.2016


Ответы (1)


Что вы делаете, так это вставляете новую строку в строку после того, как она уже была сформирована, таким образом, возможно, сокращая слово до новой строки.

Было бы лучше проверить, не станет ли длина строки больше, чем желаемая ширина вашей строки, если вы вставите новое слово перед добавлением к нему другого слова.

Вот что я мог придумать

int main()
{
    int width= 15;
    vector<string> line;
    line.push_back("Hello");
    line.push_back("My");
    line.push_back("Name");
    line.push_back("Is");
    line.push_back("John");

    std::string s {};
    for (int i {0}; i < line.size(); ++i)
        {
            if( (s + line[i] + " ").size() <= width)
            {
                s += line[i] + " ";
            }
            else
            {
                s += "\n" + line[i] + " ";
                width += width;
            }
        }
    cout<<s;
}
person Reousa Asteron    schedule 18.03.2016