Эквивалент C ++ для memset в char*
Вопрос
У меня есть этот код
char * oldname = new char[strlen(name) + 1];
memcpy(oldname,name,strlen(name) + 1);
name = new char[strlen(oldname) + strlen(r.name) + 1];
memset(name, '\0', strlen(name));
strcat(name,oldname);
strcat(name," ");
strcat(name,r.name);
Я понимаю, что запрещено использовать memcpy и memset, но я точно не понял, как использовать это в C ++, желательно без std.
Кто-нибудь знает?Спасибо.
Решение 7
char * oldname = new char[strlen(name) + 1];
//memcpy(oldname,name,strlen(name) + 1);
strcpy(oldname,name);
name = new char[strlen(oldname) + strlen(r.name) + 1];
//memset(name, '\0', strlen(name));
name[0] = '\0';
strcat(name,oldname);
strcat(name," ");
strcat(name,r.name);
Теперь я понимаю это, просто хотел вставить этот код для всех будущих посетителей Закомментированные строки эквивалентны раскомментированным строкам под ними.C прокомментирован, C++ раскомментирован.
Другие советы
В общем, есть std::fill
. http://www.cplusplus.com/reference/algorithm/fill/
Или в этом конкретном случае вам следует рассмотреть возможность использования std::vector<char>
.
(Обратите внимание, что memset
все еще можно использовать в C++, если вы используете #include <cstring>
, хотя в C++ это менее идиоматично.)
Одна из возможных замен memset
когда у вас есть массив типов объектов, нужно использовать std::fill
алгоритм.Он работает с диапазонами итераторов, а также с указателями на массивы.
memcpy
звонки обычно можно заменить звонками на std::copy
.
например
std::copy(name, name + strlen(name) + 1, oldname);
// ...
std::fill(name, name + strlen(name), '\0');
memset
и memcpy
Однако они все еще существуют и могут быть использованы при необходимости.С точки зрения многих разработчиков C++, вероятно, категорически запрещено использовать необработанный код. new
и не использовать объект управления ресурсами.Гораздо лучше использовать std::string
или std::vector<char>
так что освобождение памяти происходит автоматически, и код становится более безопасным для исключений.
Я понимаю, что использовать memcpy и memset нельзя, но я не совсем понял, как это использовать в C++, желательно без std.
Это не запрет на использование memcpy
и memset
когда их использование целесообразно.Почему так должно быть?
Есть std::copy
в C++, который копирует набор элементов (работает с любым типом, а не только char*
) от одного итератора к другому.
Если не считать неудобств, связанных с необходимостью вручную копировать и распределять память, в этом коде C++ нет ничего плохого.
Однако я бы настоятельно рекомендовал использовать std::string
для манипуляций со строками в C++.
Если вы просто манипулируете строками, используйте string.
Чтобы скопировать из a в b, возьмите std::copy(src_start,src_end,dest_start)
который увеличивает src_start
и копирует его в следующий элемент назначения до тех пор, пока src_start==src_end
встречается.
memcpy(oldname,name,strlen(name)+1)
// is the same as
std::copy(name,name+strlen(name)+1,oldname)
..за исключением того, что это также будет работать для не-POD, и вам не нужно возиться с длиной байта, если размер одного элемента превышает один байт.
Однако если вы просто хотите манипулировать строками, std::string
класс (и std::wstring
для широких строк символов).Объединить их так же просто, как:
std::string s = "name",s2 = ..,s3 = ..;
s = s2+s+s3+"Hello";
Ничто не удерживает вас от использования strxxx
семейство функций C++, но я настоятельно рекомендую вам переключиться на std::string
и остальная часть STL.Он тоже не идеален, но гораздо менее подвержен ошибкам.