Это зависит от того, является ли копируемая строка литералом, как показано, или может варьироваться.
Лучшим методом для показанного массива будет:
char arr[128] = "Hello World";
Если вы Вы отвечаете за строку, и она не содержит символов %
, тогда нет большой разницы между двумя вызовами sprintf()
. Строго говоря, первая использует строку в качестве формата и копирует символы напрямую, а вторая отмечает, что в качестве формата она имеет %s
, и копирует символы из дополнительного аргумента напрямую - это неизмеримо медленнее. Есть случай:
snprintf(arr, sizeof(arr), "%s", "Hello World");
, который не гарантирует переполнение буфера, даже если «Hello World» становится гораздо более длинным разделом.
Если вы не отвечаете за строку, тогда используйте snprintf()
, как показано, становится важным, поскольку даже если строка содержит символы %
, она просто копируется и переполнения нет. Вы должны проверить возвращаемое значение, чтобы установить sh, были ли усечены какие-либо данные.
Использование strcpy()
целесообразно, если вы знаете, какова длина строки и есть место для ее хранения. Использование strncpy()
чревато - оно обнуляет нулевые значения до полной длины, если источник короче цели, и не завершается нулем, если источник слишком длинный для цели.
Если вы установили длина строки достаточно короткая, разумно использовать memmove()
или memcpy()
. Если строка слишком длинная, вы должны выбрать стратегию обработки ошибок - усечение или ошибка.
Если конечный (неиспользуемый) пробел в целевом массиве должен быть нулевым байтом (по соображениям безопасности, чтобы гарантировать, что нет оставшийся пароль скрыт в нем), тогда использование strncpy()
может быть целесообразным, но остерегайтесь нулевого завершения, если источник слишком длинный. В большинстве случаев инициализатор массива на самом деле не нужен.
Компилятор может оптимизировать простые случаи.