2013-05-25 13 views
5

Sto seguendo questo codice per tagliarecome tagliare il vettore char array o stringa?

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

ho fatto un passo throught il codice, il mio received_data è generalmente = "add 8002 (qui in poi buffer viene riempito con spazi fino alla posizione [511 °])"

ora, quando ho fatto trim_right, mi aspettavo che la dimensione str1 diventasse 8, ma è ancora 512 quando ritorna, perché?

Come faccio ad avere in realtà assetto e cambiare le dimensioni in modo che la stringa appena ospita fino all'ultimo carattere non spazio

+0

Sei sicuro che il buffer sia pieno di spazi e non di qualche altro spazio bianco? – PureW

risposta

2

Come spiegato in un altro answer, il vostro vector è pieno di zeri, che non sono considerati spazi, in modo da non lo fa trim_right spoglia quelli dalla stringa. Una facile soluzione al tuo problema è non costruire la stringa usando gli iteratori di inizio e fine del vettore, ma usa il costruttore string(char const *). Ciò elimina anche la chiamata a 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

qual è un'alternativa a .data() di un vettore su vs2008 che non supporta c11? –

+1

@ user494461 La riga commentata 'return string (& received_data [0]);' funziona per i compilatori C++ 03. – Praetorian

1

trim_right rimuove solo tutti gli spazi bianchi finali. Quando si dichiara received_data viene inizializzato con tutti gli zeri. Quando leggi dati dal socket i dati alla fine del buffer sono [sicuramente] non composti da spazi.

suggerisco che quando si chiama tcp_read() si restituisce il numero di byte che sono stati effettivamente letto dalla presa e fanno recieved_data.resize(byte_count); invece di chiamare trim_right. Inoltre, se i dati ricevuti tramite socket possono contenere zeri, è consigliabile restituire uno vector anziché string.

[Complimenti a Praetorian per aver ricordato che rimuove tutti gli spazi bianchi ]

+0

+1 'trim_right' non solo rimuove gli spazi, ma tutti gli spazi bianchi * finali. Così ha potuto modificare l'inizializzazione del vettore in modo che contenga qualcosa che 'trim_right' rimuoverà. Per esempio 'std :: vector received_data (512, '\ n');' – Praetorian

+0

@Praetorian Stavo solo aggiungendo quel lol. –

+0

@Praetorian non ha pensato a tutti gli spazi bianchi sebbene –

0

che è stupido, ma nel caso in cui gli spazi bianchi non sono in realtà spazi bianchi:

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

E se sono:

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

Ma questo è solo alcuni hack, tagliare a destra dovrebbe funzionare bene, probabilmente c'è qualcosa di sbagliato nel dato ricevuto.

E sì, tagliare la stringa non ridistribuirebbe comunque la memoria, quindi potrebbe essere ok memorizzarlo così com'è.