исправлена ​​функция wordwap для сохранения пробелов между словами

Некоторое время назад я искал фрагмент, чтобы сделать перенос по словам для определенного размера длины строки, не разбивая слова. Он работал достаточно честно, но теперь, когда я начал использовать его в режиме редактирования, я заметил, что он съедает несколько символов пробела между ними. Я обдумываю, как это исправить или полностью избавиться от него, если wstringstream не подходит для этой задачи. Может, у кого-то там есть подобная функция?

void WordWrap2(const std::wstring& inputString, std::vector<std::wstring>& outputString, unsigned int lineLength)
{
std::wstringstream  iss(inputString);
std::wstring line;
std::wstring word;

while(iss >> word)
{
if (line.length() + word.length() > lineLength)
{
outputString.push_back(line+_T("\r"));
line.clear();
}
if( !word.empty() ) {
if( line.empty() ) line += word; else line += +L" " + word;
}

}

if (!line.empty())
{
outputString.push_back(line+_T("\r"));
}
}

Символ разделителя строк переноса должен остаться \r

0

Решение

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

#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>

void WordWrap2(const std::wstring& inputString,
std::vector<std::wstring>& outputString,
unsigned int lineLength) {
size_t last_pos = 0;
size_t pos;

for (pos=lineLength; pos < inputString.length(); pos += lineLength) {

while (pos > last_pos && !isspace((unsigned char)inputString[pos]))
--pos;

outputString.push_back(inputString.substr(last_pos, pos-last_pos));
last_pos = pos;
while (isspace((unsigned char)inputString[last_pos]))
++last_pos;
}
outputString.push_back(inputString.substr(last_pos));
}

В нынешнем виде это не удастся, если он встретит одно слово, которое длиннее указанной вами длины строки (в таком случае, возможно, должен просто перерыв в середине слова, но в настоящее время это не так).

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

        while (isspace((unsigned char)inputString[last_pos]))
++last_pos;
1

Другие решения

Если вы не хотите терять пробелы, вам нужно добавить следующую строку перед выполнением любых операций чтения:

iss >> std::noskipws;

Но потом с помощью >> со строкой в ​​качестве второго аргумента не будет хорошо работать с w.r.t. пространства.

Вам придется прибегнуть к чтению символов и самостоятельно управлять ими.

0

По вопросам рекламы [email protected]