У меня есть этот код
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++, предпочтительно без станд.
Кто-либо знает?Спасибо.
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 ++ незаметно.
Один возможный замену для Memet
Если у вас есть массив типов объектов - использовать алгоритм ATD :: Fill
. Он работает с диапазонами итератора, а также с указателями в массивы.
Мемкпи
Вызывы обычно могут быть заменены вызовами на STD :: Copy
.
E.G.
std::copy(name, name + strlen(name) + 1, oldname);
// ...
std::fill(name, name + strlen(name), '\0');
MEMSSET
и Мемкпи
все еще там могут быть использованы и могут быть использованы при необходимости. Это, вероятно, больше нет - нет у многих точек зрения разработчика C ++, чтобы использовать RAW New
и не используя объект управления ресурсами. Намного лучше использовать std :: string
или std :: vector
, чтобы смятение памяти автоматически и код больше исключений.
Я понимаю, что нет нет, чтобы использовать Memcpy и Memset, но я точно понял, как использовать это в C ++, предпочтительно без STD.
Это не используется для использования MEMCPY
и MEMSET
, когда их использование подходит. Почему это должно быть?
Там STD :: Copy
в C ++, которые копируют набор элементов (работает на любом типе, а не только Char *
) от итератора к другому.
Кроме неудобства необходимости вручную копировать и выполнять все распределение памяти самостоятельно, нет ничего плохого в этом C ++.
Я бы, однако, решительно поощряет использование std :: string
для манипулирования строк в C ++.
В целом есть STD :: Fill
. http://www.cplusplus.com/Reeference/algorithm/fill/
Или в этом конкретном случае вы должны рассмотреть возможность использования STD :: Vector
.
(Обратите внимание, что MEMSET
все еще можно использовать в C ++, если вы используете #include
, хотя он менее идиоматичен в C ++.)
Если вы просто делаете строковые манипуляции, используйте строку.
Для копирования из 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";
Ничто не мешает использовать семейство функций strxx
на C++, но я настоятельно рекомендую переключиться на std::string
и остальную часть STL. Это тоже не идеально, но тем более подвержено ошибкам.