我一直在编写一个程序,通过网络从其他来源接收数据,我需要在发送数据进行处理之前对数据进行清理。以前,我一直在根据尺寸进行,如下所示:
char data[max_length];
boost::system::error_code error;
size_t length = sock->read_some( boost::asio::buffer( data ), error );
std::stringstream ss;
for( int i = 0; i < max_length; i++ ) {
ss << data[i];
}
std::vector<int> idata;
std::string s2 = ss.str();
s2.erase( 0, 255 );
但我需要删除的标题长度可变。所以在做了一些挖掘之后,我发现我可以通过查找我知道他们将要结束的字符序列来删除它们 - 在这种情况下\r\n\r\n
- 然后删除所有内容,直到那时使用size_t如此:
size_t p = s2.find( "\r\n\r\n" );
s2.erase( 0, p );
但是仍然会在我的字符串的开头留下\r\n\r\n
,这最多会在以后抛弃我的数据处理,最坏的情况下,可能会导致问题,因为我的程序中有一些部分对空白反应不好。
所以我的问题是:我是否有更好的方法可以删除并包含指定的字符序列?我可以p = p + 4;
吗?是否可以使用size_t类型?
答案 0 :(得分:5)
是的,你可以写p + 4
,因为size_t
是一个(无符号)整数类型。
顺便说一句,您可能还希望将data
直接传递给std::string
构造函数,而不是使用std::stringstream ss
。
编辑:为了更详细地解释,它看起来像这样:
char data[max_length];
// Read data and ensure that it is null-terminated ...
std::string s2(data); // Call the std::string constructor that inputs a null-terminated C string.
size_t p = s2.find("\r\n\r\n");
s2.erase(0, p + 4);