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 который будет делать то, что вы хотите, но не является частью стандартной библиотеки.

Другие вопросы по тегам