strcpy
не опасно, поскольку вы знаете, что буфер назначения достаточно велик, чтобы содержать символы исходной строки; в противном случае strcpy
с радостью скопирует больше символов, чем может вместить ваш целевой буфер, что может привести к нескольким неблагоприятным последствиям (перезапись стека / других переменных, что может привести к сбоям, атакам с разбивкой стека и т. д.).
Но: если у вас есть общий char *
на входе, который еще не проверен, единственный способ убедиться в этом - применить strlen
к такой строке и проверить, не слишком ли она велика для вашего буфера; однако теперь вам нужно пройти всю исходную строку дважды, один раз для проверки ее длины, один раз для выполнения копирования.
Это неоптимально, поскольку, если бы strcpy
был немного более продвинутым, он мог бы получить в качестве параметра размер буфера и прекратить копирование, если исходная строка была слишком длинной; в идеальном мире именно так будет работать strncpy
(следуя шаблону других strn***
функций). Однако это не совершенный мир, и strncpy
не предназначен для этого. Вместо этого нестандартная (но популярная) альтернатива - strlcpy
, которая вместо выхода за пределы целевого буфера усекается.
Некоторые реализации CRT не предоставляют эту функцию (в частности, glibc), но вы все равно можете получить одну из реализаций BSD и поместить ее в свое приложение. Стандартной (но более медленной) альтернативой может быть использование snprintf
с "%s"
в качестве строки формата.
Тем не менее, поскольку вы программируете на C ++ ( edit Теперь я вижу, что тег C ++ был удален), почему бы вам просто не избежать всего C- нонсенс (если можно, очевидно) и идти с std::string
? Все эти потенциальные проблемы безопасности исчезают, и строковые операции становятся намного проще.