C++, эквивалентный для memset на символе*

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

  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++, предпочтительно без станд.

Кто-либо знает?Спасибо.

7
задан Luca Matteis 24 January 2010 в 22:27
поделиться

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 ++ незаметно.

-1
ответ дан 6 December 2019 в 07:26
поделиться

Один возможный замену для 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 , чтобы смятение памяти автоматически и код больше исключений.

9
ответ дан 6 December 2019 в 07:26
поделиться

Я понимаю, что нет нет, чтобы использовать Memcpy и Memset, но я точно понял, как использовать это в C ++, предпочтительно без STD.

Это не используется для использования MEMCPY и MEMSET , когда их использование подходит. Почему это должно быть?

Там STD :: Copy в C ++, которые копируют набор элементов (работает на любом типе, а не только Char * ) от итератора к другому.

2
ответ дан 6 December 2019 в 07:26
поделиться

Кроме неудобства необходимости вручную копировать и выполнять все распределение памяти самостоятельно, нет ничего плохого в этом C ++.

Я бы, однако, решительно поощряет использование std :: string для манипулирования строк в C ++.

2
ответ дан 6 December 2019 в 07:26
поделиться

В целом есть STD :: Fill . http://www.cplusplus.com/Reeference/algorithm/fill/

Или в этом конкретном случае вы должны рассмотреть возможность использования STD :: Vector .

(Обратите внимание, что MEMSET все еще можно использовать в C ++, если вы используете #include , хотя он менее идиоматичен в C ++.)

10
ответ дан 6 December 2019 в 07:26
поделиться

Если вы просто делаете строковые манипуляции, используйте строку.

1
ответ дан 6 December 2019 в 07:26
поделиться

Для копирования из 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::stringstd::wstring для широких чар-строк). Сосредоточить их так же просто, как:

std::string s = "name",s2 = ..,s3 = ..;
s = s2+s+s3+"Hello";

Ничто не мешает использовать семейство функций strxx на C++, но я настоятельно рекомендую переключиться на std::stringи остальную часть STL. Это тоже не идеально, но тем более подвержено ошибкам.

1
ответ дан 6 December 2019 в 07:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: