Обработка строки C - C string handling - Wikipedia
Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
В 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] | Находит первое вхождение байта в буфер | |
|
Многобайтовые функции
Имя | Описание |
---|---|
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] | преобразует строку в целое число без знака |
|
Стандартная библиотека 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]
Смотрите также
- Синтаксис C § Строки - синтаксис исходного кода, включая escape-последовательности с обратной косой чертой
- Строковые функции
Примечания
- ^ На GitHub существует 7813206 случаев использования
strlcpy
, по сравнению с 38 644 использованиемstrcpy_s
(и 15 286 150 использованийstrcpy
).[нужна цитата ]
Рекомендации
- ^ а б c «Стандартный проект C99 + TC3» (PDF). §7.1.1p1. Получено 7 января 2011.CS1 maint: location (связь)
- ^ «Стандартный проект C99 + TC3» (PDF). §6.4.5p7. Получено 7 января 2011.CS1 maint: location (связь)
- ^ «Стандартный проект C99 + TC3» (PDF). Раздел 6.4.5 сноска 66. Получено 7 января 2011.CS1 maint: location (связь)
- ^ «Основные типы». en.cppreference.com.
- ^ «Стандартный проект C99 + TC3» (PDF). §5.1.1.2 Этапы перевода, p1. Получено 23 декабря 2011.CS1 maint: location (связь)
- ^ "строковые литералы". en.cppreference.com. Получено 23 декабря 2019.
- ^ "stddef.h - стандартные определения типов". Открытая группа. Получено 28 января 2017.
- ^ Гиллам, Ричард (2003). Демистификация Unicode: практическое руководство программиста по стандарту кодирования. Эддисон-Уэсли Профессионал. п. 714. ISBN 9780201700527.
- ^ а б "strcpy - cppreference.com". En.cppreference.com. 2 января 2014 г.. Получено 6 марта 2014.
- ^ "wcscpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strncpy - cppreference.com". En.cppreference.com. 4 октября 2013 г.. Получено 6 марта 2014.
- ^ "wcsncpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ а б "strcat - cppreference.com". En.cppreference.com. 8 октября 2013 г.. Получено 6 марта 2014.
- ^ "wcscat - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strncat - cppreference.com". En.cppreference.com. 1 июля 2013 г.. Получено 6 марта 2014.
- ^ "wcsncat - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strxfrm - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcsxfrm - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strlen - cppreference.com". En.cppreference.com. 27 декабря 2013 г.. Получено 6 марта 2014.
- ^ "wcslen - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strcmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcscmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strncmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcsncmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strcoll - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcscoll - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strchr - cppreference.com". En.cppreference.com. 23 февраля 2014 г.. Получено 6 марта 2014.
- ^ "wcschr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strrchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcsrchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strspn - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcsspn - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strcspn - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
- ^ "wcscspn - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strpbrk - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
- ^ "wcspbrk - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strstr - cppreference.com". En.cppreference.com. 16 октября 2013 г.. Получено 6 марта 2014.
- ^ "wcsstr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strtok - cppreference.com". En.cppreference.com. 3 сентября 2013 г.. Получено 6 марта 2014.
- ^ "wcstok - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strerror - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
- ^ "memset - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wmemset - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ а б "memcpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wmemcpy - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ а б "memmove - cppreference.com". En.cppreference.com. 25 января 2014 г.. Получено 6 марта 2014.
- ^ "wmemmove - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "memcmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wmemcmp - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "memchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wmemchr - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "mblen - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "mbtowc - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wctomb - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
- ^ "mbstowcs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcstombs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "btowc - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wctob - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "mbsinit - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "mbrlen - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "mbrtowc - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcrtomb - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "mbsrtowcs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcsrtombs - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ «6.3.2 Отображение состояния преобразования». Библиотека GNU C. Получено 31 января 2017.
- ^ "корень / SRC / мультибайт / c16rtomb.c". Получено 31 января 2017.
- ^ «Содержимое /stable/11/lib/libc/locale/c16rtomb.c». Получено 31 января 2017.
- ^ "atof - cppreference.com". En.cppreference.com. 31 мая 2013 года. Получено 6 марта 2014.
- ^ "атой, атол, атолл - cppreference.com". En.cppreference.com. 18 января 2014 г.. Получено 6 марта 2014.
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
- ^ "strtof, strtod, strtold - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "wcstof, wcstod, wcstold - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strtol, strtoll - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
- ^ "wcstol, wcstoll - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ "strtoul, strtoull - cppreference.com". En.cppreference.com. 4 февраля 2014 г.. Получено 6 марта 2014.
- ^ "wcstoul, wcstoull - cppreference.com". En.cppreference.com. Получено 6 марта 2014.
- ^ C99 Обоснование, 7.20.1.1
- ^ "бзеро". Открытая группа. Получено 27 ноября 2017.
- ^ "бзеро (3)". OpenBSD. Получено 27 ноября 2017.
- ^ "memccpy". Pubs.opengroup.org. Получено 6 марта 2014.
- ^ "mempcpy (3) - страница руководства Linux". Kernel.org. Получено 6 марта 2014.
- ^ "strcasecmp (3) - страница руководства Linux". Kernel.org. Получено 6 марта 2014.
- ^ а б "strcat_s, wcscat_s, _mbscat_s". Msdn.microsoft.com. Получено 6 марта 2014.
- ^ "strdup". Pubs.opengroup.org. Получено 6 марта 2014.
- ^ "strerror (3) - страница руководства Linux". man7.org. Получено 3 ноября 2019.
- ^ "Строка | stricmp ()". C Programming Expert.com. Получено 6 марта 2014.
- ^ а б "strlcpy, strlcat - копирование и объединение строк с ограниченным размером". OpenBSD. Получено 26 мая 2016.
- ^ а б c d Тодд С. Миллер; Тео де Раадт (1999). "strlcpy и strlcat - согласованное, безопасное, строковое копирование и объединение". USENIX '99.
- ^ "Стрсигнал". Pubs.opengroup.org. Получено 6 марта 2014.
- ^ "Стрток". Pubs.opengroup.org. Получено 6 марта 2014.
- ^ Миллер, Дэмиен (октябрь 2005 г.). «Безопасная переносимость» (PDF). Получено 26 июн 2016.
Этот API [strlcpy и strlcat] принят в большинстве современных операционных систем и во многих [...] автономных программных пакетах. Заметным исключением является стандартная библиотека C GNU, glibc, сопровождающая которой категорически отказывается включать эти улучшенные API, называя их «ужасно неэффективной чушью BSD», несмотря на предшествующие доказательства того, что они в большинстве случаев быстрее, чем API, которые они заменяют.
- ^ список рассылки libc-alpha, выбрал сообщения из ветки 8 августа 2000: 53, 60, 61
- ^ Взлеты и падения strlcpy (); LWN.net
- ^ "Добавление strlcpy () в glibc". lwn.net.
Правильная обработка строк означает, что вы всегда знаете, какова длина ваших строк, и поэтому вы можете использовать memcpy (вместо strcpy).
- ^ Linux Библиотечные функции Руководство «Однако можно усомниться в правильности таких оптимизаций, поскольку они сводят на нет всю цель strlcpy () и strlcat (). Фактически, первая версия этой справочной страницы ошибалась». –
- ^ "корень / SRC / строка / strlcpy.c". Получено 28 января 2017.
- ^ "корень / SRC / строка / strlcat.c". Получено 28 января 2017.
- ^ Тодд С. Миллер. "strlcpy.c". Перекрестная ссылка BSD.
- ^ Тодд С. Миллер. "strlcat.c". Перекрестная ссылка BSD.
- ^ Ловелл, Мартин. «Отразите атаки на ваш код с помощью безопасных библиотек C и C ++ Visual Studio 2005». Получено 13 февраля 2015.
- ^ «Стандартный проект С11» (PDF). §K.3.1.4p2. Получено 13 февраля 2013.CS1 maint: location (связь)
- ^ «Стандартный проект С11» (PDF). §K.3.6.1.1p4. Получено 13 февраля 2013.CS1 maint: location (связь)
- ^ «Проверка параметров».
- ^ «Стандартный проект С11» (PDF). §K.3.7.2.1p4. Получено 13 февраля 2013.CS1 maint: location (связь)
- ^ Дэнни Калев. "Они снова за этим". InformIT. Архивировано из оригинал 15 января 2012 г.. Получено 10 ноября 2011.
- ^ Безопасная библиотека C. «Библиотека Safe C обеспечивает память для проверки границ и строковые функции в соответствии с ISO / IEC TR24731». Sourceforge. Получено 6 марта 2013.
- ^ «Опыт работы с Приложением K - Интерфейсы для проверки границ». Получено 5 ноября 2015.
- ^ «MSC06-C. Остерегайтесь оптимизаций компилятора». Стандарт кодирования SEI CERT C.
- ^ FreeBSD Библиотечные функции Руководство –
внешняя ссылка
- Быстрый memcpy на C, несколько примеров кодирования C для разных типов архитектур команд ЦП