2013-05-25 46 views
5

tôi sau mã này để cắtlàm thế nào để cắt mảng vector char hoặc chuỗi?

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; 
} 

tôi bước Xuyên mã, received_data của tôi là thường = "thêm 8002 (ở đây trở đi đệm được làm đầy với không gian cho đến khi [511th] vị trí)"

bây giờ khi tôi đã trim_right tôi mong đợi kích thước str1 để trở thành 8, nhưng nó vẫn 512 khi trở về của nó, tại sao?

Làm thế nào để thực sự cắt và thay đổi kích thước để các chuỗi chỉ thể chứa đến nhân vật không gian phi cuối cùng

+0

Bạn có chắc bộ đệm được lấp đầy không gian và không phải một số khoảng trắng khác không? – PureW

Trả lời

2

Như đã giải thích trong answer khác, bạn vector được làm đầy với số không, mà không được coi là khoảng trắng, vì vậy trim_right không loại bỏ chúng khỏi chuỗi. Một sửa chữa dễ dàng cho vấn đề của bạn là không xây dựng chuỗi bằng cách sử dụng trình vòng lặp bắt đầu và kết thúc của vectơ, nhưng sử dụng hàm tạo string(char const *). Điều này cũng loại bỏ cuộc gọi đến 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]); 
} 
+0

một thay thế cho .data() của một vectơ trên vs2008 mà không hỗ trợ c11 là gì? –

+1

@ user494461 Dòng nhận xét 'chuỗi trả về (& receive_data [0]);' hoạt động cho các trình biên dịch C++ 03. – Praetorian

1

trim_right chỉ loại bỏ tất cả các khoảng trắng đuôi. Khi bạn khai báo received_data, nó được khởi tạo với tất cả các số không. Khi bạn đọc dữ liệu từ ổ cắm, dữ liệu ở cuối bộ đệm là [chắc chắn nhất] không bao gồm khoảng trắng.

Tôi đề nghị khi bạn gọi tcp_read() bạn trả lại số byte đã thực sự đọc từ ổ cắm và thực hiện recieved_data.resize(byte_count); thay vì gọi trim_right. Ngoài ra, nếu dữ liệu nhận được qua ổ cắm có thể chứa số không, bạn có thể phải trả lại số vector thay vì string.

[Kudos để Praetorian đã chỉ ra rằng nó loại bỏ tất cả các khoảng trắng ]

+0

+1 'trim_right' không chỉ loại bỏ dấu cách, nhưng tất cả dấu cách * dấu cách *. Vì vậy, anh ta có thể sửa đổi việc khởi tạo vectơ sao cho nó chứa một cái gì đó mà 'trim_right' sẽ loại bỏ. Ví dụ 'std :: vector received_data (512, '\ n');' – Praetorian

+0

@Praetorian Chỉ thêm vào đó lol. –

+0

@Praetorian không nghĩ về tất cả các khoảng trống mặc dù –

0

Đó là ngớ ngẩn, nhưng trong trường hợp khoảng trắng không thực sự khoảng trắng:

string str1(received_data.begin(), 
    find(received_data.begin(), received_data.end(), received_data[511])); 

Và nếu họ là:

string str1(received_data.begin(), 
    find( 
     find(received_data.begin(), received_data.end(), ' ') + 1, 
     received_data.end())); 

Nhưng đó chỉ là một số hacks, cắt đúng nên làm việc chỉ tốt, có lẽ có điều gì đó sai với receive_data.

Và có, cắt xén chuỗi sẽ không tái phân bổ bất kỳ bộ nhớ nào, do đó, có thể là ok để lưu trữ nó như cũ.

Các vấn đề liên quan