Альтернатива strcpy в C++

В C я использовал strcpy сделать глубокая копия строки, но это все еще 'хорошо' использовать strcpy в C++ или есть лучшие альтернативы, которые я должен использовать вместо этого ?

4 ответов


в C++ Самый простой способ-обычно использовать класс std:: string вместо char*.

#include <string>
...
  std::string a = "Hello.";
  std::string b;
  b = a;

строка "b = a;" делает то же самое, что вы обычно делаете с strcpy.


Я поместил это в комментарий выше, но просто чтобы сделать код читаемым:

std::string a = "Hello.";
std::string b;
b = a.c_str();   // makes an actual copy of the string
b = a;           // makes a copy of the pointer and increments the reference count

если вы действительно хотите имитировать поведение strcpy, вам необходимо скопировать его с помощью c_str();

обновление

следует отметить, что стандарт C++11 явно запрещает общий шаблон копирования при записи, который использовался во многих реализациях std::string ранее. Таким образом, строки подсчета ссылок больше не разрешены, и следующее будет создайте копию:

std::string a = "Hello.";
std::string b;
b = a; // C++11 forces this to be a copy as well

Если вы используете строки c++, просто используйте конструктор копирования:

std::string string_copy(original_string);

оператор присваивания

string_copy = original_string

Если вы должны использовать строки c-стиля (т. е. массивы символов с нулевым завершением), то да, просто используйте strcpy или в качестве более безопасной альтернативы strncpy.


вам предлагается использовать strcpy_s, потому что в дополнение к аргументам назначения и источника он имеет дополнительный аргумент для размера буфера назначения, чтобы избежать переполнения. Но это, вероятно, самый быстрый способ скопировать строку, если вы используете массивы/указатели символов.

пример:

char *srcString = "abcd";
char destString[256];

strcpy_s(destString, 256, srcString);