strcpy … хотят заменить strcpy_mine, который будет strncpy и оконечный пустой указатель

Я нашел плагин jQuery ( http://www.jason-palmer.com/2008/08/jquery-plugin-form-field-default-value/ ) и использую его:)

6
задан timB33 4 June 2009 в 14:57
поделиться

7 ответов

В зависимости от того, как выглядят сайты звонков, в большинстве случаев можно обработать простой шаблон:

#include <string.h>

template <int bufferSize>
void strcpy_mine( char (&pTarget)[bufferSize], const char* const pCopyMe )
{
  strncpy( pTarget, pCopyMe, bufferSize-1 );

  //add extra terminator in case of overrun
  pTarget[bufferSize-1] = 0;
}

int main()
{
  char buf[128];
  strcpy_mine(buf,"Testing");
  return 0;
}

Если вы используете Microsoft Visual Studio 2005 или новее, см. Защищенные перегрузки шаблонов для реализации Microsoft.

4
ответ дан 8 December 2019 в 13:01
поделиться

sizeof () возвращает размер типа - в этом case const char * const , которое на 32-битных машинах будет равно 4.

Я думаю, вы думаете, что вам нужен strlen () . Но это неправильный способ использования функций strncpy. Вам нужен размер буфера вывода для strncpy.

Чтобы исправить это, вам нужно проверить код на каждом сайте вызова, определить размер буфера вывода и передать его в качестве аргумента на strcpy_mine . Если сайт вызова для strcpy (или strcpy_mine) не знает размер выходного буфера, вам необходимо выполнить поиск назад в коде места, которое выделяет буфер, и передать размер полностью вниз на сайт strcpy .

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

11
ответ дан 8 December 2019 в 13:01
поделиться

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

Это не по теме, но я просто хочу указать Из этого следует, что после использования strncpy () вам необходимо обнулить последний символ буфера, индекс которого на 1 меньше , чем длина (не длина буфера ):

strncpy (buf, pCopyMe, buflen); buf[buflen - 1] = '\0';

Или, в качестве альтернативы, вы можете использовать strncat () для пустой строки, передав ей длину на 1 меньше, и это гарантирует завершение строки нулем:

buf[0] = '\0'; strncat (buf, pCopyMe, buflen - 1);
0
ответ дан 8 December 2019 в 13:01
поделиться

Вы можете использовать тот же список параметров, что и strncpy для вашего strcpy_mine, но записать его так, чтобы он всегда завершал результат нулевым значением. Это не должно быть очень сложно.

Однако одна проблема заключается в том, что часть вашего существующего кода, который вызывает strcpy (), также может не знать размер буфера.

1
ответ дан 8 December 2019 в 13:01
поделиться

Также вы можете использовать макросы, чтобы избежать многократного редактирования. Или автоматизировать редактирование с помощью какого-нибудь скрипта.

0
ответ дан 8 December 2019 в 13:01
поделиться

Возможно, немного второстепенный, но поскольку никто об этом не упомянул, и это красуется в названии: вы не можете (юридически) написать глобальную функцию с именем strcpy_mine () .

] «Пространство имен» функций, имена которых начинаются с str , зарезервировано для стандартной библиотеки. См., Например, общепринятый ответ на этот вопрос .

2
ответ дан 8 December 2019 в 13:01
поделиться

Дуглас Лидер прав. Существует предел полезности замены strcpy, если вы не готовы выполнять тяжелую работу по передаче хорошей, разумной длины буфера в каждом отдельном случае. Это большая работа!

Хорошая новость в том, что оно того стоит! Несколько лет назад я участвовал в нескольких проектах C ++, которые были запоздалыми, содержали ошибки и ненадежны. Объявив strcpy и strlen запрещенными и выйдя из проекта на 2-3 дня, чтобы заменить их пользовательскими strncpy / strnlen, во всех этих проектах мы внезапно могли работать в течение нескольких дней, а не часов. Мы также видели, что на экранах и в файлах журналов появляется множество усеченных строк. Это дало нам подсказки, необходимые для отслеживания проблем с усечением, ранее приводивших к сбою.

Если вы не хотите этого делать, вы можете получить гораздо меньшее преимущество, просто проверив оба параметра указателя на NULL и ограничив максимальный размер копии строки и протоколировав все время достижения границы. Не делайте strlen для любого параметра, так как strlen с радостью вылетит из-за вас, если строка неправильно завершена нулем.

В настоящее время новые проекты используют хорошие строковые объекты, но есть много устаревшего кода, который не .

0
ответ дан 8 December 2019 в 13:01
поделиться