#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
*/