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

how to trim vector char array or string?

本文关键字:字符 数组 字符串 何修剪 修剪      更新时间:2023-10-16

我按照下面的代码来修剪

    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通常是= "add 8002(在这里,缓冲区被空格填充,直到[511]位置)"

现在当我执行trim_right时,我期望str1的大小变成8,但它返回时仍然是512,为什么?

我如何得到实际修剪和改变大小,使字符串刚好容纳到最后一个非空格字符

正如在另一个答案中所解释的那样,您的vector填充了零,这些零不被视为空白,因此trim_right不会从字符串中删除这些零。一个简单的解决问题的方法是不要使用vector的begin和end迭代器来构造字符串,而是使用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] );
}

trim_right仅删除所有尾随空格。当你声明received_data时,它被初始化为全零。当你从套接字中读取数据时,缓冲区末尾的数据肯定不是由空格组成的。

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

[向Praetorian致敬,因为它指出它删除了所有空白]

这很愚蠢,但如果空白空间不是真正的空白空间:

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。

是的,修剪字符串不会重新分配任何内存,所以它可能可以存储它,因为它是。