0

前段时间,我正在寻找一个片段来为特定大小的行长度进行自动换行,而不会破坏单词。它工作得还算公平,但是现在当我开始在编辑控件中使用它时,我注意到它在两者之间占用了多个空白符号。如果 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

4

2 回答 2

1

我不会一次读一个单词,然后添加单词直到超过所需的行长,而是从要换行的点开始,然后向后工作,直到找到一个空白字符,然后添加整个块到输出。

#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;
于 2013-01-08T21:14:55.000 回答
0

如果您不想丢失空格字符,则需要在执行任何读取之前添加以下行:

iss >> std::noskipws;

但是随后将>>字符串用作第二个参数将无法很好地使用空格。

您将不得不求助于阅读字符,并自己以特别的方式管理它们。

于 2013-01-08T20:31:46.997 回答