我正在尝试包装给定字符串的单词并使用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);
}
当我使用时,由于某种原因跳过了最后几个字 它是这样的:
pro::message::display( App, "Hello World! Yada Yada Bla Bla Yda Yada Hehehe Hehe Hfmaf Heh last few words" );
它跳过最后一个字, words :
答案 0 :(得分:3)
简单的解决方案是复制字符串,并在适当的时候用换行符替换空格。
您遇到的问题是,当您找到应该使用换行符的最后一个空格时,您仍然会在此之后将文本推送到向量中。您需要检查循环后是否有更多文本,并将其作为单独的行添加。
答案 1 :(得分:0)
我会完全重写这段代码:)
您只需要在源字符串中插入换行符:给定最大行长度,例如max_len,只需指向源字符串中的max_len字符并开始向后搜索空格。找到后(如果你没有?),用换行符替换它,然后继续从那一点开始。