Вопрос

У меня есть этот код

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top