Альтернатива strcpy в c ++ - PullRequest
       8

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

9 голосов
/ 20 января 2011

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

Ответы [ 4 ]

17 голосов
/ 20 января 2011

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

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();

UPDATE

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

std::string a = "Hello.";
std::string b;
b = a; // C++11 forces this to be a copy as well
15 голосов
/ 20 января 2011

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

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

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

4 голосов
/ 20 января 2011

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

std::string string_copy(original_string);

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

string_copy = original_string

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

2 голосов
/ 20 января 2011

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

Пример:

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

strcpy_s(destString, 256, srcString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...