это хорошая strlcat() реализации?


Я хотел бы знать, если я уважаю strlcat(3) behiour с моей реализации, я не совсем уверен, чтобы понять strlcat конкретное поведение

int my_strlcat(char *dest, char *src, int size)
{
  int i;
  int src_len;
  int dest_len;

  i = 0;
  dest_len = strlen(dest);
  src_len = strlen(src);
  if (size <= 0)
   return dest_len;
  while (dest_len < size)
  {
    dest[dest_len] = src[i];
    dest_len++;
    i++;
  }
  dest[dest_len] = '\0';
  return (strlen(dest));
}


4858
2
задан 12 октября 2011 в 12:10 Источник Поделиться
Комментарии
4 ответа

while (dest_len < size)
{
dest[dest_len] = src[i];
dest_len++;
i++;
}
dest[dest_len] = '\0';

В конце цикла dest_len будет равный размер, и dest[des_len] напишу за пределы разрешенного смещения.

Update: это, вероятно, будет работать

size_t my_strlcat(char *dest, char *src, size_t size)
{
size_t src_len, dest_len;

dest_len = strlen(dest);
src_len = strlen(src);

if (dest_len+src_len>= size) return dest_len+src_len;

memcpy(dest+dest_len, src, src_len+1);

return dest_len+src_len;
}

0
ответ дан 12 октября 2011 в 12:10 Источник Поделиться


  • src_len не используется..

  • в функция strlen в оператор return не нужен.. вы знаете длину от dest_len.

ИМХО очень странный реализации :)

2
ответ дан 12 октября 2011 в 01:10 Источник Поделиться

Есть несколько вещей неправильно, если это означало быть внедрение стандарта strlcat():


  • Функция определения должны быть представлены в виде: реализация my_strlcat(типа char *ДСТ константный тип char *в src, size_t в размер);

  • Вы всегда переполнен буфер назначения на один, когда вы нул прекратить.

  • Вы переполнены исходный буфер чтения в зависимости от входных данных. Например, если рассмотреть dest_len=1, src_len=2 и площадь=1000.

  • А не ошибался он, лучше постараться свести к минимуму использование функция strlen() , если необходимо. Вы, вероятно, нужна только одна функция strlen(дест).

См. здесь для примера реализации strlcat().

2
ответ дан 12 октября 2011 в 01:10 Источник Поделиться

Вы в основном правы, я думаю. Проверив страницу strlcpy() показывает одно несоответствие я вижу - нулевой прекращении назначения происходит только в том случае, если есть место в дест после копирования. Хотя это кажется немного опасно для меня, это зависит от того, насколько хорошо вы хотите повторить семантику. Вашей текущей реализации всегда имеет значение null-прерывается, что приятно и безопасно, но может в конечном итоге расширяются от реализации акций в этом пограничном случае.

Для производительности, вы должны проверить размер <= 0 перед вами функция strlen() как строк, так как в этом случае вам нужно только позвонить функция strlen(дест). Это может показаться незначительным, но функция strlen работает за o(n) времени, так что вы не хотите называть его, если вы не должны. Так что в основном просто переместить проверить размер , чтобы до вызова функция strlen(ГКЗ).

0
ответ дан 12 октября 2011 в 12:10 Источник Поделиться