消息框中的字符串单词换行?

时间:2012-02-03 13:06:43

标签: c++ string algorithm word-wrap sfml

我正在尝试包装给定字符串的单词并使用SFML将其显示在消息框中(< - 这无关紧要)。

所以,我想要做的是在一个大于消息框宽度的单词之前插入一个新行。这是代码:

string& message::word_wrap( string& msg , int w, int pt_size )
{
    int text_width = w;
    vector< string > lines;
    string temp ( msg );
    temp += " ";
    int n = 0, p = 0;

    while ( n != -1 )
    {
        string substr;
        n = temp.find( " ", p+1 );
        if ( (n * pt_size) >= text_width )
        {
            substr = temp.substr( 0, p );
            lines.push_back( substr );
            if ( n != -1 )
                temp = temp.substr( p+1, string::npos );
            p = 0;
        }

        else p = n;
    }

    string rtn;
    for ( int i = 0; i < lines.size(); i++ ) rtn += lines[i] + '\n';
    return rtn;
}

我在课堂上使用它是这样的:

message::message( sf::RenderWindow& App, const string& msg, int w, int h ) : app(App)
{
    /* irrelevant code */

    string m = msg; // <--
    m = this->word_wrap( m, w, text.GetSize() ); // <--
    text.SetText(m);
}

有两个问题。

  1. 算法在超出宽度之前包装单词 消息框。
  2. 当我使用时,由于某种原因跳过了最后几个字 它是这样的:

    pro::message::display( App, "Hello World! Yada Yada Bla Bla Yda Yada Hehehe Hehe Hfmaf Heh last few words" );
    
  3. 它跳过最后一个字, words

    last few words get skipped

2 个答案:

答案 0 :(得分:3)

简单的解决方案是复制字符串,并在适当的时候用换行符替换空格。

您遇到的问题是,当您找到应该使用换行符的最后一个空格时,您仍然会在此之后将文本推送到向量中。您需要检查循环后是否有更多文本,并将其作为单独的行添加。

答案 1 :(得分:0)

我会完全重写这段代码:)

您只需要在源字符串中插入换行符:给定最大行长度,例如max_len,只需指向源字符串中的max_len字符并开始向后搜索空格。找到后(如果你没有?),用换行符替换它,然后继续从那一点开始。