如何剪切向量字符数组或字符串?

5

我正在按照这段代码来裁剪字符串

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

我该如何实际进行剪裁并更改大小,以便字符串只容纳到最后一个非空格字符?


你确定缓冲区填充的是空格而不是其他空白字符吗? - PureW
3个回答

2

正如其他答案所解释的那样,您的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] );
}

在不支持C11的VS2008上,vector的.data()的替代方法是什么? - user494461
1
@user494461 在C++03编译器中,被注释掉的代码行return string( &received_data[0] );是可以工作的。 - Praetorian

1
trim_right 只会移除所有尾部的空格。当你声明 received_data 时,它会被初始化为全零。当你从套接字中读取数据时,缓冲区末尾的数据 [很可能] 不是由空格组成的。
我建议在调用 tcp_read() 时,返回实际从套接字中读取的字节数,并执行 recieved_data.resize(byte_count); 而不是调用 trim_right。此外,如果从套接字接收到的数据可能包含零,则应该返回一个 vector 而不是 string
[感谢 Praetorian 指出它移除了所有 空格]

+1 trim_right 不仅会移除空格,还会移除所有尾随的空白字符。因此,他可以修改向量的初始化,使其包含 trim_right 将要移除的内容。例如,std::vector<char> received_data(512, '\n'); - Praetorian
@Praetorian 没有考虑到所有的空格。 - Captain Obvlious

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()) );

但那只是一些hack,右侧修剪应该可以正常工作,接收到的数据可能有问题。

是的,修剪字符串也不会重新分配任何内存,所以将其存储为原样可能是可以的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接