c++ - 消息框中的字符串自动换行?

标签 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" );
    

它跳过最后一个词,:

last few words get skipped

最佳答案

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

你遇到的问题是,当你找到最后一个你应该换行的空间时,你仍然有文本没有被插入 vector 。您需要检查循环后是否还有更多文本,并将其添加为单独的一行。

关于c++ - 消息框中的字符串自动换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9129133/

相关文章:

c++ - 如何将默认子句全局设置为无?

C# - 计算字符串长度并将每个字符替换为另一个

c# - 为什么在构建SQL命令时使用地址符号@?

php - 在 PHP 中,是否可以使用字符串设置变量名?

c# - 计算日期时间列表中的总分钟数

c# - 无法在 Visual C# 项目中使用我的 .dll

c++ - 全局 new 和 delete 运算符的定义

regex - 在 MATLAB 中检查 UTF-8 字母是否为元音字母

c++ - 在 C++ 中创建 trie/suffix 树时减少内存使用

c++ - std::begin() 和 std::end() 依赖 ADL?