Исправить / улучшить функцию переноса слов

#c #function #word-wrap

#c #функция #перенос слов

Вопрос:

У меня есть простая функция переноса слов, которая принимает длинную строку в качестве входных данных, а затем разбивает эту строку на строки меньшего размера и добавляет их в массив, который будет выведен позже. Прямо сейчас последнее слово или два не выводятся. Это основная проблема. Тем не менее, я также хотел бы улучшить функцию. Я знаю, что это немного запутанно. Мне было интересно, есть ли какие-либо лучшие способы решения этой проблемы. Я думаю, что массив не нужен, но я не знаю, как еще это сделать. После того, как массив заполнен всеми строками меньшего размера, я просто вывожу их в текстовый файл. Любые предложения будут высоко оценены.

Вот функция переноса слов:

 void WordWrap(string inputString, string formatedAr[], const int SIZE)
{
    unsigned int index;
    unsigned int word;
    unsigned int max = 65;
    string outWord;
    string outLine;

    outWord = "";
    outLine = "";
    word = 0;

    for(int i = 0; i < SIZE; i  )
    {
        formatedAr[i] = "";
    }

    for(index = 0; index <= inputString.length(); index  )
    {
        if(inputString[index] != ' ')
        {
            outWord  = inputString[index];
        }
        else
        {
            if(outLine.length()   outWord.length() > max)
            {
                formatedAr[word] = outLine;
                word  ;
                outLine.clear();
            }
            outLine  = outWord   " ";
            outWord.clear();
        }
    }
    formatedAr[word] = outLine;
}
  

И здесь я вызываю функцию и выводю массив:

 WordWrap(dvdPtr -> synopsis, formatedAr, SIZE);

index = 0;

while(index < SIZE amp;amp; formatedAr[index] != "")
{
    outFile << formatedAr[index] << endl;
    index  ;
}
  

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

1. Вы пробовали отлаживать свою программу? Чему вы научились?

2. Вы могли бы использовать std::vector вместо массива фиксированного размера в формате ar. И вы также могли бы использовать strtok (см. msdn.microsoft.com/en-us/library/2c8d19sb.aspx ) для обозначения вашего входного текста.

Ответ №1:

Вот пример кода.

 #include <iostream>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

void WordWrap(const stringamp; inputString, vector<string>amp; outputString, unsigned int lineLength)
{
   istringstream iss(inputString);

   string line;

   do
   {
      string word;
      iss >> word;

      if (line.length()   word.length() > lineLength)
      {
         outputString.push_back(line);
         line.clear();
      }
      line  = word   " ";

   }while (iss);

   if (!line.empty())
   {
      outputString.push_back(line);
   }
}

/*
A simple test:

Input string: "aaa bbb ccccccc dddd d111111111111111 33333 4444444444 222222222  ajdkjklad 341343"

Length per line: 20

Output lines of strings:

Line 1: aaa bbb ccccccc dddd
Line 2: d111111111111111
Line 3: 33333 4444444444
Line 4: 222222222  ajdkjklad
*/