2015-12-03 4 views
10

Каков правильный способ удаления символов \0 из заданной строки.C++ Как удалить символ 0 из std :: string

я пытаюсь без успеха:

std::string msg(data); // Data comes from a remote system connected via socket... 
msg.erase(std::remove(msg.begin(), msg.end(), '\0'), msg.end()); 

Это дает ошибку компиляции:

error: cannot convert ‘std::__cxx11::basic_string<char>::iterator {aka __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >}’ to ‘const char*’ for argument ‘1’ to ‘int remove(const char*)’ 

data поставляется с удаленного компьютера, используя сокет, и содержит несколько частей кодовых номеров с /0 в из-за исходной логики.

+1

Это не очень хорошая идея, не так ли? Поскольку C++ 11, 'std :: string' заканчивается' '\ 0'', поэтому я думаю, что это может быть неразумно. – erip

+0

Я получаю данные сокета из удаленной системы, которая идет с символами '\ 0'. Эта строка будет обрабатываться в логике сравнения строк, а затем выпустить mySql inserts/create, которая выдает несколько ошибок из-за присутствия '\ 0' в строке. Поэтому мне нужно очистить строку, удаляя эти символы. – Mendes

+2

@erip: Это '\ 0' не является частью данных. Это деталь реализации, часть интерфейса. Это не повлияло бы на это. –

ответ

7

Ваша проблема возникает из-за недостающей директивы #include. Ваше намерение состояло в том, чтобы позвонить std::remove() из <algorithm>, но вы непреднамеренно назвали std::remove() от <cstdio>. Таким образом, с

#include <algorithm> 

он должен работать.

(ИМХО std::remove(const char*) должно быть std::remove_file(std::string const&) или по крайней мере std::remove_file(const char*).)

+0

Это решило проблему. Спасибо Уолтеру. – Mendes