Самый простой подход, который вы можете сделать, - это использовать алгоритм std::remove_copy
:
std::string ip = read_ip_address();
char ipchr[20];
*std::remove_copy( ip.begin(), ip.end(), ipchr, ' ' ) = 0; // [1]
Следующий вопрос - зачем вам это делать, потому что лучше не копировать его?в массив, но вместо этого удалите пробелы из строки и затем используйте c_str()
для получения указателя ...
РЕДАКТИРОВАТЬ Согласно предложению Джеймса, если вы хотите удалить все пробелы ине только символ ' '
, вы можете использовать std::remove_copy_if
с функтором.Я протестировал передачу std::isspace
из заголовка <locale>
напрямую, и, похоже, это работает, но я не уверен, что это не будет проблематично с не-ascii символами (которые могут быть отрицательными):
#include <locale>
#include <algorithm>
int main() {
std::string s = get_ip_address();
char ip[20];
*std::remove_copy_if( s.begin(), s.end(), ip, (int (*)(int))std::isspace ) = 0; // [1]
}
ужасный приведение в последнем аргументе требуется для выбора конкретной перегрузки isspace
.
[1] Необходимо добавить *... = 0;
для обеспечения NUL окончания строки.Алгоритмы remove_copy
и remove_copy_if
возвращают итератор end
в выходной последовательности (т. Е. Один после последнего отредактированного элемента), и *...=0
разыменовывает этот итератор для записи NUL.В качестве альтернативы, массив может быть инициализирован перед вызовом алгоритма char ip[20] = {};
, но он будет записывать \0
во все 20 символов в массиве, а не только в конец строки.