Язык программирования 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, объявлены в 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] | N / A | Возвращает строку, содержащую сообщение, полученное из кода ошибки. |
Манипуляции с памятью | 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] | N / A | преобразует строку в значение с плавающей запятой ('atof' означает 'ASCII to float') |
atoi atol atoll [69] | N / A | преобразует строку в целое число ( 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] | Окна | вариант, strcatкоторый проверяет размер целевого буфера перед копированием |
strcpy_s [86] | Окна | вариант, strcpyкоторый проверяет размер целевого буфера перед копированием |
strdup [87] | POSIX | выделяет и дублирует строку |
strerror_r [88] | POSIX 1, GNU | вариант strerrorэтого является поточно-ориентированным. Версия GNU несовместима с версией POSIX. |
stricmp [89] | Окна | нечувствительные к регистру версии 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] Несмотря на то, что реализации этих функций с открытым исходным кодом доступны, эти функции отсутствуют в общих библиотеках C для Unix. [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) . Сноска 66 к разделу 6.4.5 . Проверено 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.
- ^ а б "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 Library . Проверено 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 Expert.com . Проверено 6 марта 2014 .
- ^ а б "strlcpy, strlcat - копирование и объединение строк с ограниченным размером" . OpenBSD . Проверено 26 мая 2016 .
- ^ а б в г Тодд С. Миллер; Тео де Раадт (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. Остерегайтесь оптимизаций компилятора» . ДИР СЕРТ C Стандарт кодирования .
- ^ - Руководство по функциям библиотеки FreeBSD
Внешние ссылки
- Быстрый memcpy на C , несколько примеров кодирования C для разных типов архитектур команд ЦП