Стандартная библиотека C |
---|
Общие темы |
Разные заголовки |
В языке программирования C есть набор функций, реализующих операции со строками (символьными строками и байтовыми строками) в своей стандартной библиотеке . Поддерживаются различные операции, такие как копирование, конкатенация , токенизация и поиск. Для символьных строк стандартная библиотека использует соглашение о том, что строки заканчиваются нулем : строка из n символов представлена как массив из n + 1 элементов, последний из которых является символом «NUL».
Единственная поддержка строк в собственно языке программирования заключается в том, что компилятор переводит строковые константы в кавычках в строки с завершающим нулем.
Определения [ править ]
Строка определяются как непрерывная последовательность кодовых блоков прерванных первым блоком нулевой код (часто называемый NUL блока коды). [1] Это означает, что строка не может содержать нулевую кодовую единицу, поскольку первая видимая отмечает конец строки. Длина строки является количество кодовых блоков перед блоком нулевой код. [1] Память, занимаемая строкой, всегда на одну кодовую единицу больше, чем ее длина, так как пространство необходимо для хранения нулевого терминатора.
Обычно термин строка означает строку, в которой кодовая единица имеет тип char
, который на всех современных машинах равен 8 битам. C90 определяет широкие строки [1], которые используют кодовую единицу типа wchar_t
, которая на современных машинах составляет 16 или 32 бита. Это было предназначено для Unicode, но вместо этого все чаще используется UTF-8 в обычных строках для Unicode.
Строки передаются функциям путем передачи указателя на первую единицу кода. Поскольку char*
и wchar_t*
относятся к разным типам, функции, обрабатывающие широкие строки, отличаются от функций, обрабатывающих обычные строки, и имеют разные имена.
Строковые литералы ( "text"
в исходном коде C) преобразуются в массивы во время компиляции. [2] Результатом является массив кодовых единиц, содержащий все символы плюс завершающую нулевую кодовую единицу. В C90 L"text"
выдает широкую струну. Строковый литерал может содержать нулевую кодовую единицу (один из способов - вставить \0
в исходный код), но это приведет к тому, что строка закончится в этой точке. Остальная часть литерала будет помещена в память (с добавлением еще одной единицы нулевого кода в конце), но невозможно знать, что эти единицы кода были переведены из строкового литерала, поэтому такой исходный код не является строковым литералом. [3]
Кодировки символов [ править ]
Каждая строка заканчивается первым появлением единицы нулевого кода соответствующего вида ( char
или wchar_t
). Следовательно, байтовая строка ( char*
) может содержать символы, отличные от 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 Wide, объявлены в wchar.h
заголовке ( cwchar
в C ++). Эти заголовки также содержат объявления функций, используемых для обработки буферов памяти; таким образом, название звучит неправильно.
Функции, объявленные в string.h
, чрезвычайно популярны, поскольку, будучи частью стандартной библиотеки C , они гарантированно работают на любой платформе, поддерживающей C. Однако с этими функциями существуют некоторые проблемы безопасности, такие как потенциальные переполнения буфера при неправильном использовании. , заставляя программистов отдавать предпочтение более безопасным и, возможно, менее переносимым вариантам, некоторые из которых перечислены ниже. Некоторые из этих функций также нарушают константную корректность , принимая const
указатель на строку и возвращая не const
указатель внутри строки. Чтобы исправить это, некоторые из них были разделены на две перегруженные функции в версии стандартной библиотеки для C ++.
В исторической документации термин «символ» часто использовался вместо «байт» для строк C, что приводит многих [ кто? ] полагать, что эти функции почему-то не работают для UTF-8 . Фактически, все длины определены в байтах, и это верно для всех реализаций, и эти функции работают с UTF-8 так же хорошо, как и с однобайтовыми кодировками. Документация BSD была исправлена, чтобы прояснить это, но документация POSIX, Linux и Windows по-прежнему использует «символ» во многих местах, где «байт» или «wchar_t» являются правильным термином.
Функции для обработки буферов памяти могут обрабатывать последовательности байтов, которые включают нулевой байт как часть данных. Имена этих функций обычно начинаются с mem
, а не с str
префикса.
Константы и типы [ править ]
Имя | Примечания |
---|---|
NULL | Макрос расширяется до константы нулевого указателя ; то есть константа, представляющая значение указателя, которое гарантированно не является действительным адресом объекта в памяти. |
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] | Записывает ровно n байтов, копируя из источника или добавляя нули | |
strcat [13] | wcscat [14] | Добавляет одну строку к другой | |
strncat [15] | wcsncat [16] | Добавляет не более n байтов из одной строки в другую | |
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] | Нет данных | Возвращает строку, содержащую сообщение, полученное из кода ошибки. |
Манипуляции с памятью | memset [42] | wmemset [43] | Заполняет буфер повторяющимся байтом |
memcpy [44] | wmemcpy [45] | Копирует один буфер в другой | |
memmove [46] | wmemmove [47] | Копирует один буфер в другой, возможно, перекрывающийся, буфер | |
memcmp [48] | wmemcmp [49] | Сравнивает два буфера (трехстороннее сравнение) | |
memchr [50] | wmemchr [51] | Находит первое вхождение байта в буфер | |
|
Многобайтовые функции [ править ]
Имя | Описание |
---|---|
mblen [52] | Возвращает количество байтов в следующем многобайтовом символе. |
mbtowc [53] | Преобразует следующий многобайтовый символ в широкий символ |
wctomb [54] | Преобразует широкий символ в его многобайтовое представление |
mbstowcs [55] | Преобразует многобайтовую строку в широкую строку |
wcstombs [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') |
atoi atol atoll [69] | Нет данных | преобразует строку в целое число ( C99 ) ('atoi' означает 'ASCII в целое число') |
strtof ( C99 ) [70] strtod [71]strtold ( C99 ) [72] | wcstof ( C99 ) [73] wcstod [74]wcstold ( C99 ) [75] | преобразует строку в значение с плавающей запятой |
strtol strtoll [76] | wcstol wcstoll [77] | преобразует строку в целое число со знаком |
strtoul strtoull [78] | wcstoul wcstoull [79] | преобразует строку в целое число без знака |
|
Стандартная библиотека C содержит несколько функций для числовых преобразований. Функции, которые работают с байтовыми строками, определены в stdlib.h
заголовке ( cstdlib
заголовок в C ++). Функции, работающие с широкими строками, определены в wchar.h
заголовке ( cwchar
заголовок в C ++).
Эти strtoxxx
функции не сопзИте-правильно , так как они принимают const
указатель на строку и возвращают не- const
указателя в строке.
Кроме того, начиная с Нормативной поправки 1 (C95), atoxx
функции считаются включенными в strtoxxx
функции, по этой причине ни C95, ни какой-либо более поздний стандарт не предоставляют версии этих функций для расширенных символов. Аргумент против atoxx
состоит в том, что они не различают ошибку и ошибку 0
. [80]
Популярные расширения [ править ]
Имя | Платформа | Описание |
---|---|---|
bzero [81] [82] | POSIX , BSD | Заполняет буфер нулевыми байтами, не рекомендуется memset |
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. |
stricmp [89] | Windows | нечувствительные к регистру версии strcmp |
strlcpy [90] | BSD, Solaris | вариант, strcpyкоторый усекает результат, чтобы поместиться в целевой буфер [91] |
strlcat [90] | BSD, Solaris | вариант, strcatкоторый усекает результат, чтобы поместиться в целевой буфер [91] |
strsignal [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 , Solaris , OS X и QNX , а также в альтернативных библиотеках C для Linux, таких как musl, представленный в 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 насчитывается 7 813 206 использований по
strlcpy
сравнению с 38 644 использованиемstrcpy_s
(и 15 286 150 использованийstrcpy
). [ необходима цитата ]
Ссылки [ править ]
- ^ a b 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 Фазы перевода, стр. 1 . Проверено 23 декабря 2011 года . CS1 maint: location ( ссылка )
- ^ "строковые литералы" . en.cppreference.com . Проверено 23 декабря 2019 .
- ^ "stddef.h - стандартные определения типов" . Открытая группа . Проверено 28 января 2017 года .
- ^ Гиллам, Ричард (2003). Unicode Demystified: Практическое руководство программиста по стандарту кодирования . Эддисон-Уэсли Профессионал. п. 714. ISBN 9780201700527.
- ^ a b "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 .
- ^ a b "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 .
- ^ a b "memcpy - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
- ^ "wmemcpy - cppreference.com" . En.cppreference.com . Проверено 6 марта 2014 .
- ^ a b "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 Library . Проверено 31 января 2017 года .
- ^ "корень / src / multibyte / 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 года .
- ^ "bzero (3)" . OpenBSD . Проверено 27 ноября 2017 года .
- ^ "memccpy" . Pubs.opengroup.org . Проверено 6 марта 2014 .
- ^ "mempcpy (3) - справочная страница Linux" . Kernel.org . Проверено 6 марта 2014 .
- ^ "strcasecmp (3) - страница руководства Linux" . Kernel.org . Проверено 6 марта 2014 .
- ^ a b "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 Expert.com . Проверено 6 марта 2014 .
- ^ a b "strlcpy, strlcat - копирование и объединение строк с ограниченным размером" . OpenBSD . Дата обращения 26 мая 2016 .
- ^ a b 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 .
- ^ "Стандартный проект C11" (PDF) . §K.3.1.4p2 . Проверено 13 февраля 2013 года . CS1 maint: location ( ссылка )
- ^ "Стандартный проект C11" (PDF) . §K.3.6.1.1p4 . Проверено 13 февраля 2013 года . CS1 maint: location ( ссылка )
- ^ «Проверка параметров» .
- ^ "Стандартный проект C11" (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. Остерегайтесь оптимизации компилятора» . ДИР СЕРТ C Стандарт кодирования .
- ^ - Руководство по функциям библиотеки FreeBSD
Внешние ссылки [ править ]
В Викибуке Программирование на C есть страница по теме: Программирование на C / Строки |
- Быстрый memcpy на C , несколько примеров кодирования C для разных типов архитектур команд ЦП