Обработка строк C - Википедия - C string handling

В C язык программирования имеет набор функций, реализующих операции над струны (строки символов и строки байтов) в своем стандартная библиотека. Различные операции, такие как копирование, конкатенация, токенизация и поиск поддерживаются. Для символьных строк стандартная библиотека использует соглашение о том, что строки оканчивающийся нулем: строка п символы представлены как множество из п + 1 элементы, последний из которых является символом NUL.

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

Определения

Строка определяется как непрерывная последовательность кодовые единицы заканчивается первой единицей нулевого кода (часто называемой NUL кодовый блок).[1] Это означает, что строка не может содержать нулевую кодовую единицу, так как первая видимая отмечает конец строки. В длина строки - это количество кодовых единиц перед нулевой кодовой единицей.[1] Память, занимаемая строкой, всегда на одну кодовую единицу больше, чем длина, так как пространство необходимо для хранения нулевого терминатора.

Обычно термин нить означает строку, в которой кодовая единица имеет тип char, что на всех современных машинах составляет ровно 8 бит. C90 определяет широкие струны[1] которые используют кодовую единицу типа wchar_t, который на современных машинах составляет 16 или 32 бита. Это было предназначено для Unicode но все чаще используется UTF-8 вместо этого в обычных строках для Unicode.

Строки передаются функциям путем передачи указателя на первую единицу кода. С символ * и wchar_t * относятся к разным типам, функции, обрабатывающие широкие строки, отличаются от функций, обрабатывающих обычные строки, и имеют другие имена.

Строковые литералы ("текст" в исходном коде C) преобразуются в массивы во время компиляции.[2] Результатом является массив кодовых единиц, содержащий все символы плюс завершающую нулевую кодовую единицу. В C90 L "текст" производит широкую строку. Строковый литерал может содержать блок нулевого кода (один из способов - поставить \0 в источник), но это приведет к тому, что строка закончится в этой точке. Остальная часть литерала будет помещена в память (с добавлением еще одной единицы нулевого кода в конец), но невозможно знать, что эти единицы кода были переведены из строкового литерала, поэтому такой исходный код нет строковый литерал.[3]

Кодировки символов

Каждая строка заканчивается первым вхождением единицы нулевого кода соответствующего вида (char или же wchar_t). Следовательно, байтовая строка (символ *) может содержать не-NUL персонажи в ASCII или любой Расширение ASCII, но не символы в таких кодировках, как UTF-16 (даже если 16-битная кодовая единица может быть ненулевой, ее старший или младший байт может быть нулевым). Кодировки, которые могут храниться в широких строках, определяются шириной wchar_t. В большинстве реализаций wchar_t не менее 16 бит, поэтому все 16-битные кодировки, такие как UCS-2, можно хранить. Если wchar_t 32-битные, затем 32-битные кодировки, например UTF-32, можно хранить. (Стандарт требует наличия «типа, который содержит любой широкий символ», что в Windows больше не выполняется, так как сдвиг UCS-2 в UTF-16.) C ++ 11 и C11 добавляют два типа с явной шириной char16_t и char32_t.[4]

Кодировки переменной ширины может использоваться как в байтовых, так и в широких строках. Длина строки и смещения измеряются в байтах или wchar_t, а не в «символах», что может сбить с толку начинающих программистов. UTF-8 и Shift JIS часто используются в байтовых строках C, а UTF-16 часто используется в широких строках C, когда wchar_t составляет 16 бит. Усечение строк символами переменной длины с использованием таких функций, как strncpy может создавать недопустимые последовательности в конце строки. Это может быть небезопасно, если усеченные части интерпретируются кодом, который предполагает, что ввод действителен.

Поддержка литералов Unicode, таких как char foo [512] = "φωωβαρ";(UTF-8) или wchar_t foo [512] = L "φωωβαρ"; (UTF-16 или UTF-32, зависит от wchar_t) определяется реализацией,[5] и может потребовать, чтобы исходный код был в той же кодировке, особенно для char где компиляторы могут просто скопировать все, что находится между кавычками. Некоторые компиляторы или редакторы потребуют ввести все символы, отличные от ASCII, как xNN последовательности для каждого байта UTF-8 и / или uNNNN для каждого слова UTF-16. Начиная с C11 (и C ++ 11), новый char foo [512] = u8 "φωωβαρ"; Доступен синтаксис литерала, который гарантирует UTF-8 для литерала строки байтов.[6]

Обзор функций

Большинство функций, которые работают со строками C, объявлены в string.h заголовок (cstring в C ++), а функции, которые работают со строками ширины C, объявлены в wchar.h заголовок (cwchar в C ++). Эти заголовки также содержат объявления функций, используемых для обработки буферов памяти; таким образом, название звучит неправильно.

Функции, заявленные в string.h чрезвычайно популярны, так как как часть Стандартная библиотека C, они гарантированно работают на любой платформе, поддерживающей C. Однако с этими функциями существуют некоторые проблемы безопасности, такие как потенциальные переполнение буфера при неправильном использовании, программисты предпочитают более безопасные и, возможно, менее переносимые варианты, некоторые из которых перечислены ниже. Некоторые из этих функций также нарушают const-правильность приняв const строковый указатель и возврат не-const указатель внутри строки. Чтобы исправить это, некоторые из них были разделены на два перегруженные функции в C ++ версии стандартной библиотеки.

В исторической документации термин «символ» часто использовался вместо «байт» для строк C, что приводит к тому, что многие[ВОЗ? ] поверить, что эти функции как-то не работают для UTF-8. Фактически, все длины определены в байтах, и это верно во всех реализациях, и эти функции работают как с UTF-8, так и с однобайтовыми кодировками. Документация BSD была исправлена, чтобы прояснить это, но документация POSIX, Linux и Windows по-прежнему использует «символ» во многих местах, где «байт» или «wchar_t» являются правильным термином.

Функции для обработки буферов памяти могут обрабатывать последовательности байтов, которые включают нулевой байт как часть данных. Имена этих функций обычно начинаются с мем, в отличие от ул префикс.

Константы и типы

ИмяПримечания
НОЛЬМакрос расширяется до нулевой указатель постоянный; то есть константа, представляющая значение указателя, которое гарантировано нет быть действительным адресом объекта в памяти.
wchar_tТип, используемый для кодовой единицы в широких строках, обычно беззнаковое 16-битное или 32-битное значение. Для этих кодовых единиц не указывается никакой конкретной интерпретации; стандарт C требует только, чтобы wchar_t быть достаточно широким, чтобы содержать самый широкий набор символов среди поддерживаемых систем локации.[7] Теоретически wchar_t может быть того же размера, что и char, и поэтому не может удерживать UTF-32 или же UTF-16 кодовые единицы.[8]
wint_tЦелочисленный тип, который может содержать любое значение wchar_t, а также значение макроса WEOF. Этот тип неизменен интегральными акциями. Обычно 32-битное значение со знаком.
mbstate_tСодержит всю информацию о состоянии преобразования, требуемую от одного вызова функции к другому.

Функции

Байт
нить
Широкий
нить
Описание[примечание 1]
Нить
манипуляция
strcpy[9]wcscpy[10]Копирует одну строку в другую
strncpy[11]wcsncpy[12]Точно пишет п байты, копирование из источника или добавление нулей
strcat[13]wcscat[14]Добавляет одну строку к другой
strncat[15]wcsncat[16]Добавляет не более п байты из одной строки в другую
strxfrm[17]wcsxfrm[18]Преобразует строку в соответствии с текущей локалью
Нить
осмотр
Strlen[19]wcslen[20]Возвращает длину строки
strcmp[21]wcscmp[22]Сравнивает две строки (трехстороннее сравнение )
strncmp[23]wcsncmp[24]Сравнивает определенное количество байтов в двух строках
Strcoll[25]Wcscoll[26]Сравнивает две строки в соответствии с текущей локалью
strchr[27]wcschr[28]Находит первое вхождение байта в строку
strrchr[29]wcsrchr[30]Находит последнее вхождение байта в строку
strspn[31]wcsspn[32]Возвращает количество начальных байтов в строке, которые находятся во второй строке.
strcspn[33]wcscspn[34]Возвращает количество начальных байтов в строке, которых нет во второй строке.
strpbrk[35]wcspbrk[36]Находит в строке первое вхождение байта в наборе
strstr[37]wcsstr[38]Находит первое вхождение подстроки в строке
strtok[39]Wcstok[40]Разбивает строку на токены
РазноеStrerror[41]Нет данныхВозвращает строку, содержащую сообщение, полученное из код ошибки
объем памяти
манипуляция
мемсет[42]wmemset[43]Заполняет буфер повторяющимся байтом
memcpy[44]wmemcpy[45]Копирует один буфер в другой
memmove[46]wmemmove[47]Копирует один буфер в другой, возможно, перекрывающийся, буфер
memcmp[48]wmemcmp[49]Сравнивает два буфера (трехстороннее сравнение)
мемхр[50]wmemchr[51]Находит первое вхождение байта в буфер
  1. ^ Для широких строковых функций заменить wchar_t для "байта" в описании

Многобайтовые функции

ИмяОписание
mblen[52]Возвращает количество байтов в следующем многобайтовом символе.
mbtowc[53]Преобразует следующий многобайтовый символ в широкий символ
матка[54]Преобразует широкий символ в его многобайтовое представление
mbstowcs[55]Преобразует многобайтовую строку в широкую строку
туалет[56]Преобразует широкую строку в многобайтовую строку
btowc[57]Если возможно, преобразовать однобайтовый символ в широкий символ
Wctob[58]Если возможно, преобразовать широкий символ в однобайтовый.
mbsinit[59]Проверяет, представляет ли объект состояния начальное состояние
mbrlen[60]Возвращает количество байтов в следующем многобайтовом символе для данного состояния.
mbrtowc[61]Преобразует следующий многобайтовый символ в широкий символ при заданном состоянии
Wcrtomb[62]Преобразует широкий символ в его многобайтовое представление при заданном состоянии
mbsrtowcs[63]Преобразует многобайтовую строку в широкую строку при заданном состоянии
wcsrtombs[64]Преобразует широкую строку в многобайтовую строку при заданном состоянии

Все эти функции принимают указатель на mbstate_t объект, который вызывающий должен поддерживать. Первоначально это было предназначено для отслеживания состояний сдвига в мб кодировки, но современные, такие как UTF-8, в этом не нуждаются. Однако эти функции были разработаны исходя из предположения, что Туалет кодировка не кодирование с переменной шириной и поэтому предназначены для работы только с одним wchar_t за один раз, передавая его по значению, а не используя указатель на строку. Поскольку UTF-16 - это кодировка переменной ширины, mbstate_t был повторно использован для отслеживания суррогатных пар в широкой кодировке, хотя вызывающий должен по-прежнему обнаруживать и вызывать mbtowc дважды для одного персонажа.[65][66][67]

Числовые преобразования

Байт
нить
Широкий
нить
Описание[примечание 1]
atof[68]Нет данныхпреобразует строку в значение с плавающей запятой ('atof' означает 'ASCII to float')
атой
атол
атолл[69]
Нет данныхпреобразует строку в целое число (C99 ) ('atoi' означает 'ASCII в целое число')
strtof (C99 )[70]
strtod[71]
strtold (C99 )[72]
wcstof (C99 )[73]
wcstod[74]
wcstold (C99 )[75]
преобразует строку в значение с плавающей запятой
strtol
Strtoll[76]
туалет
туалет[77]
преобразует строку в целое число со знаком
Стртул
Strtoull[78]
wcstoul
Wcstoull[79]
преобразует строку в целое число без знака
  1. ^ Здесь нить относится либо к байтовой строке, либо к широкой строке

Стандартная библиотека C содержит несколько функций для числовых преобразований. Функции, работающие с байтовыми строками, определены в stdlib.h заголовок (cstdlib заголовок в C ++). Функции, работающие с широкими строками, определены в wchar.h заголовок (cwchar заголовок в C ++).

В strtoxxx функции не const-правильно, поскольку они принимают const указатель на строку и вернуть не-const указатель внутри строки.

Кроме того, начиная с Нормативной поправки 1 (C95), атокс функции считаются включенными в strtoxxx функции, по этой причине ни C95, ни какой-либо более поздний стандарт не предоставляют версии этих функций для расширенных символов. Аргумент против атокс в том, что они не различают ошибку и 0.[80]

Популярные расширения

ИмяПлатформаОписание
bzero[81][82]POSIX, BSDЗаполняет буфер нулевыми байтами, не рекомендуется мемсет
memccpy[83]SVID, POSIXкопирует до указанного количества байтов между двумя областями памяти, которые не должны перекрываться, и останавливается при обнаружении данного байта.
mempcpy[84]GNUвариант memcpy возврат указателя на байт, следующий за последним записанным байтом
strcasecmp[85]POSIX, BSDнечувствительные к регистру версии strcmp
strcat_s[86]Windowsвариант strcat который проверяет размер целевого буфера перед копированием
strcpy_s[86]Windowsвариант strcpy который проверяет размер целевого буфера перед копированием
strdup[87]POSIXвыделяет и дублирует строку
strerror_r[88]POSIX 1, GNUвариант Strerror это потокобезопасный. Версия GNU несовместима с версией POSIX.
стрикмп[89]Windowsнечувствительные к регистру версии strcmp
strlcpy[90]BSD, Solarisвариант strcpy который усекает результат, чтобы он поместился в целевой буфер[91]
strlcat[90]BSD, Solarisвариант strcat который усекает результат, чтобы он поместился в целевой буфер[91]
Стрсигнал[92]POSIX: 2008возвращает строковое представление сигнальный код. Не потокобезопасный.
strtok_r[93]POSIXвариант strtok это потокобезопасный

Замены

Несмотря на устоявшаяся потребность заменить strcat[13] и strcpy[9] с функциями, не допускающими переполнения буфера, не возникло никакого принятого стандарта. Частично это связано с ошибочным мнением многих программистов на C, что strncat и strncpy иметь желаемое поведение; однако ни одна из функций не была разработана для этого (они были предназначены для управления строковыми буферами фиксированного размера, заполненными нулями, формат данных, менее часто используемый в современном программном обеспечении), а поведение и аргументы не интуитивно понятны и часто неправильно записываются даже экспертами программисты.[91]

Самый популярный[а] замена strlcat и strlcpy функции, появившиеся в OpenBSD 2.4 в декабре 1998 г.[91] Эти функции всегда записывают один NUL в целевой буфер, при необходимости усекая результат, и возвращают размер буфера, который может потребоваться, что позволяет обнаруживать усечение и обеспечивает размер для создания нового буфера, который не будет усекаться. Их критиковали за якобы неэффективность,[94] поощрение использования строк C (вместо какой-либо превосходной альтернативной формы строки),[95][96] и сокрытие других потенциальных ошибок.[97][98] Следовательно, они не были включены в Библиотека GNU C (используются программным обеспечением в Linux), хотя они реализованы в библиотеках C для OpenBSD, FreeBSD, NetBSD, Солярис, OS X, и QNX, а также в альтернативных библиотеках C для Linux, таких как мусл введен в 2011 году.[99][100] Отсутствие поддержки библиотеки GNU C не помешало различным авторам программного обеспечения использовать ее и, среди прочего, собирать замену. SDL, GLib, ffmpeg, rsync, и даже внутри Ядро Linux. Доступны реализации с открытым исходным кодом для этих функций.[101][102]

Иногда memcpy[44] или же memmove[46] используются, поскольку они могут быть более эффективными, чем strcpy поскольку они не проверяют повторно значение NUL (это менее верно для современных процессоров). Поскольку им в качестве параметра требуется длина буфера, правильная установка этого параметра может избежать переполнения буфера.

В рамках ее 2004 г. Жизненный цикл разработки безопасности, Microsoft представила семейство «безопасных» функций, включая strcpy_s и strcat_s (наряду со многими другими).[103] Эти функции были стандартизированы с некоторыми незначительными изменениями как часть дополнительных C11 (Приложение K) предложен ISO / IEC WDTR 24731. Эти функции выполняют различные проверки, в том числе, является ли строка слишком длинной для размещения в буфере. Если проверки завершаются неудачно, вызывается заданная пользователем функция «обработчик ограничения времени выполнения»,[104] который обычно прерывает программу.[105][106] Некоторые функции выполняют деструктивные операции перед вызовом обработчика ограничения времени выполнения; Например, strcat_s устанавливает назначение в пустую строку,[107] что может затруднить восстановление после ошибок или их отладку. Эти функции вызвали значительную критику, потому что изначально они были реализованы только в Windows, и в то же время предупреждающие сообщения начали выдавать Microsoft Visual C ++ предлагая программистам использовать эти функции вместо стандартных. Некоторые предполагают, что это попытка Microsoft заблокировать разработчиков своей платформой.[108] Хотя реализации этих функций с открытым исходным кодом доступны, эти функции отсутствуют в общих библиотеках Unix C.[109] Опыт использования этих функций показал значительные проблемы с их внедрением и ошибки в использовании, поэтому предлагается исключить Приложение K для следующей версии стандарта C.[110] Использование memset_s также был предложен как способ избежать нежелательной оптимизации компилятора.[111][112]

Смотрите также

Примечания

  1. ^ На GitHub существует 7813206 случаев использования strlcpy, по сравнению с 38 644 использованием strcpy_s (и 15 286 150 использований strcpy).[нужна цитата ]

Рекомендации

  1. ^ а б c «Стандартный проект C99 + TC3» (PDF). §7.1.1p1. Получено 7 января 2011.CS1 maint: location (связь)
  2. ^ «Стандартный проект C99 + TC3» (PDF). §6.4.5p7. Получено 7 января 2011.CS1 maint: location (связь)
  3. ^ «Стандартный проект C99 + TC3» (PDF). Раздел 6.4.5 сноска 66. Получено 7 января 2011.CS1 maint: location (связь)
  4. ^ «Основные типы». en.cppreference.com.
  5. ^ «Стандартный проект C99 + TC3» (PDF). §5.1.1.2 Этапы перевода, p1. Получено 23 декабря 2011.CS1 maint: location (связь)
  6. ^ "строковые литералы". en.cppreference.com. Получено 23 декабря 2019.
  7. ^ "stddef.h - стандартные определения типов". Открытая группа. Получено 28 января 2017.
  8. ^ Гиллам, Ричард (2003). Демистификация Unicode: практическое руководство программиста по стандарту кодирования. Эддисон-Уэсли Профессионал. п. 714. ISBN  9780201700527.
  9. ^ а б "strcpy - cppreference.com". En.cppreference.com. 2 января 2014 г.. Получено 6 марта 2014.
  10. ^ "wcscpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  11. ^ "strncpy - cppreference.com". En.cppreference.com. 4 октября 2013 г.. Получено 6 марта 2014.
  12. ^ "wcsncpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  13. ^ а б "strcat - cppreference.com". En.cppreference.com. 8 октября 2013 г.. Получено 6 марта 2014.
  14. ^ "wcscat - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  15. ^ "strncat - cppreference.com". En.cppreference.com. 1 июля 2013 г.. Получено 6 марта 2014.
  16. ^ "wcsncat - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  17. ^ "strxfrm - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  18. ^ "wcsxfrm - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  19. ^ "strlen - cppreference.com". En.cppreference.com. 27 декабря 2013 г.. Получено 6 марта 2014.
  20. ^ "wcslen - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  21. ^ "strcmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  22. ^ "wcscmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  23. ^ "strncmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  24. ^ "wcsncmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  25. ^ "strcoll - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  26. ^ "wcscoll - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  27. ^ "strchr - cppreference.com". En.cppreference.com. 23 февраля 2014 г.. Получено 6 марта 2014.
  28. ^ "wcschr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  29. ^ "strrchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  30. ^ "wcsrchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  31. ^ "strspn - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  32. ^ "wcsspn - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  33. ^ "strcspn - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
  34. ^ "wcscspn - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  35. ^ "strpbrk - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
  36. ^ "wcspbrk - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  37. ^ "strstr - cppreference.com". En.cppreference.com. 16 октября 2013 г.. Получено 6 марта 2014.
  38. ^ "wcsstr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  39. ^ "strtok - cppreference.com". En.cppreference.com. 3 сентября 2013 г.. Получено 6 марта 2014.
  40. ^ "wcstok - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  41. ^ "strerror - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
  42. ^ "memset - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  43. ^ "wmemset - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  44. ^ а б "memcpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  45. ^ "wmemcpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  46. ^ а б "memmove - cppreference.com". En.cppreference.com. 25 января 2014 г.. Получено 6 марта 2014.
  47. ^ "wmemmove - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  48. ^ "memcmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  49. ^ "wmemcmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  50. ^ "memchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  51. ^ "wmemchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  52. ^ "mblen - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  53. ^ "mbtowc - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  54. ^ "wctomb - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
  55. ^ "mbstowcs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  56. ^ "wcstombs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  57. ^ "btowc - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  58. ^ "wctob - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  59. ^ "mbsinit - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  60. ^ "mbrlen - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  61. ^ "mbrtowc - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  62. ^ "wcrtomb - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  63. ^ "mbsrtowcs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  64. ^ "wcsrtombs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  65. ^ «6.3.2 Отображение состояния преобразования». Библиотека GNU C. Получено 31 января 2017.
  66. ^ "корень / SRC / мультибайт / c16rtomb.c". Получено 31 января 2017.
  67. ^ «Содержимое /stable/11/lib/libc/locale/c16rtomb.c». Получено 31 января 2017.
  68. ^ "atof - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
  69. ^ "атой, атол, атолл - cppreference.com". En.cppreference.com. 18 января 2014 г.. Получено 6 марта 2014.
  70. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
  71. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
  72. ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
  73. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  74. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  75. ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  76. ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
  77. ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  78. ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
  79. ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
  80. ^ C99 Обоснование, 7.20.1.1
  81. ^ "бзеро". Открытая группа. Получено 27 ноября 2017.
  82. ^ "бзеро (3)". OpenBSD. Получено 27 ноября 2017.
  83. ^ "memccpy". Pubs.opengroup.org. Получено 6 марта 2014.
  84. ^ "mempcpy (3) - страница руководства Linux". Kernel.org. Получено 6 марта 2014.
  85. ^ "strcasecmp (3) - страница руководства Linux". Kernel.org. Получено 6 марта 2014.
  86. ^ а б "strcat_s, wcscat_s, _mbscat_s". Msdn.microsoft.com. Получено 6 марта 2014.
  87. ^ "strdup". Pubs.opengroup.org. Получено 6 марта 2014.
  88. ^ "strerror (3) - страница руководства Linux". man7.org. Получено 3 ноября 2019.
  89. ^ "Строка | stricmp ()". C Programming Expert.com. Получено 6 марта 2014.
  90. ^ а б "strlcpy, strlcat - копирование и объединение строк с ограниченным размером". OpenBSD. Получено 26 мая 2016.
  91. ^ а б c d Тодд С. Миллер; Тео де Раадт (1999). "strlcpy и strlcat - согласованное, безопасное, строковое копирование и объединение". USENIX '99.
  92. ^ "Стрсигнал". Pubs.opengroup.org. Получено 6 марта 2014.
  93. ^ "Стрток". Pubs.opengroup.org. Получено 6 марта 2014.
  94. ^ Миллер, Дэмиен (октябрь 2005 г.). «Безопасная переносимость» (PDF). Получено 26 июн 2016. Этот API [strlcpy и strlcat] принят в большинстве современных операционных систем и во многих [...] автономных программных пакетах. Заметным исключением является стандартная библиотека C GNU, glibc, сопровождающая которой категорически отказывается включать эти улучшенные API, называя их «ужасно неэффективной чушью BSD», несмотря на предшествующие доказательства того, что они в большинстве случаев быстрее, чем API, которые они заменяют.
  95. ^ список рассылки libc-alpha, выбрал сообщения из ветки 8 августа 2000: 53, 60, 61
  96. ^ Взлеты и падения strlcpy (); LWN.net
  97. ^ "Добавление strlcpy () в glibc". lwn.net. Правильная обработка строк означает, что вы всегда знаете, какова длина ваших строк, и поэтому вы можете использовать memcpy (вместо strcpy).
  98. ^ strlcpy (3) – Linux Библиотечные функции Руководство «Однако можно усомниться в правильности таких оптимизаций, поскольку они сводят на нет всю цель strlcpy () и strlcat (). Фактически, первая версия этой справочной страницы ошибалась».
  99. ^ "корень / SRC / строка / strlcpy.c". Получено 28 января 2017.
  100. ^ "корень / SRC / строка / strlcat.c". Получено 28 января 2017.
  101. ^ Тодд С. Миллер. "strlcpy.c". Перекрестная ссылка BSD.
  102. ^ Тодд С. Миллер. "strlcat.c". Перекрестная ссылка BSD.
  103. ^ Ловелл, Мартин. «Отразите атаки на ваш код с помощью безопасных библиотек C и C ++ Visual Studio 2005». Получено 13 февраля 2015.
  104. ^ «Стандартный проект С11» (PDF). §K.3.1.4p2. Получено 13 февраля 2013.CS1 maint: location (связь)
  105. ^ «Стандартный проект С11» (PDF). §K.3.6.1.1p4. Получено 13 февраля 2013.CS1 maint: location (связь)
  106. ^ «Проверка параметров».
  107. ^ «Стандартный проект С11» (PDF). §K.3.7.2.1p4. Получено 13 февраля 2013.CS1 maint: location (связь)
  108. ^ Дэнни Калев. "Они снова за этим". InformIT. Архивировано из оригинал 15 января 2012 г.. Получено 10 ноября 2011.
  109. ^ Безопасная библиотека C. «Библиотека Safe C обеспечивает память для проверки границ и строковые функции в соответствии с ISO / IEC TR24731». Sourceforge. Получено 6 марта 2013.
  110. ^ «Опыт работы с Приложением K - Интерфейсы для проверки границ». Получено 5 ноября 2015.
  111. ^ «MSC06-C. Остерегайтесь оптимизаций компилятора». Стандарт кодирования SEI CERT C.
  112. ^ memset_s (3) – FreeBSD Библиотечные функции Руководство

внешняя ссылка

  • Быстрый memcpy на C, несколько примеров кодирования C для разных типов архитектур команд ЦП