簡體   English   中英

如何修剪矢量char數組或字符串?

[英]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通常=“添加8002(此處緩沖區填充空格直到[511th]位置”)

現在當我做了trim_right時,我預計str1的大小會變為8,但是當它返回時仍然是512,為什么呢?

我如何實際修剪並更改大小,以便字符串可以容納直到最后一個非空格字符

正如在另一個答案中所解釋的那樣,你的vector用零填充,它們不被認為是空格 ,因此trim_right不會從字符串中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] );
}

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

但這只是一些黑客,修剪正確應該工作得很好,receive_data可能有問題。

是的,修剪字符串無論如何都不會重新分配任何內存,因此可以按原樣存儲它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM