2013-05-25 3 views
5

Я выполняю этот код, чтобы обрезатьКак обрезать векторный массив символов или строку?

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 (здесь и далее буфер заполняется пробелами до в [511-м] позиции)»

теперь, когда я сделал trim_right, я ожидал, что размер str1 станет 8, но его все еще 512, когда он возвращается, почему?

Как я получить на самом деле обрезать и изменить размер так, чтобы строка просто приспосабливает до последнего символа пробела, не

+0

Вы уверены, что буфер заполнен пробелами, а не прочими пробелами? – PureW

ответ

2

Как объяснен в другом answer, ваш vector заполняются нулями, которые не считаются пробельные, так 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]); 
} 
+0

что является альтернативой .data() вектора на vs2008, который не поддерживает c11? –

+1

@ user494461 Записанная строка 'return string (& received_data [0]);' работает для компиляторов C++ 03. – Praetorian

1

trim_right только удаляет все завершающие пробелы. Когда вы объявляете received_data, он инициализируется всеми нулями. Когда вы читаете данные из сокета, данные в конце буфера [безусловно] не состоят из пробелов.

Я предлагаю, чтобы при вызове tcp_read() вы возвращали количество байтов, которые были фактически прочитаны из сокета, и выполните recieved_data.resize(byte_count); вместо того, чтобы звонить trim_right. Также, если данные, полученные над сокетом, могут содержать нули, вы, вероятно, должны возвращать vector вместо string.

[Престижность Praetorian для указывая на то, что она удаляет все пробельных]

+0

+1 'trim_right' не только удаляет пробелы, но и все конечные * whitespace *. Поэтому он мог бы изменить инициализацию вектора, чтобы он содержал что-то, что 'trim_right' будет удалять. Например, 'std :: vector received_data (512, '\ n');' – Praetorian

+0

@Praetorian Просто добавил, что LOL. –

+0

@Praetorian не думал обо всех пробелах, хотя –

0

Это глупо, но в случае, если пробелы не очень пробельные символы:

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

Но это лишь некоторые писаки, отделка право должно работать хорошо, что-то не так с полученными_датами.

И да, обрезка строки в любом случае не перераспределит какую-либо память, так что было бы нормально ее хранить, как есть.

Смежные вопросы