如何修剪矢量char数组或字符串?

时间:2013-05-25 16:43:21

标签: c++ string boost trim

我正在按照此代码修剪

    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,为什么?

我如何实际修剪并更改大小,以便字符串可以容纳到最后一个非空格字符

3 个答案:

答案 0 :(得分:2)

正如另一个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] );
}

答案 1 :(得分:1)

trim_right仅删除所有尾随空格。当您声明received_data时,它将使用全零进行初始化。当您从套接字读取数据时,缓冲区末尾的数据[当然]不是由空格组成。

我建议您在调用tcp_read()时返回实际从套接字读取的字节数,并执行recieved_data.resize(byte_count);而不是调用trim_right。此外,如果通过套接字接收的数据可能包含零,您应该返回vector而不是string

[感谢Praetorian指出它删除了所有空白]

答案 2 :(得分:0)

这很愚蠢,但万一这些空白并不是真正的空白:

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可能有问题。

是的,修剪字符串无论如何都不会重新分配任何内存,因此可以按原样存储它。