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. Это не идеально, но гораздо менее подвержен ошибкам.

Другие вопросы по тегам