如何修剪向量字符数组或字符串?
Posted
技术标签:
【中文标题】如何修剪向量字符数组或字符串?【英文标题】:how to trim vector char array or string? 【发布时间】:2013-05-25 16:43:20 【问题描述】:我正在按照此代码进行修剪
std::string tcp_read(int listen_at_port=8001)
using namespace std;
using namespace boost::algorithm;
std::vector<char> received_data(512);
tcp_read(received_data, listen_at_port);
string str1(received_data.begin(),received_data.end());
trim_right(str1);
return str1;
我单步执行了代码,我的 received_data 通常为 =“添加 8002(此处缓冲区填充有空格,直到 [511th] 位置)”
现在当我执行 trim_right 时,我预计 str1 的大小会变为 8,但返回时它仍然是 512,为什么?
我如何实际修剪并更改大小,以便字符串可以容纳到最后一个非空格字符
【问题讨论】:
您确定缓冲区中填充的是空格而不是其他空格吗? 【参考方案1】:正如其他answer 中所解释的,您的vector
填充了零,这不被视为空格,因此trim_right
不会从字符串中删除这些。解决问题的一个简单方法是不使用向量的开始和结束迭代器构造字符串,而是使用string( char const * )
构造函数。这也消除了对boost::trim_right
的调用。
std::string tcp_read(int listen_at_port=8001)
using namespace std;
std::vector<char> received_data(512);
tcp_read(received_data, listen_at_port);
return string( received_data.data() );
// or return string( &received_data[0] );
【讨论】:
vs2008 上不支持 c11 的向量的 .data() 替代方法是什么? @user494461 注释掉的行return string( &received_data[0] );
适用于 C++03 编译器。【参考方案2】:
trim_right
仅删除所有尾随空格。当您声明 received_data
时,它被初始化为全零。当您从套接字读取数据时,缓冲区末尾的数据[肯定]不是由空格组成的。
我建议当您调用tcp_read()
时,您返回实际从套接字读取的字节数并执行recieved_data.resize(byte_count);
而不是调用trim_right
。此外,如果通过套接字接收的数据可能包含零,您可能应该返回 vector
而不是 string
。
[感谢Praetorian 指出它删除了所有空格]
【讨论】:
+1trim_right
不仅会删除空格,还会删除所有尾随的空格。因此他可以修改向量的初始化,使其包含trim_right
将删除的内容。例如std::vector<char> received_data(512, '\n');
@Praetorian 并没有考虑所有的空格【参考方案3】:
这很愚蠢,但如果空格不是真正的空格:
string str1(received_data.begin(),
find(received_data.begin(), received_data.end(), received_data[511]) );
如果他们是:
string str1(received_data.begin(),
find(
find(received_data.begin(), received_data.end(), ' ') + 1,
received_data.end()) );
但这只是一些技巧,正确修剪应该可以正常工作,received_data 可能有问题。
是的,修剪字符串无论如何都不会重新分配任何内存,所以按原样存储它可能是可以的。
【讨论】:
以上是关于如何修剪向量字符数组或字符串?的主要内容,如果未能解决你的问题,请参考以下文章