Я написал эту процедуру копирования строк для строк C Предполагается, что он ведет себя как strlcpy, то есть - null завершает пункт назначения, если размер> 0, и возвращает длину исходной строки.
Однако я также хочу, чтобы функция не работала, если указатель источника или назначения равен нулю, и каким-то образом уведомляю об этом вызывающую сторону. Но я не могу придумать очень элегантный способ сделать это. Прямо сейчас я отправляю два отрицательных значения как размер, чтобы указать, что указатель источника или назначения указывает на ноль Поэтому я изменил тип возвращаемого значения с size_t на целое число со знаком, и меня не устраивает этот интерфейс. Какой интерфейс будет лучше?
#include <cstddef> // size_t
#include <cstdint> // 32 bit int
const std::int32_t SRC_NULL = -1;
const std::int32_t DST_NULL = -2;
std::int32_t CopyStringn (char *dest, const char *src, std::size_t size) {
const char* temp (src);
if (temp == NULL)
return SRC_NULL;
if (dest == NULL)
return DST_NULL;
while (*temp) {
if (size > 1) {
*dest++ = *temp;
--size;
}
++temp;
}
if (size)
*dest = '\0';
return static_cast<std::int32_t> (temp - src); // Length does not include null
}