Безопасное копирование строки в C / C ++ - PullRequest
1 голос
/ 09 марта 2011

Я написал эту процедуру копирования строк для строк 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
}

Ответы [ 2 ]

7 голосов
/ 09 марта 2011

В C ++ вы можете выдать исключение.

1 голос
/ 09 марта 2011

Волшебные возвращаемые значения редко бывают хорошей идеей. Я ожидаю, что такая функция скажет мне, сколько символов будет скопировано, и это то, что должно быть возвращено. Если src или dest имеет значение NULL, вы копируете 0 символов, возвращаете 0.

В качестве альтернативы, вы можете выбрать либо 1 / true, если все было скопировано и правильно завершено 0, и 0 / false в противном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...