2013-05-25 22 views
5

Ivektör char dizisi veya dizgisini nasıl kırpılır?

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; 
} 
kod düşünce adım

kesmek için bu kod aşağıdaki am, benim received_data, genellikle =

"([511th] konumuna kadar boşluklarla burada itibaren tampon doldurulmuştur) 8002 ekle" şimdi trim_right yaptığımda str1 boyutunun 8 olmasını bekledim, ama hala geri döndüğünde 512 mi, neden?

Nasıl aslında Döşeme ve dize sadece

+0

Ara belleğin boşluklarla dolu olduğundan ve başka bir boşlukla doldurulmadığından emin misiniz? – PureW

cevap

2

olarak diğer answer açıklandığı , senin vector yüzden trim_right değil, boşluk kabul edilmez sıfır, dolu bunları diziden çıkarın. Sorununuza kolay bir çözüm, vektörün başlangıç ​​ve bitiş yineleyicileri kullanarak dizeyi oluşturmamaktır, ancak string(char const *) yapıcısını kullanın. Bu ayrıca boost::trim_right numaralı çağrıyı ortadan kaldırır. aptalca ama durumda boşlukların gerçekten boşlukların değildir

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

tüm whitespaces düşünmüyordu c11 desteklemeyen vs2008 bir vektörün .data() için bir alternatif nedir? –

+1

@ user494461 Yorumlanan satır 'dönüş dizesi (& received_data [0]); 'C++ 03 derleyicileri için çalışır. – Praetorian

1

trim_right yalnızca tüm sondaki boşlukları kaldırır olmayan son boşluk karakteri kadar accomodates böylece boyutunu değiştirmek olsun yapmak. received_data bildirdiğinizde, tüm sıfırlarla başlatılır. Soketten gelen verileri okurken, tamponun sonundaki veriler (kesinlikle) boşluklardan oluşmaz.

tcp_read() numaralı telefonu aradığınızda, aslında yuvadan okunan bayt sayısını döndürür ve trim_right'u çağırmak yerine recieved_data.resize(byte_count); yaparsınız. Ayrıca soket üzerinden alınan veriler sıfırlar içeriyorsa, muhtemelen string yerine vector döndürmeniz gerekir.

[hepsi boşlukları kaldırır Buna dikkat çektiğin için Praetorian Şeref]

+0

+1 'trim_right' sadece boşlukları değil, tüm boşlukları * boşluyor *. Böylece, vektörün başlatılmasını değiştirebilir, böylece 'trim_right'ın çıkaracağı bir şey içerir. Örneğin, std :: vektör received_data (512, '\ n'); ' – Praetorian

+0

@Praetorian Sadece bu lol'i ekliyordum. –

+0

@Praetorian –

0

:

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

Ve onlar ise:

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

Ama bu doğru sadece çalışmalıdır Döşeme, sadece bazı gardiyanlar var İyi, muhtemelen alınan_data ile ilgili bir sorun var.

Ve evet, dizgiyi kırpmak zaten herhangi bir belleği yeniden tahsis etmeyecek, dolayısıyla olduğu gibi saklamak iyi olabilir.

İlgili konular