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);
Я понимаю это сейчас, просто хотел вставить этот код для всех будущих посетителей. Комментируемые строки эквивалентны некомментированным ниже. С комментировал, С ++ не комментировал.
В общем, есть 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++, вероятно, нет ничего более важного - использовать raw new
и не используя объект управления ресурсами. Гораздо лучше использовать std::string
или std::vector<char>
так что освобождение памяти происходит автоматически, а код более безопасен для исключений.
Кроме неудобства, связанного с необходимостью вручную копировать и выполнять все выделение памяти самостоятельно, в этом коде C++ нет ничего плохого.
Однако я бы настоятельно рекомендовал использовать std::string
для работы со строками в C++.
Я понимаю, что нет необходимости использовать memcpy и memset, но я не совсем понял, как использовать это в C++, желательно без std.
Это не нет-нет, чтобы использовать memcpy
а также memset
когда их использование уместно. Почему это должно быть?
Там в std::copy
в C++, который копирует набор элементов (работает на любой тип, а не только char*
) от итератора к другому.
Если вы просто делаете манипуляции со строками, используйте строку.
Чтобы скопировать с а на б, возьмите 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. Это не идеально, но гораздо менее подвержен ошибкам.