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;

しかし>>、文字列を 2 番目の引数として使用すると、スペースに対してうまく機能しません。

文字の読み取りに頼る必要があり、その場しのぎの方法でそれらを自分で管理する必要があります。

于 2013-01-08T20:31:46.997 に答える