我需要多行字符串,然后加上空格。
我正在使用boost :: split来分割字符串并将值分配给向量。然后在for-each循环中,我向向量值添加空格。
static string test(){
std::string text = "This is a sentence.\nAnd another sentence";
string nl = "\n";
string pad=" ";
string txt;
std::vector<std::string> results;
boost::split(results, text, boost::is_any_of(nl));
for(string line : results){
txt = pad + line + nl;
cout << txt;
}
return txt;
}
我应该得到如下的返回值。 cout结果正确,但无法获得返回值txt。
This is a sentence.
And another sentence
答案 0 :(得分:2)
拥有
for(string line : results){ txt = pad + line + nl; cout << txt; } return txt;
返回 txt 是循环中pad + line + nl
的 last 值,如果 results 为空,则为空字符串>
说
cout结果正确,但无法获取返回值txt。
可能意味着您只需要折叠每个字符串并返回结果:
string r;
for(string line : results){
txt = pad + line + nl;
cout << txt;
r += txt;
}
return r;
或类似的东西可能没有 pad
答案 1 :(得分:1)
另一种方式:
static string test(){
std::string text = "This is a sentence.\nAnd another sentence\n";
std::string result = " " + boost::algorithm::replace_all_copy(s, "\n", "\n ");
std::cout << result;
return result;
}
答案 2 :(得分:1)
您的循环:
for(string line : results){
txt = pad + line + nl;
cout << txt;
}
return txt;
在每次循环迭代中重置txt
(并且一次打印一次该迭代的文本)。这样一来,循环之后您将只剩下最终迭代的值。
相反,将追加附加到txt
以保留所有值。因此,您还需要将cout
提升到循环之外:
for(string line : results){
txt += pad + line + nl;
}
cout << txt;
return txt;
答案 3 :(得分:1)
我将显示已构建矢量的函数部分。因此,我将展示的功能得到了简化,但演示了如何构建和返回结果字符串。
#include <iostream>
#include <string>
#include <vector>
static std::string test( const std::vector<std::string> &results )
{
const std::string pad( " " );
std::string::size_type n = 0;
for ( const std::string &s : results ) n += s.length();
n += results.size() * ( pad.size() + sizeof( '\n' ) );
std::string txt;
txt.reserve( n );
for ( const std::string &s : results ) txt += pad + s + '\n';
return txt;
}
int main()
{
std::vector<std::string> results = { "This is a sentence.", "This is a sentence." };
std::cout << test( results );
}
程序输出为
This is a sentence.
This is a sentence.
要使代码更有效,您应该为字符串txt
保留足够的空间。循环
for ( const std::string &s : results ) n += s.length();
计算向量中存储的所有字符串的总大小。
注意:例如,您可以使用标头std::accumulate
中声明的标准算法<numeric>
而不是循环
std::string::size_type n = std::accumulate( std::begin( results ), std::end( results ),
std::string::size_type( 0 ),
[]( const std::string::size_type acc, const std::string &s )
{
return acc + s.size();
} );
然后,为每个字符串添加填充空格的长度和字符'\n'
的长度。
因此,所有人都准备构建从函数返回的结果字符串。
std::string txt;
txt.reserve( n );
for ( const std::string &s : results ) txt += pad + s + '\n';
return txt;