C Причина, по которой strncpy не имеет нулевого завершения
В настоящее время я изучаю строки в C, и возник вопрос: почему разработчики C не заставляют strncpy null завершаться автоматически?
Например, в реализации strncpy, почему люди, которые делают язык C, не добавили эту строку:
// dest denotes the destination string
dest[n - 1] = '\0';
чтобы сделать strncpy более безопасным?
3 ответа
strncpy
никогда не задумывался как "безопасная альтернатива" strcpy
хотя такое впечатление получают многие новые программисты на Си, так как он принимает параметр "size". Третий аргумент - это количество символов, которые нужно прочитать из исходного буфера, а не максимальная емкость буфера назначения.
Сегодня есть несколько вариантов использования, для которых strncpy
это лучший выбор для копирования данных из одного буфера в другой. Если вам требуется безопасная альтернатива strcpy
, вы могли бы использовать snprintf
вот так:
snprintf(dest, len_dest, "%s", src);
Это сделано так, потому что вы можете перезаписать только первые слова предложения.
Он теряет силу, если вы не достигли счета. Смотрите цитату ниже ( https://en.cppreference.com/w/c/string/byte/strncpy)
Копирует максимально возможное количество символов массива символов, на которое указывает src (включая завершающий нулевой символ, но не любые символы, следующие за нулевым символом), в массив символов, на который указывает dest.
Это только не определено, если вы достигнете счет до завершения нулевого символа. Вы не можете добавить завершающий нулевой символ в качестве, потому что это было бы вне границ массива.
Вы можете посмотреть в strlcpy
который будет делать то, что вы хотите, но не является частью стандартной библиотеки.