Я нашел плагин jQuery ( http://www.jason-palmer.com/2008/08/jquery-plugin-form-field-default-value/ ) и использую его:)
В зависимости от того, как выглядят сайты звонков, в большинстве случаев можно обработать простой шаблон:
#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.
sizeof () возвращает размер типа - в этом case const char * const
, которое на 32-битных машинах будет равно 4.
Я думаю, вы думаете, что вам нужен strlen ()
. Но это неправильный способ использования функций strncpy.
Вам нужен размер буфера вывода для strncpy.
Чтобы исправить это, вам нужно проверить код на каждом сайте вызова, определить размер буфера вывода и передать его в качестве аргумента на strcpy_mine
. Если сайт вызова для strcpy (или strcpy_mine) не знает размер выходного буфера, вам необходимо выполнить поиск назад в коде места, которое выделяет буфер, и передать размер полностью вниз на сайт strcpy .
По сути, вы не можете написать замену strcpy, которая принимает те же аргументы и надеется избежать проблем, которые изначально создавали strncpy (и более качественные замены, кроме этого). Вы можете создать функцию, которая принимает те же аргументы, что и strncpy, но гарантирует, что результат будет завершаться нулем - посмотрите на реализацию OpenBSD ' s strlcpy () функция. Но первым шагом должно быть изменение вызывающих сайтов для передачи информации о размере выходного буфера.
Вам обязательно нужно передать размер целевого буфера в качестве параметра, как говорили другие люди выше.
Это не по теме, но я просто хочу указать Из этого следует, что после использования strncpy ()
вам необходимо обнулить последний символ буфера, индекс которого на 1 меньше , чем длина (не длина буфера ):
strncpy (buf, pCopyMe, buflen); buf[buflen - 1] = '\0';
Или, в качестве альтернативы, вы можете использовать strncat ()
для пустой строки, передав ей длину на 1 меньше, и это гарантирует завершение строки нулем:
buf[0] = '\0'; strncat (buf, pCopyMe, buflen - 1);
Вы можете использовать тот же список параметров, что и strncpy для вашего strcpy_mine, но записать его так, чтобы он всегда завершал результат нулевым значением. Это не должно быть очень сложно.
Однако одна проблема заключается в том, что часть вашего существующего кода, который вызывает strcpy (), также может не знать размер буфера.
Также вы можете использовать макросы, чтобы избежать многократного редактирования. Или автоматизировать редактирование с помощью какого-нибудь скрипта.
Возможно, немного второстепенный, но поскольку никто об этом не упомянул, и это красуется в названии: вы не можете (юридически) написать глобальную функцию с именем strcpy_mine ()
.
] «Пространство имен» функций, имена которых начинаются с str
, зарезервировано для стандартной библиотеки. См., Например, общепринятый ответ на этот вопрос .
Дуглас Лидер прав. Существует предел полезности замены strcpy, если вы не готовы выполнять тяжелую работу по передаче хорошей, разумной длины буфера в каждом отдельном случае. Это большая работа!
Хорошая новость в том, что оно того стоит! Несколько лет назад я участвовал в нескольких проектах C ++, которые были запоздалыми, содержали ошибки и ненадежны. Объявив strcpy и strlen запрещенными и выйдя из проекта на 2-3 дня, чтобы заменить их пользовательскими strncpy / strnlen, во всех этих проектах мы внезапно могли работать в течение нескольких дней, а не часов. Мы также видели, что на экранах и в файлах журналов появляется множество усеченных строк. Это дало нам подсказки, необходимые для отслеживания проблем с усечением, ранее приводивших к сбою.
Если вы не хотите этого делать, вы можете получить гораздо меньшее преимущество, просто проверив оба параметра указателя на NULL и ограничив максимальный размер копии строки и протоколировав все время достижения границы. Не делайте strlen для любого параметра, так как strlen с радостью вылетит из-за вас, если строка неправильно завершена нулем.
В настоящее время новые проекты используют хорошие строковые объекты, но есть много устаревшего кода, который не .