如何修剪矢量字符数组或字符串
how to trim vector char array or string?
我按照下面的代码来修剪
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。
是的,修剪字符串不会重新分配任何内存,所以它可能可以存储它,因为它是。
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?