Jump to content

Обработка строк C

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

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

Определения

[ редактировать ]

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

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

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

Строковые литералы ( "text" в исходном коде C) преобразуются в массивы во время компиляции. [2] Результатом является массив кодовых единиц, содержащий все символы плюс завершающую нулевую кодовую единицу. В С90 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++.) [4] В C++11 и C11 добавлены два типа с явной шириной. char16_t и char32_t. [5]

Кодировки переменной ширины можно использовать как в байтовых, так и в широких строках. Длина строки и смещения измеряются в байтах или 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) определена реализация, [6] и может потребоваться, чтобы исходный код был в той же кодировке, особенно для char где компиляторы могут просто скопировать все, что находится между кавычками. Некоторые компиляторы или редакторы потребуют ввода всех символов, отличных от ASCII, как \xNN последовательности для каждого байта UTF-8 и/или \uNNNN для каждого слова UTF-16. Начиная с C11 (и C++11), появился новый литеральный префикс. u8 доступен, который гарантирует UTF-8 для литерала байтовой строки, как в char foo[512] = u8"φωωβαρ";. [7] Поскольку C++20 и C23 , char8_t был добавлен тип, предназначенный для хранения символов UTF-8, а типы символьных и строковых литералов с префиксом u8 были изменены на char8_t и char8_t[] соответственно.

Терминология

[ редактировать ]

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

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

Заголовки

[ редактировать ]

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

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

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

[ редактировать ]
Имя Примечания
НУЛЕВОЙ Макрос расширяется до константы нулевого указателя ; то есть константа, представляющая значение указателя, которое гарантированно не является допустимым адресом объекта в памяти.
wchar_t Тип, используемый для кодовой единицы в «широких» строках. В Windows единственная платформа, которую можно использовать wchar_t широко, он определен как 16-битный [8] этого было достаточно для представления любого символа Юникода ( UCS-2 ), но теперь достаточно только для представления кодовой единицы UTF-16 , которая может составлять половину кодовой точки. На других платформах он определяется как 32-битный, и кодовая точка Unicode всегда соответствует. Стандарт C требует только, чтобы wchar_t должен быть достаточно широким, чтобы содержать самый широкий набор символов среди поддерживаемых системных локалей. [9] и быть больше или равным по размеру чар , [10]
зима_т Целочисленный тип, который может содержать любое значение wchar_t, а также значение макроса WEOF. Этот тип не изменяется при интегральных рекламных акциях. Обычно 32-битное значение со знаком.
char8_t [11] Часть стандарта C, начиная с C23, в <uchar.h> — тип, подходящий для хранения символов UTF-8. [12]
char16_t [13] Часть стандарта C, начиная с C11 , [14] в <uchar.h> — тип, способный хранить 16 бит, даже если wchar_t — другой размер. Если макрос __STDC_UTF_16__ определяется как 1 , тип используется для UTF-16 в этой системе. В C23 это всегда так. [15] C++ не определяет такой макрос, но этот тип всегда используется для UTF-16 на этом языке. [16]
char32_t [13] Часть стандарта C, начиная с C11, [17] в <uchar.h> — тип, способный хранить 32 бита, даже если wchar_t — другой размер. Если макрос __STDC_UTF_32__ определяется как 1 , тип используется для UTF-32 в этой системе. В C23 это всегда так. [15] C++ не определяет такой макрос, но этот тип всегда используется для UTF-32 на этом языке. [16]
mbstate_t Содержит всю информацию о состоянии преобразования, необходимую для перехода от одного вызова функции к другому.
Байт
нить
Широкий
нить
Описание [примечание 1]
Нить
манипуляция
стркпи [18] wcscpy [19] Копирует одну строку в другую
стрнкпи [20] wcsncpy [21] Записывает ровно n байт, копируя из источника или добавляя нули
облажался [22] wcscat [23] Добавляет одну строку к другой
стрнкат [24] wcsncat [25] Добавляет не более n байт из одной строки в другую.
strxfrm [26] wcsxfrm [27] Преобразует строку в соответствии с текущей локалью
Нить
обследование
стрлен [28] wcslen [29] Возвращает длину строки
стркмп [30] wcscmp [31] Сравнивает две строки ( трехстороннее сравнение )
стрнкмп [32] wcsncmp [33] Сравнивает определенное количество байтов в двух строках
стрколл [34] wcscoll [35] Сравнивает две строки в соответствии с текущей локалью
стрхр [36] туалет [37] Находит первое вхождение байта в строку
стррчр [38] вксрхр [39] Находит последнее вхождение байта в строку
стрспн [40] wcsspn [41] Возвращает количество начальных байтов строки, находящихся во второй строке.
стркспн [42] вкскспн [43] Возвращает количество начальных байтов в строке, которых нет во второй строке.
стрпбрк [44] вкспбрк [45] Находит в строке первое вхождение байта в наборе
стрстр [46] wcsstr [47] Находит первое вхождение подстроки в строке
стрток [48] Всток [49] Разбивает строку на токены
Разнообразный ошибка [50] Возвращает строку, содержащую сообщение, полученное на основе кода ошибки.
Память
манипуляция
Мемсет [51] wmemset [52] Заполняет буфер повторяющимся байтом. Начиная с C23 , memset_explicit() был добавлен для удаления конфиденциальных данных.
память [53] wmemcpy [54] Копирует один буфер в другой. Начиная с C23 , memccpy() был добавлен для эффективного объединения строк.
переместить [55] wmemmove [56] Копирует один буфер в другой, возможно, перекрывающийся буфер.
мемкмп [57] wmemcmp [58] Сравнивает два буфера (трехстороннее сравнение)
мемхр [59] wmemchr [60] Находит первое вхождение байта в буфере
  1. ^ Для функций широких строк замените wchar_t для «байта» в описании

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

[ редактировать ]
Имя Описание
мблен [61] Возвращает количество байтов в следующем многобайтовом символе.
mbtowc [62] Преобразует следующий многобайтовый символ в широкий символ.
Вгробница [63] Преобразует широкий символ в его многобайтовое представление.
mbstowcs [64] Преобразует многобайтовую строку в широкую строку
туалеты [65] Преобразует широкую строку в многобайтовую строку
кстати [66] Преобразует однобайтовый символ в широкий символ, если это возможно.
wctob [67] Преобразует широкий символ в однобайтовый символ, если это возможно.
поддерживать [68] Проверяет, представляет ли объект состояния исходное состояние.
мбрлен [69] Возвращает количество байтов в следующем многобайтовом символе в заданном состоянии.
mbrtowc [70] Преобразует следующий многобайтовый символ в широкий символ в заданном состоянии.
гробница [71] Преобразует широкий символ в его многобайтовое представление в заданном состоянии.
mbsrtowcs [72] Преобразует многобайтовую строку в широкую строку по заданному состоянию.
wcsrtombs [73] Преобразует широкую строку в многобайтовую строку по заданному состоянию.
обложка8 [74] Преобразует следующий многобайтовый символ в символ UTF-8 по заданному состоянию.
c8rtomb [75] Преобразует одну кодовую точку из UTF-8 в узкое многобайтовое представление символов по заданному состоянию.
mbrtoc16 [76] Преобразует следующий многобайтовый символ в символ UTF-16 по заданному состоянию.
c16rtomb [77] Преобразует одну кодовую точку из UTF-16 в узкое многобайтовое представление символов по заданному состоянию.
mbrtoc32 [78] Преобразует следующий многобайтовый символ в символ UTF-32 по заданному состоянию.
c32rtomb [79] Преобразует одну кодовую точку из UTF-32 в узкое многобайтовое представление символов по заданному состоянию.

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

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

[ редактировать ]
Байт
нить
Широкий
нить
Описание [примечание 1]
atof [83] преобразует строку в значение с плавающей запятой («atof» означает «ASCII в число с плавающей запятой»)
трейлер
атолл
атолл [84]
преобразует строку в целое число ( C99 ) («atoi» означает «ASCII в целое число»)
стртоф ( C99 ) [85]
стртод [86]
стртольд ( C99 ) [87]
wcstof ( C99 ) [88]
вкстод [89]
wcstold ( C99 ) [90]
преобразует строку в значение с плавающей запятой
прогулка
стролл [91]
туалет
wcstoll [92]
преобразует строку в целое число со знаком
стртул
стртулл [93]
туалет
wcstoll [94]
преобразует строку в целое число без знака
  1. ^ Здесь строка относится либо к байтовой строке, либо к широкой строке.

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

Функции strchr, bsearch, strpbrk, strrchr, strstr, memchr и их широкие аналоги не являются const-корректными , поскольку они принимают const строковый указатель и вернуть не- const указатель внутри строки. Это было исправлено в C23 . [95]

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

[ редактировать ]
Имя Платформа Описание
ноль [97] [98] ПОСИКС , БСД Заполняет буфер нулевыми байтами, считается устаревшим Мемсет
мемкпи [99] СВИД , POSIX Часть стандарта C, начиная с C23 , копирует между двумя непересекающимися областями памяти, останавливаясь при обнаружении заданного байта.
мемпкпи [100] ГНУ вариант memcpy возвращает указатель на байт, следующий за последним записанным байтом
strcasecmp [101] ПОСИКС, БСД версии без учета регистра стркмп
strcat_s [102] Окна вариант strcat , который проверяет размер целевого буфера перед копированием
strcpy_s [103] Окна вариант strcpy , который проверяет размер целевого буфера перед копированием
стрдуп и стрндуп [104] ПОСИКС Часть стандарта C, начиная с C23, выделяет и дублирует строку.
strerror_r [105] ПОСИКС 1, ГНУ вариант strerror , который является потокобезопасным. Версия GNU несовместима с версией POSIX.
стрикмп [106] Окна версии без учета регистра стркмп
стрлкпи [107] БСД, Солярис вариант strcpy , который усекает результат, чтобы он поместился в целевой буфер [108]
strlcat [107] БСД, Солярис вариант strcat , который усекает результат, чтобы он поместился в целевой буфер [108]
стрсигнал [109] ПОСИКС:2008 возвращает строковое представление кода сигнала . Не потокобезопасный.
strtok_r [110] ПОСИКС вариант strtok , который является потокобезопасным

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

Самый популярный [а] замена - это strlcat и strlcpy функции, появившиеся в OpenBSD 2.4 в декабре 1998 года. [108] Эти функции всегда записывают один NUL в целевой буфер, усекая результат при необходимости и возвращая размер буфера, который может потребоваться, что позволяет обнаружить усечение и предоставляет размер для создания нового буфера, который не будет усекаться. Их критиковали за якобы неэффективность. [111] поощрение использования строк C (вместо какой-либо альтернативной формы строк), [112] [113] и скрытие других потенциальных ошибок. [114] [115] Следовательно, в течение многих лет они не были включены в библиотеку GNU C (используемую программным обеспечением в Linux), хотя ситуация и была изменена. В FAQ по glibc Wiki о включении strlc{py|at} отмечается, что начиная с glibc 2.38 код был зафиксирован. [116] и тем самым добавил. [117] В объявлении о доступности glibc 2.38 говорилось, что эти функции «ожидается, будут добавлены в будущую версию POSIX». ( Отслеживание дефектов Austin Group, ID 986, отслеживало некоторые дискуссии о таких планах для POSIX.) Несмотря на то, что в glibc не была добавлена ​​поддержка, strlcat и strlcpy были реализованы в ряде других библиотек C, включая библиотеки для OpenBSD, FreeBSD , NetBSD , Solaris , OS X и QNX , а также в альтернативных библиотеках C для Linux, таких как libbsd , представленных в 2008 году, [118] и musl , представленные в 2011 году. [119] [120] Отсутствие поддержки библиотеки GNU C не помешало различным авторам программного обеспечения использовать ее и включать замену, среди других SDL , GLib , ffmpeg , rsync и даже внутри ядра Linux . Доступны реализации этих функций с открытым исходным кодом. [121] [122]

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

В рамках жизненного цикла разработки безопасности 2004 года Microsoft представила семейство «безопасных» функций, включая strcpy_s и strcat_s (вместе со многими другими). [123] Эти функции были стандартизированы с некоторыми незначительными изменениями как часть дополнительного C11 (Приложение K), предложенного ISO/IEC WDTR 24731. Эти функции выполняют различные проверки, включая проверку того, не является ли строка слишком длинной для размещения в буфере. Если проверки не пройдены, вызывается определяемая пользователем функция «обработчик ограничений времени выполнения». [124] который обычно прерывает программу. [125] [126] Некоторые функции выполняют разрушительные операции перед вызовом обработчика ограничений времени выполнения; например, strcat_s устанавливает пункт назначения в пустую строку, [127] что может затруднить восстановление после ошибок или их отладку. начал выдавать предупреждающие сообщения, Эти функции вызвали серьезную критику, поскольку изначально они были реализованы только в Windows, и в то же время Microsoft Visual C++ предлагающие использовать эти функции вместо стандартных. Некоторые полагают, что это попытка Microsoft привязать разработчиков к своей платформе. [128] Хотя доступны реализации этих функций с открытым исходным кодом, они отсутствуют в обычных библиотеках C для Unix. [129] Опыт работы с этими функциями показал значительные проблемы с их принятием и ошибки в использовании, поэтому предлагается удалить Приложение K для следующей версии стандарта C. [130] Использование memset_s также предлагалось как способ избежать нежелательной оптимизации компилятора. [131] [132]

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ На GitHub зарегистрировано 7 813 206 вариантов использования. strlcpy, по сравнению с 38 644 использованиями strcpy_s (и 15 286 150 использований strcpy). [ нужна ссылка ]
  1. Перейти обратно: Перейти обратно: а б с «Черновик стандарта C99 + TC3» (PDF) . §7.1.1p1 . Проверено 7 января 2011 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  2. ^ «Черновик стандарта C99 + TC3» (PDF) . §6.4.5p7 . Проверено 7 января 2011 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  3. ^ «Черновик стандарта C99 + TC3» (PDF) . Раздел 6.4.5, сноска 66 . Проверено 7 января 2011 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  4. ^ «Снизить требования к wchar_t, чтобы они соответствовали существующей практике» (PDF) .
  5. ^ «Основные типы» . ru.cppreference.com .
  6. ^ «Черновик стандарта C99 + TC3» (PDF) . §5.1.1.2 Фазы трансляции , п1 . Проверено 23 декабря 2011 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  7. ^ «строковые литералы» . ru.cppreference.com . Проверено 23 декабря 2019 г.
  8. ^ «С++ — Каково использование wchar_t в общем программировании?» . Переполнение стека . Проверено 1 августа 2022 г.
  9. ^ «stddef.h — стандартные определения типов» . Открытая группа . Проверено 28 января 2017 г.
  10. ^ Гиллам, Ричард (2003). Демистификация Unicode: Практическое руководство программиста по стандарту кодирования . Аддисон-Уэсли Профессионал. п. 714. ИСБН  9780201700527 .
  11. ^ «char, wchar_t, char8_t, char16_t, char32_t» . docs.microsoft.com . Проверено 1 августа 2022 г.
  12. ^ "char8_t" .
  13. Перейти обратно: Перейти обратно: а б "<cuchar> (uchar.h)" .
  14. ^ "char16_t" .
  15. Перейти обратно: Перейти обратно: а б «Замена текстовых макросов» .
  16. Перейти обратно: Перейти обратно: а б «Основные типы» .
  17. ^ "char32_t" .
  18. Перейти обратно: Перейти обратно: а б «strcpy — cppreference.com» . En.cppreference.com. 2 января 2014 года . Проверено 6 марта 2014 г.
  19. ^ «wcscpy — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  20. ^ «strncpy — cppreference.com» . En.cppreference.com. 4 октября 2013 года . Проверено 6 марта 2014 г.
  21. ^ «wcsncpy — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  22. Перейти обратно: Перейти обратно: а б «strcat — cppreference.com» . En.cppreference.com. 8 октября 2013 года . Проверено 6 марта 2014 г.
  23. ^ «wcscat — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  24. ^ «strncat — cppreference.com» . En.cppreference.com. 1 июля 2013 года . Проверено 6 марта 2014 г.
  25. ^ «wcsncat — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  26. ^ «strxfrm — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  27. ^ «wcsxfrm — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  28. ^ «strlen — cppreference.com» . En.cppreference.com. 27 декабря 2013 года . Проверено 6 марта 2014 г.
  29. ^ «wcslen — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  30. ^ «strcmp — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  31. ^ «wcscmp — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  32. ^ «strncmp — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  33. ^ «wcsncmp — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  34. ^ «strcoll — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  35. ^ «wcscoll — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  36. ^ «strchr — cppreference.com» . En.cppreference.com. 23 февраля 2014 года . Проверено 6 марта 2014 г.
  37. ^ «wcschr — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  38. ^ «strrchr — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  39. ^ «wcsrchr — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  40. ^ «strspn — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  41. ^ «wcsspn — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  42. ^ «strcspn — cppreference.com» . En.cppreference.com. 31 мая 2013 года . Проверено 6 марта 2014 г.
  43. ^ «wcscspn — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  44. ^ «strpbrk — cppreference.com» . En.cppreference.com. 31 мая 2013 года . Проверено 6 марта 2014 г.
  45. ^ «wcspbrk — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  46. ^ «strstr — cppreference.com» . En.cppreference.com. 16 октября 2013 года . Проверено 6 марта 2014 г.
  47. ^ «wcsstr — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  48. ^ «strtok — cppreference.com» . En.cppreference.com. 3 сентября 2013 года . Проверено 6 марта 2014 г.
  49. ^ «wcstok — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  50. ^ «strerror — cppreference.com» . En.cppreference.com. 31 мая 2013 года . Проверено 6 марта 2014 г.
  51. ^ «memset — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  52. ^ «wmemset — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  53. Перейти обратно: Перейти обратно: а б «memcpy — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  54. ^ «wmemcpy — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  55. Перейти обратно: Перейти обратно: а б «memmove — cppreference.com» . En.cppreference.com. 25 января 2014 года . Проверено 6 марта 2014 г.
  56. ^ «wmemmove — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  57. ^ «memcmp — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  58. ^ «wmemcmp — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  59. ^ «memchr — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  60. ^ «wmemchr — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  61. ^ «mblen — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  62. ^ «mbtowc — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  63. ^ «wctomb — cppreference.com» . En.cppreference.com. 4 февраля 2014 года . Проверено 6 марта 2014 г.
  64. ^ «mbstowcs — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  65. ^ «wcstombs — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  66. ^ «btowc — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  67. ^ «wctob — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  68. ^ «mbsinit — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  69. ^ «mbrlen — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  70. ^ «mbrtowc — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  71. ^ «wcrtomb — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  72. ^ «mbsrtowcs — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  73. ^ «wcsrtombs — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  74. ^ «mbrtoc8 — cppreference.com» . En.cppreference.com.
  75. ^ «c8rtomb — cppreference.com» . En.cppreference.com.
  76. ^ «mbrtoc16 — cppreference.com» . En.cppreference.com.
  77. ^ «c16rtomb — cppreference.com» . En.cppreference.com.
  78. ^ «mbrtoc32 — cppreference.com» . En.cppreference.com.
  79. ^ «c23rtomb — cppreference.com» . En.cppreference.com.
  80. ^ «6.3.2 Представление состояния преобразования» . Библиотека GNU C. Проверено 31 января 2017 г.
  81. ^ "root/src/multibyte/c16rtomb.c" . Проверено 31 января 2017 г.
  82. ^ «Содержимое /stable/11/lib/libc/locale/c16rtomb.c» . Проверено 31 января 2017 г.
  83. ^ «atof — cppreference.com» . En.cppreference.com. 31 мая 2013 года . Проверено 6 марта 2014 г.
  84. ^ «атои, атолл, атолл — cppreference.com» . En.cppreference.com. 18 января 2014 года . Проверено 6 марта 2014 г.
  85. ^ «strtof, strtod, strtold — cppreference.com» . En.cppreference.com. 4 февраля 2014 года . Проверено 6 марта 2014 г.
  86. ^ «strtof, strtod, strtold — cppreference.com» . En.cppreference.com. 4 февраля 2014 года . Проверено 6 марта 2014 г.
  87. ^ «strtof, strtod, strtold — cppreference.com» . En.cppreference.com. 4 февраля 2014 года . Проверено 6 марта 2014 г.
  88. ^ «wcstof, wcstod, wcstold — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  89. ^ «wcstof, wcstod, wcstold — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  90. ^ «wcstof, wcstod, wcstold — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  91. ^ «strtol, strtoll — cppreference.com» . En.cppreference.com. 4 февраля 2014 года . Проверено 6 марта 2014 г.
  92. ^ «wcstol, wcstoll — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  93. ^ «strtoul, strtoull — cppreference.com» . En.cppreference.com. 4 февраля 2014 года . Проверено 6 марта 2014 г.
  94. ^ «wcstoul, wcstoull — cppreference.com» . En.cppreference.com . Проверено 6 марта 2014 г.
  95. ^ «WG14-N3020: Функции стандартной библиотеки, сохраняющие квалификаторы, v4» (PDF) . open-std.org . 13 июня 2022 г.
  96. ^ Обоснование C99, 7.20.1.1
  97. ^ «бзеро» . Открытая группа . Проверено 27 ноября 2017 г.
  98. ^ "бноль(3)" . OpenBSD . Проверено 27 ноября 2017 г.
  99. ^ "мемкпи" . Pubs.opengroup.org . Проверено 6 марта 2014 г.
  100. ^ «mempcpy(3) — страница руководства Linux» . Кернел.орг . Проверено 6 марта 2014 г.
  101. ^ «strcasecmp(3) — страница руководства Linux» . Кернел.орг . Проверено 6 марта 2014 г.
  102. ^ «strcat_s, wcscat_s, _mbscat_s» . docs.microsoft.com . Проверено 22 апреля 2022 г.
  103. ^ «strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l» . docs.microsoft.com . Проверено 22 апреля 2022 г.
  104. ^ "стрдуп" . Pubs.opengroup.org . Проверено 6 марта 2014 г.
  105. ^ «strerror(3) — страница руководства Linux» . man7.org . Проверено 3 ноября 2019 г.
  106. ^ «Строка | стрикмп()» . Programming Expert.com . Проверено 6 марта 2014 г.
  107. Перейти обратно: Перейти обратно: а б «strlcpy, strlcat — копирование и объединение строк с ограничением по размеру» . OpenBSD . Проверено 26 мая 2016 г.
  108. Перейти обратно: Перейти обратно: а б с д Тодд С. Миллер; Тео де Раадт (1999). «strlcpy и strlcat — согласованное, безопасное копирование и конкатенация строк» . УСЕНИКС '99.
  109. ^ "стрсигнал" . Pubs.opengroup.org . Проверено 6 марта 2014 г.
  110. ^ "стрток" . Pubs.opengroup.org . Проверено 6 марта 2014 г.
  111. ^ Миллер, Дэмиен (октябрь 2005 г.). «Безопасная переносимость» (PDF) . Проверено 26 июня 2016 г. Этот API [strlcpy и strlcat] принят большинством современных операционных систем и многими автономными программными пакетами [...]. Заметным исключением является стандартная библиотека C GNU, glibc, чей сопровождающий упорно отказывается включать эти улучшенные API, называя их «ужасно неэффективной чушью BSD», несмотря на предварительные доказательства того, что в большинстве случаев они быстрее, чем API, которые они заменяют.
  112. ^ Список рассылки libc-alpha. Архивировано 9 июня 2007 г. на Wayback Machine , избранные сообщения из ветки от 8 августа 2000 г.: 53 , 60 , 61.
  113. ^ Взлёты и падения strlcpy(); LWN.net
  114. ^ «Добавление strlcpy() в glibc» . lwn.net . Правильная обработка строк означает, что вы всегда знаете длину ваших строк и, следовательно, можете использовать memcpy (вместо strcpy).
  115. ^ strlcpy(3) Linux по библиотечным функциям Руководство «Однако можно усомниться в обоснованности такой оптимизации, поскольку она противоречит всей цели strlcpy() и strlcat(). На самом деле, первая версия этой страницы руководства содержала ошибки».
  116. ^ strlc{py|at} совершить коммит
  117. ^ [1]
  118. ^ «либсд» . Проверено 21 ноября 2022 г.
  119. ^ "root/src/string/strlcpy.c" . Проверено 28 января 2017 г.
  120. ^ "root/src/string/strlcat.c" . Проверено 28 января 2017 г.
  121. ^ Тодд С. Миллер. "strlcpy.c" . Перекрестная ссылка BSD .
  122. ^ Тодд С. Миллер. "strlcat.c" . Перекрестная ссылка BSD .
  123. ^ Ловелл, Мартин. «Отражение атак на ваш код с помощью безопасных библиотек Visual Studio 2005 C и C++» . Проверено 13 февраля 2015 г.
  124. ^ «Проект стандарта C11» (PDF) . §К.3.1.4п2 . Проверено 13 февраля 2013 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  125. ^ «Проект стандарта C11» (PDF) . §К.3.6.1.1п4 . Проверено 13 февраля 2013 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  126. ^ «Проверка параметров» .
  127. ^ «Проект стандарта C11» (PDF) . §К.3.7.2.1п4 . Проверено 13 февраля 2013 г. {{cite web}}: CS1 maint: местоположение ( ссылка )
  128. ^ Дэнни Калев. «Они снова в деле» . ИнформИТ. Архивировано из оригинала 15 января 2012 года . Проверено 10 ноября 2011 г.
  129. ^ Безопасная библиотека C. «Библиотека Safe C обеспечивает связанную проверку памяти и строковые функции в соответствии с ISO/IEC TR24731» . Сорсфордж . Проверено 6 марта 2013 г.
  130. ^ «Опыт работы с Приложением K — Интерфейсы проверки границ» . Проверено 5 ноября 2015 г.
  131. ^ «MSC06-C. Остерегайтесь оптимизации компилятора» . SEI CERT Стандарт кодирования C.
  132. ^ memset_s(3) FreeBSD функциям библиотеки Руководство по
[ редактировать ]
  • Быстрая memcpy на C , несколько примеров кодирования на C для различных типов архитектур инструкций ЦП.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 236f6d93bc9c044c7f5bfd5e67c9ef2c__1718459820
URL1:https://arc.ask3.ru/arc/aa/23/2c/236f6d93bc9c044c7f5bfd5e67c9ef2c.html
Заголовок, (Title) документа по адресу, URL1:
C string handling - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)