Вы находитесь на странице: 1из 2862

Оставьте отзыв о скачивании PDF-файла.

Справочник по библиотеке среды


выполнения Microsoft C (CRT)
Статья • 03.04.2023

Библиотека среды выполнения Майкрософт предоставляет процедуры


программирования операционной системы Microsoft Windows. Эти подпрограммы
автоматизируют многие распространенные задачи программирования, которые не
предоставляются языками C и C++.

Примеры программ включены в отдельные справочные статьи для большинства


подпрограмм в библиотеке.

В этом разделе
Подпрограммы универсальной среды выполнения C по категориям

Предоставляет ссылки на библиотеку среды выполнения по категориям.

Глобальные переменные и стандартные типы

Предоставляет ссылки на глобальные переменные и стандартные типы,


предоставляемые библиотекой среды выполнения.

Глобальные константы

Предоставляет ссылки на глобальные константы, определенные библиотекой


среды выполнения.

Глобальное состояние

Описывает область глобального состояния в библиотеке среды выполнения C.

Универсальные текстовые сопоставления

Содержит ссылки на универсальные текстовые сопоставления, определенные в


файле Tchar.h.

Алфавитный указатель функций

Ссылки на функции библиотеки среды выполнения C, упорядоченные по алфавиту.

Общие сведения о семействе функций

Ссылки на функции библиотеки среды выполнения C, упорядоченные по семейству


функций.

Строки языка и страны и региона

Описывает способы использования функции setlocale для задания языка и строк


страны или региона.

Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib

Список файлов, составляющих .lib библиотеки среды выполнения C и связанные


с ними параметры компилятора и директивы препроцессора.

Связанные разделы
Подпрограммы отладки

Содержит ссылки на отладочные версии подпрограмм библиотеки времени


выполнения.

Проверка ошибок во время выполнения

Ссылки на функции, поддерживающие проверки ошибок среды выполнения.

Библиотеки DLL и поведение библиотеки среды выполнения Visual C++

Описание точки входа и кода запуска, используемого для DLL.

Отладка

Ссылки на разделы, описывающие использование отладчика Visual Studio для


устранения логических ошибок в приложениях и хранимых процедурах.
Совместимость
Статья • 03.04.2023

Универсальная библиотека среды выполнения C (UCRT) поддерживает большую


часть стандартной библиотеки C, необходимой для соответствия C++. Она
реализует библиотеку C99 (ISO/IEC 9899:1999) с определенными исключениями:

строгая совместимость типов в <complex.h>.


aligned_alloc , который, вероятно, не будет реализован, так как операционная

система Windows не поддерживает выровненные выделения. Вместо этого


используйте нестандартный _aligned_malloc .
strerrorlen_s
атомарная поддержка в <stdatomic.h>
Поддержка потоков в <threads.h>

UCRT также реализует большое подмножество POSIX.1 (ISO/IEC 9945-1:1996, api


POSIX System Application Program Interface) C. Однако он не полностью
соответствует любому конкретному стандарту POSIX. UCRT также реализует
несколько функций и макросов майкрософт, которые не являются частью
стандарта.

Функции, относящиеся к реализации Майкрософт Visual C++, находятся в


библиотеке vcruntime. Многие из этих функций предназначены для внутреннего
использования и не могут вызываться пользовательским кодом. Некоторые
предназначены для использования при отладке и проверке совместимости
реализаций.

Стандартная библиотека C++ резервирует имена, которые начинаются с символа


подчеркивания в глобальном пространстве имен, в реализации. Функции POSIX и
функции библиотеки среды выполнения майкрософт находятся в глобальном
пространстве имен, но не являются частью стандартной библиотеки среды
выполнения C. Именно поэтому предпочтительные реализации этих функций
Майкрософт имеют начальное подчеркивание. Для переносимости библиотека
UCRT также поддерживает имена по умолчанию, но компилятор Microsoft C++
выдает предупреждение об устаревании при компиляции кода, который
использует их. Не рекомендуется использовать только имена по умолчанию, а не
сами функции. Чтобы подавить предупреждение, задайте _CRT_NONSTDC_NO_WARNINGS
перед включением каких-либо заголовков в код, использующий исходные имена
POSIX. Так как стандарт C не допускает нестандартные имена в файлах заголовков,
по умолчанию и /std:c17 не предоставляют имена по умолчанию /std:c11 для
функций, типов и макросов POSIX. Если эти имена необходимы, определите
_CRT_DECLARE_NONSTDC_NAMES их для их предоставления.

Про некоторые функции в стандартной библиотеке C известно, что имеется


тенденция к их небезопасному использованию из-за неправильно используемых
параметров и непроверенных буферов. Эти функции часто являются источником
проблем с безопасностью в коде. Корпорация Майкрософт создала набор более
безопасных версий этих функций, которые проверяют использование параметров.
Они вызывают обработчик недопустимых параметров при обнаружении проблемы
во время выполнения. По умолчанию компилятор Microsoft C++ выдает
предупреждение об устаревании, когда используется функция, для которой
имеется более безопасный вариант. При компиляции кода как C++можно
определить _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES как 1, чтобы исключить
большинство предупреждений. Этот макрос позволяет перегрузкам шаблонов
вызывать более безопасные варианты, сохраняя переносимый исходный код.
Чтобы подавить предупреждение, определите _CRT_SECURE_NO_WARNINGS перед тем,
как включить какие-либо заголовки в код, который использует эти функции.
Дополнительные сведения см. в разделе "Функции безопасности" в CRT.

За исключением указанного в документации по конкретным функциям библиотека


UCRT совместима с Windows API. Некоторые функции не поддерживаются в
Магазине Windows или приложениях универсальная платформа Windows (UWP).
Эти функции перечислены в функциях CRT, которые не поддерживаются в
универсальная платформа Windows приложениях.

Связанные статьи
Заголовок Описание

Приложения UWP, среда Описывает, когда подпрограммы UCRT несовместимы с


выполнения Windows и среда универсальными приложениями для Windows или
выполнения C приложениями Microsoft Store.

Соответствие стандарту ANSI Описывает стандартные имена в UCRT.


C

UNIX Рекомендации по переносу программ в UNIX.

Платформы Windows (CRT) Перечисление операционных систем, поддерживающих


CRT.

Обратная совместимость Описание сопоставлений старых имен CRT с новыми.


Заголовок Описание

C runtime (CRT) и C++ Общие сведения о файлах библиотеки CRT (LIB) и


Standard Library (STL) .lib files соответствующих параметрах компилятора.
Приложения UWP, среда выполнения
Windows и среда выполнения C
Статья • 03.04.2023

приложения универсальная платформа Windows (UWP) — это программы, которые


выполняются в среда выполнения Windows, который выполняется на Windows 8 и
более поздних версиях. Среда выполнения Windows — это надежное окружение,
контролирующее функции, переменные и ресурсы, доступные приложению UWP.
Но эта среда намеренно содержит ограничения, не позволяющие использовать в
приложениях UWP большинство функций библиотеки времени выполнения C
(CRT).

Приложения UWP не поддерживают следующие функции CRT:

Большая часть функций CRT, связанных с неподдерживаемой


функциональностью.

Например, приложение UWP не может создать процесс с помощью exec


процедур и spawn семейств процедур.

Если функция CRT не поддерживается в приложении UWP, этот факт


отмечается в своей справочной статье.

Большая часть функций, работающих с многобайтовыми символами и


строками.

Однако тексты Юникод и ANSI поддерживаются.

Переменные среды.

Понятие текущего рабочего каталога.

Приложения и DLL-библиотеки UWP, которые имеют статическую связь с CRT


и сборка которых выполняется с использованием параметров компилятора
/MT или /MTd .

Это означает, что приложение использует многопоточную статическую


версию CRT.

Приложения, которые создаются с использованием параметра компилятора


/MDd.
То есть, отладочная, многопоточная и DLL-специфичная версия CRT. Такое
приложение не поддерживается в среда выполнения Windows.

Полный список функций CRT, недоступных в приложении UWP и предложениях для


альтернативных функций, см. в статье О функциях CRT, которые не
поддерживаются в приложениях универсальная платформа Windows.

См. также раздел


Совместимость

Функции CRT, которые не поддерживаются средой выполнения Windows

Подпрограммы универсальной среды выполнения C по категориям

Создание консольного приложения для универсальной платформы Windows


Соответствие ANSI C
Статья • 03.04.2023

Соглашение об именовании для всех идентификаторов майкрософт в системе


времени выполнения (например, функций, макросов, констант, переменных и
определений типов) соответствует стандартам ANSI/ISO C. В этой документации
любая функция времени выполнения, которая соответствует стандартам ANSI/ISO
C, помечена как ANSI-совместимая. Приложения, совместимые с ANSI, должны
использовать только эти совместимые функции ANSI.

Имена функций и глобальных переменных, которые относятся к системам


Microsoft, начинаются с одного символа подчеркивания. Эти имена можно
переопределять только локально, в области действия своего кода. Например, при
включении файлов заголовков времени выполнения Microsoft можно локально
переопределить функцию для систем Microsoft с именем _open , объявив
локальную переменную с таким же именем. Однако это имя нельзя использовать
для собственной глобальной функции или глобальной переменной.

Имена относящихся к системам Microsoft макросов и констант манифеста


начинаются с двух символов подчеркивания или с одного ведущего символа
подчеркивания с идущей за ним прописной буквой. Область таких
идентификаторов является абсолютной. Например, по этой причине нельзя
использовать идентификатор _UPPER майкрософт.

См. также раздел


Совместимость
UNIX
Статья • 03.04.2023

Если планируется переносить программы в среду UNIX, придерживайтесь


следующих правил:

Не удаляйте файлы заголовков из подкаталога SYS. Файлы заголовков SYS


можно поместить в другое место, только если вы не планируете переносить
программы в UNIX.

Используйте UNIX-совместимый разделитель пути в подпрограммах,


принимающие в качестве аргументов строки, представляющие пути и имена
файлов. UNIX поддерживает только косую черту (/), но операционные
системы Win32 поддерживают обратную косую черту (\) и косую черту (/). В
этой документации, например, в #include инструкциях в качестве
разделителей пути используются совместимые с UNIX косые черты. (Однако
командная оболочка операционной системы Windows, CMD.EXE, не
поддерживает косую черту в командах, введенных в командной строке.)

Используйте пути и имена файлов, которые правильно работают в UNIX с


учетом регистра. Файловая система таблицы выделения файлов (FAT) в
операционных системах Win32 не учитывает регистр. Файловая система NTFS
сохраняет регистр для списков каталогов, но игнорирует регистр при поиске
по файлам и других системных операциях.

7 Примечание

В этой версии Visual C++ информация о совместимости с UNIX была удалена


из описаний функций.

См. также раздел


Совместимость
Платформы Windows (CRT)
Статья • 03.04.2023

Библиотеки времени выполнения C для Visual Studio поддерживают все версии


Windows и Windows Server, которые по-прежнему поддерживаются в расширенной
поддержке. Библиотеки доступны для x86, x64 и ARM64. Все эти операционные
системы поддерживают API для классических приложений Windows (Win32) и
обеспечивают поддержку Юникода. Кроме того, любое приложение Win32 может
использовать многобайтовую кодировку (MBCS).

См. также раздел


Совместимость
обратная совместимость
Статья • 03.04.2023

Для обеспечения совместимости между версиями продукта библиотека


OLDNAMES.LIB сопоставляет старые имена с новыми именами. Например, open
сопоставляется с _open . Явно выполнять компоновку с OLDNAMES.LIB необходимо
только при компиляции со следующими параметрами командной строки:

/Zl (не указывайте имя библиотеки по умолчанию из файла объекта) и /Ze

(по умолчанию: используйте расширения Майкрософт)

/link (управление компоновщиком), /NOD (отключить поиск библиотеки по

умолчанию) и /Ze

Дополнительные сведения о параметрах командной строки компилятора см. в


разделе "Параметры компилятора".

См. также раздел


Совместимость
Обязательные и необязательные
файлы заголовков
Статья • 03.04.2023

Описание каждой подпрограммы времени выполнения включает список


обязательных и необязательных включаемых файлов заголовков (.H) для этой
подпрограммы. Обязательные файлы заголовков необходимо включать, чтобы
получить объявление функции для подпрограммы, или определение,
используемое другой, вызываемой внутренне подпрограммой. Необязательные
файлы заголовков часто включаются для использования предопределенных
констант, определений типов или встроенных макросов. В следующей таблице
приведены примеры содержимого необязательных файлов заголовков:

Определение Пример

Определение Если библиотечная подпрограмма реализована в виде макроса,


макроса определение макроса может находиться в файле заголовка, отличном
от файла заголовка исходной подпрограммы. Например, макрос
_toupper определен в файле заголовка CTYPE.H, тогда как функция
toupper объявлена в STDLIB.H.

Предопределенная Многие библиотечные подпрограммы ссылаются на константы,


константа определенные в файлах заголовков. Например, подпрограмма _open
использует такие константы, как _O_CREAT , которая определена в файле
заголовка FCNTL.H.

Определение типа Некоторые библиотечные подпрограммы возвращают структуру или


принимают структуру в качестве аргумента. Например, подпрограммы
потокового ввода-вывода используют структуру типа FILE , которая
определена в STDIO.H.

Файлы заголовков библиотеки времени выполнения предоставляют объявления


функций в стиле, рекомендованном стандартом ANSI/ISO С. Компилятор выполняет
проверку типов для любой ссылки на подпрограмму, которая встретилась после
объявления соответствующей функции. Объявления функций особенно важны для
подпрограмм, которые возвращают значение некоторого типа, отличного от
используемого по умолчанию int . Подпрограммы, которые не указывают
соответствующее возвращаемое значение в объявлении, будут рассматриваться
компилятором для возврата int , что может вызвать непредвиденные результаты.
Дополнительные сведения см. в разделе "Проверка типов".
См. также раздел
C runtime (CRT) и C++ Standard Library (STL) .lib files
Файлы и потоки
Статья • 03.04.2023

Программа взаимодействует с целевой средой путем чтения и записи файлов.


Файл может представлять собой:

Набор данных, который можно считывать и записывать многократно.

Поток байт, создаваемый программой (например, конвейер).

Поток байт, полученный из периферийного устройства или отправленный на


периферийное устройство.

Последние два элемента — это интерактивные файлы. Как правило, файлы


являются основным способом взаимодействия с программой. Вы управляете всеми
этими типами файлов точно так же: путем вызова функций библиотеки. Для
объявления большинства этих функций необходимо включать стандартный
заголовок STDIO.H.

Перед выполнением большинства операций над файлом его необходимо открыть.


Открытие файла связывает его с потоком — структурой данных в стандартной
библиотеке C, которая сглаживает большинство различий между файлами
различных типов. Библиотека поддерживает состояние каждого потока в объекте
типа FILE.

Перед запуском программы целевая среда открывает три файла. Файл можно
открыть, вызвав функциюfopen_wfopen библиотеки с двумя аргументами. (Функция
fopen устарела, используйтеfopen_s_wfopen_s вместо нее.) Первый аргумент — это

имя файла. Вторым аргументом является строка C, определяющая:

предполагается ли считывание данных из файла или запись в него данных


(либо и то, и другое);

Планируется ли создать новое содержимое для файла (или создать файл, если
он ранее не существовал) или оставить существующее содержимое.

может ли запись в файл изменить существующее содержимое или следует


только добавить байты в конец файла;

с текстовым потоком или двоичным потоком требуется работать.

После того как файл успешно открыт, можно определить, является ли поток
ориентированным на байты (байтовым потоком), или ориентированным на
расширенные символы (расширенный поток). Поток изначально несвязан. Вызов
некоторых функций для работы над потоком делает его байтовым, тогда как
некоторые другие функции делают его расширенным. После установки поток
сохраняет свою ориентацию до тех пор, пока он не будет закрыт вызовом fclose
или freopen.

© 1989-2001 P.J. Plauger и Джим Броди. Все права защищены.

См. также раздел


Текстовые и двоичные потоки

Байтовые и широкие потоки

Управление потоками

Состояния потока
Текстовые и двоичные потоки
Статья • 03.04.2023

Текстовый поток состоит из одной или нескольких строк текста, которые можно
вывести на ориентированный на текст дисплей, чтобы их можно было прочитать.
При чтении из текстового потока программа считывает новую строку в конце
каждой строки. При записи в текстовый поток программа записывает новую
строку, чтобы сигнализировать о конце строки. Для сопоставления различных
соглашений о представлении текста в файлах в различных целевых средах
библиотечные функции могут изменять количество и представление символов,
передаваемых между программой и текстовым потоком.

Размещение в текстовом потоке ограничено. Вы можете получить текущий


индикатор положения файла, вызвав fgetpos или ftell. Текстовый поток можно
разместить в позиции, полученной таким образом, или в начале или конце потока,
вызвав fsetpos или fseek. Любое другое изменение позиции может не
поддерживаться.

Для максимальной переносимости программа не должна записывать:

Пустые файлы.
Пробельные символы в конце строки.
Частичные строки (опустив новую строку в конце файла).
Символы, отличные от печатных символов, новой строки и горизонтальной
вкладки.

Если следовать этим правилам, последовательность символов, прочитанных из


текстового потока, будет соответствовать последовательности записанных
символов, будь то как байты, так и многобайтовые символы. В противном случае
библиотечные функции могут удалить создаваемый файл, если в момент закрытия
он был пуст. Кроме того, они могут изменять или удалять символы, записываемые в
файл.

Двоичный поток состоит из одного или нескольких байтов произвольных данных.


Можно записать значение, хранящееся в произвольном объекте, в двоичный
(ориентированный на байты) поток и считать в точности те данные, которые
хранились в объекте при его записи. Функции библиотеки не изменяют байты,
передаваемые между программой и двоичным потоком. Однако они могут
добавить произвольное число байтов NULL в файл, который вы записываете с
помощью двоичного потока. Программа должна иметь дело с этими
дополнительными NULL байтами в конце двоичного потока.
Размещение в двоичном потоке четко определено, за исключением
позиционирования относительно конца потока. Можно получить и изменить
текущий индикатор позиции в файле тем же образом, что и для текстового потока.
Смещения, используемые ftell и fseek подсчитываемые байтами от начала потока
(который равен нулю байтов), поэтому целочисленные арифметические данные по
этим смещениям дают прогнозируемые результаты.

Байтовый поток обрабатывает файл как последовательность байтов. В рамках


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

См. также раздел


Файлы и потоки
Байтовые и широкие потоки
Статья • 03.04.2023

Байтовый поток обрабатывает файл как последовательность байтов. В рамках


программы поток передает эту последовательность байтов в неизменном виде.

Широкий поток, в свою очередь, представляет файл как последовательность


обобщенных символов в многобайтовой кодировке, для которых могут
использоваться различные наборы правил кодирования. (Текстовые и двоичные
файлы по-прежнему считываются и записываются, как описано выше.) В
программе поток выглядит как соответствующая последовательность расширенных
символов. Преобразования между двумя представлениями выполняются в
стандартной библиотеке C. Правила преобразования в принципе могут быть
изменены вызовом setlocale , который изменяет категорию LC_CTYPE . Каждый
широкий поток определяет свои правила преобразования в то время, когда он
становится широко ориентированным, и сохраняет эти правила, даже если
категория LC_CTYPE позже изменится.

Для широкого потока действуют те же ограничения позиционирования, что и для


текстовых потоков. Более того, индикатор положения в файле часто должен
учитывать кодировку, зависящую от состояния. Как правило, он содержит как
байтовое смещение в пределах потока, так и объект типа mbstate_t . Таким
образом, единственным надежным способом получения позиции файла в
широком потоке является вызов fgetpos, и единственным надежным способом
восстановления позиции, полученной таким образом, является вызов fsetpos.

См. также раздел


Файлы и потоки

setlocale, _wsetlocale
Управление потоками
Статья • 03.04.2023

fopen возвращает адрес объекта типа FILE . Этот адрес используется в качестве
аргумента stream в нескольких библиотечных функциях для выполнения
различных операций с открытым файлом. Для потока байтов все входные данные
происходят так, как если бы каждый символ считывается путем вызова fgetc. Все
выходные данные происходят так, как если бы каждый символ написан путем
вызова fputc. Для широкого потока все входные данные происходят так, как если
бы каждый символ считывается путем вызова fgetwc. Все выходные данные
происходят так, как если бы каждый символ написан путем вызова fputwc.

Файл можно закрыть, вызвав fclose, после чего адрес FILE объекта недопустим.

Объект FILE сохраняет состояние потока, в том числе:

Индикатор ошибки, установленный в ненулевое значение функцией,


обнаружившей ошибку чтения или записи.

Индикатор конца файла, установленный в ненулевое значение функцией,


встретившей конец файла при чтении.

Индикатор позиции файла определяет следующий байт в потоке для чтения


или записи, если файл поддерживает запросы размещения.

Состояние потока сообщает, доступен ли поток для чтения и (или) записи, а


также является ли поток непривязанным, байтовым или расширенным
символьным.

Состояние преобразования запоминает состояние любого частично


собранного или созданного обобщенного многобайтового символа и любого
состояния сдвига для последовательности байтов в файле).

Буфер файла задает адрес и размер объекта массива. Функции библиотеки


могут использовать ее для повышения производительности операций чтения
и записи в потоке.

Не изменяйте значения, хранящиеся в объекте FILE или в буфере файлов, которые


вы указываете для использования с этим объектом. Невозможно скопировать FILE
объект и переносить адрес копии в качестве stream аргумента в функцию
библиотеки.
См. также раздел
Файлы и потоки
Состояния потока
Статья • 03.04.2023

Допустимые состояния и переходы состояний для потока показаны на следующем


рисунке.

Каждый из кругов обозначает устойчивое состояние. Каждая из линий задает


переход, который может возникать в результате вызова функции, работающей в
потоке. Пять групп функций могут вызвать переходы состояний.

Функции в первых трех группах объявляются в <stdio.h>:

Функции чтения байтов: , , , , , , getchar, getsscanfи


getcfscanffreadfgetsfgetcungetc

Функции записи байтов: fprintf, , , fputsfwrite, printf, putc, putchar, putsvfprintfи


fputcvprintf

Функции положения: fflush, , fseekfsetposиrewind

Функции в оставшихся двух группах объявляются в <wchar.h>:

Расширенные функции чтения: fgetwc, fgetws, fwscanf, getwc, , getwchar,


ungetwcи wscanf,

Функции широкой записи: fwprintf, fputwc, fputws, putwc, , putwchar, vfwprintf,


vwprintfи wprintf,
Схема состояний показывает, что между большинством операций записи и чтения
необходимо вызывать одну из функций позиционирования:

Невозможно вызвать функцию чтения, если последняя операция в потоке


была записью.

Невозможно вызвать функцию записи, если последняя операция в потоке


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

Наконец, схема состояний показывает, что операция позиционирования никогда


не уменьшает число допустимых вызовов функций, которые могут следовать далее.

См. также раздел


Файлы и потоки
Рекомендации по выбору между
функциями и макросами
Статья • 03.04.2023

Большинство подпрограмм библиотеки времени выполнения Microsoft — это


скомпилированные или собранные функции, но некоторые подпрограммы
реализованы в виде макросов. Если в файле заголовка для подпрограммы
объявляется и функция, и макрос, определение макроса имеет приоритет,
поскольку оно всегда находится после объявления функций. При вызове
подпрограммы, которая реализована и как функция, и как макрос, можно
заставить компилятор использовать функцию двумя способами:

Заключить имя подпрограммы в скобки.

#include <ctype.h>

a = _toupper(a); // Use macro version of toupper.

a = (_toupper)(a); // Force compiler to use

// function version of toupper.

Отменить определение макроса с помощью директивы #undef :

#include <ctype.h>

#undef _toupper

Если необходимо выбрать между реализацией библиотечной подпрограммы в


виде функции или макроса, учитывайте следующие компромиссы:

Скорость или размер. Основным преимуществом использования макросов


является меньшее время выполнения. Во время предварительной обработки
макрос развертывается (заменяется его определением) во время каждого
использования. Определение функции происходит только один раз
независимо от того, сколько раз она вызывается. Макросы могут увеличивать
размер кода, но не связаны с дополнительными издержками, связанными с
вызовами функций.

Оценка функции Функция вычисляет адрес; Макрос не поддерживается.


Таким образом, нельзя использовать имя макроса в контекстах, требующих
указателя. Например, можно объявить указатель на функцию, но не указатель
на макрос.

Проверка типов. При объявлении функции компилятор может проверить


типы аргументов. Поскольку невозможно объявить макрос, компилятор не
может проверять типы аргументов макросов; Хотя он может проверить
количество аргументов, которые вы передаете макросу.

См. также раздел


Математические символы универсального типа

Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib


Проверка типов (CRT)
Статья • 03.04.2023

Компилятор выполняет ограниченную проверку типов для функций, которые могут


принимать переменное число аргументов, как указано ниже:

Вызов функции Аргументы, для которых проверяется тип

_cprintf_s , _cscanf_s , Первый аргумент (строка форматирования)


printf_s , scanf_s

fprintf_s , fscanf_s , Первые два аргумента (файл или буфер и строка


sprintf_s , sscanf_s форматирования)

_snprintf_s Первые три аргумента (файл или буфер, количество и


строка форматирования)

_open Первые два аргумента (путь и флаг _open )

_sopen_s Первые три аргумента (путь, флаг _open и режим общего


доступа)

_execl , _execle , _execlp , Первые два аргумента (путь и первый указатель на


_execlpe аргумент)

_spawnl , _spawnle , _spawnlp , Первые три аргумента (флаг режима, путь и первый
_spawnlpe указатель на аргумент)

Компилятор выполняет такую же ограниченную проверку типов для аналогов этих


функций для расширенных символов.

См. также раздел


C runtime (CRT) и C++ Standard Library (STL) .lib files
Методы отладки CRT
Статья • 03.04.2023

При отладке программы, которая использует библиотеку времени выполнения C,


эти методы отладки могут оказаться полезными.

Использование библиотеки отладки CRT


Библиотека среды выполнения C (CRT) обеспечивает расширенную поддержку
отладки. Чтобы использовать одну из библиотек отладки CRT, необходимо связать с
/DEBUG и скомпилировать с /MDdпомощью , /MTdили /LDd.

Основные определения и макросы для отладки CRT можно найти в файле


заголовка <crtdbg.h> .

Функции в отладочных библиотеках CRT компилируются с отладочными


сведениями (/Z7, /Zd, /Zi, /ZI (формат отладочной информации)) и без
оптимизации. Некоторые функции содержат утверждения для проверки
передаваемых им параметров, для них приведен исходный код. Исходный код
позволяет войти в функцию CRT, чтобы убедиться, что она работает в соответствии
с ожиданиями, а также проверить функцию на наличие некорректных параметров
или состояний памяти. (Некоторые технологии CRT являются собственными и не
предоставляют исходный код для обработки исключений, операций с плавающей
запятой и некоторых других процедур.)

Дополнительные сведения о различных библиотеках времени выполнения см. в


разделе Библиотеки времени выполнения C.

Макросы для создания отчетов


Для отладки можно использовать _RPTn макросы и _RPTFn , определенные
в <crtdbg.h> , чтобы заменить использование инструкций printf . Вам не нужно
заключать их в #ifdef директивы, так как они автоматически исчезают в сборке
выпуска, когда _DEBUG не определен.

Макрос Описание

_RPT0 , _RPT1 , Выводит строку сообщения и от нуля до четырех аргументов. Для _RPT1
_RPT2 , _RPT3 , по _RPT4 строка сообщения служит строкой форматирования в стиле printf
_RPT4 для аргументов.
Макрос Описание

_RPTF0 , _RPTF1 , То же, что и _RPTn , но эти макросы также выводит имя файла и номер
_RPTF2 , _RPTF3 , строки, где находится макрос.
_RPTF4

Рассмотрим следующий пример.

C++

#ifdef _DEBUG

if ( someVar > MAX_SOMEVAR )

printf( "OVERFLOW! In NameOfThisFunc( ),

someVar=%d, otherVar=%d.\n",

someVar, otherVar );

#endif

Этот код выводит значения someVar и otherVar в stdout . Вызов _RPTF2 можно
применить для отчета об этих значениях плюс имя файла и номер строки:

C++

if (someVar > MAX_SOMEVAR) _RPTF2(_CRT_WARN, "In NameOfThisFunc( ), someVar=


%d, otherVar= %d\n", someVar, otherVar );

Некоторым приложениям могут потребоваться отладочные отчеты, которые не


предоставляются макросами из библиотеки времени выполнения C. В таком случае
можно написать свой собственный макрос, удовлетворяющий конкретным
требованиям. Например, в один из файлов заголовков можно включить
следующий код, чтобы определить макрос с именем ALERT_IF2 :

C++

#ifndef _DEBUG /* For RELEASE builds */

#define ALERT_IF2(expr, msg, arg1, arg2) do {} while (0)

#else /* For DEBUG builds */

#define ALERT_IF2(expr, msg, arg1, arg2) \

do { \

if ((expr) && \

(1 == _CrtDbgReport(_CRT_ERROR, \

__FILE__, __LINE__, msg, arg1, arg2))) \

_CrtDbgBreak( ); \

} while (0)

#endif

Один вызов может ALERT_IF2 выполнять все функции printf кода:


C++

ALERT_IF2(someVar > MAX_SOMEVAR, "OVERFLOW! In NameOfThisFunc( ),

someVar=%d, otherVar=%d.\n", someVar, otherVar );

Пользовательский макрос можно легко настроить для передачи большего или


меньшего объема информации в разные места назначения. Этот подход полезен
по мере развития требований к отладке.

Написание функций отладочных ловушек


Вы можете написать несколько типов пользовательских функций перехватчика
отладки, которые позволяют вставлять код в некоторые предопределенные точки в
обычной обработке отладчика.

Функции-ловушки клиентского блока


Если нужно проверить или вывести данные, хранящиеся в блоках типа
_CLIENT_BLOCK , можно написать для этого специальную функцию. Создаваемая

функция должна иметь прототип, аналогичный следующему, как определено


в <crtdbg.h> :

C++

void YourClientDump(void *, size_t)

Другими словами, функция-перехватчик должна принимать void указатель на


начало блока выделения вместе со значением size_t типа, указывающим размер
выделения, и возвращать void . В противном случае его содержимое за вас.

После установки функции перехватчика с помощью _CrtSetDumpClient она будет


вызываться при каждом _CLIENT_BLOCK дампе блока. _CrtReportBlockType можно
применять для получения сведений о типе или подтипе выводимых блоков.

Указатель на передаваемую _CrtSetDumpClient функцию имеет тип


_CRT_DUMP_CLIENT , как определено в <crtdbg.h> :

C++

typedef void (__cdecl *_CRT_DUMP_CLIENT)

(void *, size_t);

Функции-ловушки выделения
Функция перехватчика выделения, установленная с помощью _CrtSetAllocHook,
вызывается при каждом выделении, перераспределении или освобождении
памяти. Этот тип ловушек можно использовать для различных целей. Используйте
их, например, для проверки, как приложение обрабатывает ситуации недостатка
памяти, или для оценки шаблонов выделения, или для регистрации данных о
выделении для дальнейшего анализа.

7 Примечание

Помните об ограничении использования функций библиотеки среды


выполнения C в функции обработчика выделения, описанной в разделе
Выделение перехватчиков и выделение памяти crt.

Функция-ловушка выделения должна иметь следующий пример:

C++

int YourAllocHook(int nAllocType, void *pvData,

size_t nSize, int nBlockUse, long lRequest,

const unsigned char * szFileName, int nLine )

Указатель, который вы передаете _CrtSetAllocHook , имеет тип _CRT_ALLOC_HOOK , как


определено в <crtdbg.h> :

C++

typedef int (__cdecl * _CRT_ALLOC_HOOK)

(int, void *, size_t, int, long, const unsigned char *, int);

Когда библиотека времени выполнения вызывает ваш перехватчик, аргумент


указывает, nAllocType какая операция выделения будет выполнена ( _HOOK_ALLOC ,
_HOOK_REALLOC или _HOOK_FREE ). В случае освобождения или перераспределения,
pvData содержит указатель на пользовательскую часть освобождаемого блока.

Однако в случае выделения памяти этот указатель пуст, так как выделение еще не
произошло. Остальные аргументы содержат размер выделения, тип блока, номер
последовательного запроса и указатель на имя файла. Если он доступен, аргументы
также включают номер строки, в которой было выполнено выделение. После того
как функция-перехватчик выполняет любой анализ и другие задачи, необходимые
ее автору, она должна вернуть либо TRUE значение , указывающее, что операция
выделения может продолжаться, либо FALSE , указывающая, что операция должна
завершиться сбоем. Простой обработчик этого типа может проверить объем
памяти, выделенный на данный момент, и вернуться FALSE , если этот объем
превысил небольшой предел. Затем приложение будет испытывать ошибки
выделения, которые обычно возникают только при нехватке доступной памяти.
Более сложные ловушки могут отслеживать структуру выделения, анализировать
использование памяти или сообщать о возникновении какой-либо определенной
ситуации.

Выделение перехватчиков и выделение памяти CRT


Важным ограничением функций-перехватчиков выделения является то, что они
должны явно игнорировать _CRT_BLOCK блоки. Это выделения памяти, создаваемые
внутри библиотеки CRT ее функциями при любом вызове функций CRT,
выделяющих внутреннюю память. Вы можете исключить блоки _CRT_BLOCK из
обработки путем добавления в начало функции-ловушки выделения следующего
кода:

C++

if ( nBlockUse == _CRT_BLOCK )

return( TRUE );

Если ловушка обрабатывает блоки _CRT_BLOCK , то любая вызываемая в ней функция


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

printf , то в результате выделения будет снова вызываться перехватчик, который

будет вызываться printf снова, и т. д., пока стек не переполняется. Если нужен
отчет об операциях выделения _CRT_BLOCK , есть способ обойти это ограничение —
для форматирования и вывода использовать функции Windows API вместо функций
CRT. Так как функции API-интерфейсов Windows не используют кучу библиотеки
CRT, они не могут привести к выполнению в приложении бесконечного цикла.

Если вы изучите исходные файлы библиотеки времени выполнения, вы


увидите debug_heap_hook.cpp , _CrtDefaultAllocHook что функция обработчика
выделения по умолчанию (которая просто возвращает TRUE ) находится в
отдельном файле. Если вы хотите, чтобы обработчик выделения вызывался даже
для выделений, сделанных кодом запуска во время выполнения, который
выполняется перед функцией приложения main , можно заменить эту функцию по
умолчанию одной из собственных, а не использовать _CrtSetAllocHook.
Отчетные функции-ловушки
Функция перехватчика отчетов, установленная с помощью _CrtSetReportHook,
вызывается при каждом _CrtDbgReport создании отчета об отладке. Помимо всего
прочего их можно использовать для фильтрации отчетов, которые позволяют
отобрать выделения конкретного типа. Функция перехватчика отчетов должна
иметь прототип, как в следующем примере:

C++

int AppReportHook(int nRptType, char *szMsg, int *retVal);

Указатель, который вы передаете _CrtSetReportHook , имеет тип _CRT_REPORT_HOOK ,


как определено в <crtdbg.h> :

C++

typedef int (__cdecl *_CRT_REPORT_HOOK)(int, char *, int *);

Когда библиотека времени выполнения вызывает функцию-перехватчик, nRptType


аргумент содержит категорию отчета ( _CRT_WARN , _CRT_ERROR или _CRT_ASSERT ), szMsg
содержит указатель на полностью собранную строку сообщения отчета и retVal
указывает, следует ли _CrtDbgReport продолжать нормальное выполнение после
создания отчета или запуска отладчика. (При retVal нулевом значении
продолжается выполнение, значение 1 запускает отладчик.)

Если обработчик полностью обрабатывает соответствующее сообщение, поэтому


дальнейшие отчеты не требуются, он должен вернуть . TRUE Если возвращается
FALSE , _CrtDbgReport сообщение будет передаваться в обычном режиме.

В этом разделе
Версии отладки функций выделения кучи

Рассматриваются специальные отладочные версии функций выделения кучи,


в том числе то, как CRT сопоставляет вызовы, преимущества их явного вызова,
как избежать преобразования, отслеживание отдельных типов выделений в
клиентских блоках и результаты неопределения _DEBUG .

Сведения о куче отладки CRT


Описывает управление памятью и отладочную кучу, типы блоков в
отладочной куче, функции отчетов о состоянии кучи и способы
использования отладочной кучи для отслеживания запросов на выделение.

Поиск утечек памяти с помощью библиотеки CRT

Рассматриваются способы обнаружения и изоляции утечек памяти с


помощью отладчика и библиотеки времени выполнения языка C (CRT).

См. также
Отладка машинного кода
Безопасность отладчика
Сведения о куче отладки CRT
Статья • 03.04.2023

Отладочная куча CRT и связанные функции предоставляют множество способов


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

Поиск переполнений буфера с помощью


отладочной кучи
Две из наиболее распространенных и неразрешимых проблем, с которыми
сталкиваются программисты, — это перезапись окончания выделенного буфера и
утечки памяти (не удается освободить выделения после того, как они больше не
нужны). Отладочная куча предоставляет мощные средства для решения подобных
проблем с памятью.

Отладочные версии функций кучи вызывают стандартные или базовые версии,


используемые в окончательных построениях. При запросе блока памяти диспетчер
отладочной кучи выделяет из базовой кучи немного больший блок памяти, чем
запрошено, и возвращает указатель на часть этого блока. Например, допустим,
приложение содержит вызов: malloc( 10 ) . В сборке выпуска вызывает
подпрограмму выделения базовой кучи, malloc запрашивая выделение 10 байт.
Однако в отладочной сборке malloc вызывает _malloc_dbgметод , который затем
вызывает подпрограмму выделения базовой кучи, запрашивая выделение 10 байт
плюс примерно 36 байт дополнительной памяти. Все результирующие блоки
памяти в отладочной куче подключаются к единому связанному списку, который
упорядочивает их по времени выделения.

Дополнительная память, выделенная подпрограммами отладочной кучи,


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

В настоящее время структура заголовков блоков, используемая для хранения


сведений о бухгалтерском учете отладочной кучи, объявляется в заголовке
<crtdbg.h> и определяется в исходном <debug_heap.cpp> файле CRT. Концептуально

это похоже на следующую структуру:


C++

typedef struct _CrtMemBlockHeader

// Pointer to the block allocated just before this one:

_CrtMemBlockHeader* _block_header_next;

// Pointer to the block allocated just after this one:

_CrtMemBlockHeader* _block_header_prev;

char const* _file_name;

int _line_number;

int _block_use; // Type of block

size_t _data_size; // Size of user block

long _request_number; // Allocation number

// Buffer just before (lower than) the user's memory:

unsigned char _gap[no_mans_land_size];

// Followed by:

// unsigned char _data[_data_size];

// unsigned char _another_gap[no_mans_land_size];

} _CrtMemBlockHeader;

Буферы no_mans_land по обе стороны от области пользовательских данных блока в


настоящее время имеют размер 4 байта и заполнены известным значением байта,
используемым подпрограммами отладочной кучи, чтобы убедиться, что
ограничения блока памяти пользователя не были перезаписаны. Новые блоки
памяти отладочная куча тоже заполняет фиксированными значениями. Если вы
решили сохранить освобожденные блоки в связанном списке кучи, эти
освобожденные блоки также заполняются известным значением. В данный момент
используются следующие действительные значения байтов:

no_mans_land (0xFD)

Буферы "no_mans_land" по обе стороны памяти, используемой приложением, в


настоящее время заполнены 0xFD.

Освобожденные блоки (0xDD)

Освобожденные блоки в связанном списке отладочной кучи хранятся как


неиспользуемые блоки и, если флаг _CRTDBG_DELAY_FREE_MEM_DF установлен, они
заполняются значением 0xDD.

Новые объекты (0xCD)

При выделении новые объекты заполняются 0xCD.

Типы блоков в отладочной куче


Каждому блоку памяти в отладочной куче присвоен один из пяти типов выделений
памяти. Эти типы отслеживаются и по-разному фиксируются в отчетах в
зависимости от целей: обнаружение утечки памяти или отчет о состоянии. Вы
можете указать тип блока, выделив его с помощью прямого вызова одной из
функций выделения отладочной кучи, например _malloc_dbg. Ниже приведены
пять типов блоков памяти в отладочной куче (заданных в nBlockUse элементе
_CrtMemBlockHeader структуры).

_NORMAL_BLOCK

Вызов malloc или calloc создает блок Normal. Если вы планируете использовать
только обычные блоки и вам не нужны клиентские блоки, может потребоваться
определить _CRTDBG_MAP_ALLOC. _CRTDBG_MAP_ALLOC вызывает сопоставление всех
вызовов выделения кучи с их эквивалентами отладки в отладочных сборках. Он
позволяет хранить имя файла и сведения о номере строки о каждом вызове
выделения в соответствующем заголовке блока.

_CRT_BLOCK

Блоки памяти, выделенные для внутреннего использования несколькими


функциями библиотеки CRT, помечаются как CRT-блоки и могут обрабатываться
отдельно. В результате обнаружение утечек и другие операции могут оставаться не
затронутыми ими. Выделение памяти никогда не работает с блоками типа CRT (не
выделяет, не перераспределяет и не освобождает).

_CLIENT_BLOCK

В целях отладки приложение может специально отслеживать данную группу


выделений путем выделения их как блоков памяти этого типа, применяя явные
вызовы функций отладочной кучи. MFC, например, выделяет все CObject объекты
как клиентские блоки; другие приложения могут хранить различные объекты
памяти в клиентских блоках. Можно также задавать подтипы клиентских блоков —
для более глубокого контроля. Чтобы задать подтип клиентского блока, сдвиньте
номер влево на 16 бит и примените для него операцию OR с _CLIENT_BLOCK .
Пример:

C++

#define MYSUBTYPE 4

freedbg(pbData, _CLIENT_BLOCK|(MYSUBTYPE<<16));

Предоставляемую клиентом функцию перехватчика для дампа объектов,


хранящихся в клиентских блоках, можно установить с помощью _CrtSetDumpClient,
а затем вызывать при дампе блока клиента функцией отладки. Кроме того, можно
использовать для вызова заданной функции, _CrtDoForAllClientObjects
предоставляемой приложением для каждого блока Клиента в отладочной куче.

_FREE_BLOCK

Обычно это блоки, которые освобождаются и удаляются из списка. Чтобы


убедиться, что освобожденная память не записана в или имитировать условия
нехватки памяти, можно сохранить освобожденные блоки в связанном списке,
помеченные как Свободная и заполненные известным значением байтов (в
настоящее время 0xDD).

_IGNORE_BLOCK

Операции отладочной кучи можно отключить на определенный интервал. В


течение этого времени блоки памяти хранятся в списке, но помечаются как
пропускаемые блоки.

Чтобы определить тип и подтип данного блока, используйте функцию


_CrtReportBlockType и макросы _BLOCK_TYPE и _BLOCK_SUBTYPE . Макросы
определяются в <crtdbg.h> следующим образом:

C++

#define _BLOCK_TYPE(block) (block & 0xFFFF)

#define _BLOCK_SUBTYPE(block) (block >> 16 & 0xFFFF)

Проверка целостности кучи и утечек памяти


Из кода могут быть доступны многие возможности отладочной кучи. В следующих
разделах описываются эти возможности и способы их использования.

_CrtCheckMemory

Вы можете использовать вызов _CrtCheckMemory, например, для проверки


целостности кучи в любой точке. Эта функция проверяет каждый блок памяти в
куче. Он проверяет допустимости сведений о заголовке блока памяти и
подтверждает, что буферы не были изменены.

_CrtSetDbgFlag

Вы можете управлять тем, как отладочная куча отслеживает выделения, с помощью


внутреннего флага , _crtDbgFlagкоторый можно считывать и задавать с помощью
_CrtSetDbgFlag функции . Изменяя этот флаг, можно указать отладочной куче по
завершении программы проверять память на утечки и формировать отчет при их
обнаружении. Аналогичным образом можно указать, что куча оставляет
свободные блоки памяти в связанном списке, чтобы имитировать ситуации с
нехваткой памяти. При проверке кучи эти освобожденные блоки проверяются
полностью, чтобы убедиться, что они не были нарушены.

Флаг _crtDbgFlag содержит следующие битовые поля:

Битовое поле Значение Описание


по
умолчанию

_CRTDBG_ALLOC_MEM_DF включить Включает отладочное выделение. Если этот бит


отключен, выделения остаются в цепочке, но их
тип блока — _IGNORE_BLOCK .

_CRTDBG_DELAY_FREE_MEM_DF Off Препятствует действительному освобождению


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

_CRTDBG_CHECK_ALWAYS_DF Выключено Вызывается _CrtCheckMemory при каждом


выделении и освобождении. Выполнение
выполняется медленнее, но быстро
перехватывает ошибки.

_CRTDBG_CHECK_CRT_DF Выключено Вызывает включение блоков, помеченных как


тип _CRT_BLOCK , в операции обнаружения утечки
и разности состояния. Если этот бит выключен,
память, используемая внутренне библиотекой
CRT, во время таких операций не
обрабатывается.

_CRTDBG_LEAK_CHECK_DF Выключено Вызывает проверку на утечку при выходе из


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

Настройка отладочной кучи


Все функции кучи, такие как malloc , free , calloc , realloc , new и delete ,
разрешают своим отладочным эквивалентам действовать в отладочной куче. Когда
освобождается блок памяти, отладочная куча автоматически проверяет
целостность буферов по обеим сторонам выделенной области и выдает отчет об
ошибке в случае их перезаписи.
Использование отладочной кучи
Свяжите отладочную сборку приложения с отладочной версией библиотеки
среды выполнения C.

Изменение одного или нескольких _crtDbgFlag


битового поля и создание нового состояния для флага
1. Вызовите _CrtSetDbgFlag с параметром newFlag , равным _CRTDBG_REPORT_FLAG
(чтобы получить текущее состояние _crtDbgFlag ), и сохраните возвращенное
значение во временной переменной.

2. Включите любые биты с помощью побитового | оператора ("или") для


временной переменной с соответствующими битовыми масками
(представленными в коде приложения константами манифеста).

3. Отключите другие биты с помощью побитового & оператора ("и") для


переменной с побитовой ~ оператором ("не" или дополнением)
соответствующих битовых масок.

4. Вызовите _CrtSetDbgFlag с параметром newFlag со значением, сохраненным в


этой временной переменной, чтобы создать новое состояние для _crtDbgFlag .

Например, следующие строки кода позволяют автоматически обнаруживать


утечки и отключать проверки для блоков типа _CRT_BLOCK :

C++

// Get current flag

int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );

// Turn on leak-checking bit.

tmpFlag |= _CRTDBG_LEAK_CHECK_DF;

// Turn off CRT block checking bit.

tmpFlag &= ~_CRTDBG_CHECK_CRT_DF;

// Set flag to the new value.

_CrtSetDbgFlag( tmpFlag );

new Выделения , delete и _CLIENT_BLOCK в


отладочной куче C++
Отладочные версии библиотеки времени выполнения C содержат отладочные
версии операторов C++ new и delete . При использовании типа выделения
_CLIENT_BLOCK необходимо либо непосредственно вызвать отладочную версию

оператора new , либо создать макросы, заменяющие оператор new в режиме


отладки, как показано в следующем примере.

C++

/* MyDbgNew.h

Defines global operator new to allocate from

client blocks

*/

#ifdef _DEBUG

#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)

#else

#define DEBUG_CLIENTBLOCK

#endif // _DEBUG

/* MyApp.cpp

Use a default workspace for a Console Application to

* build a Debug version of this code

*/

#include "crtdbg.h"

#include "mydbgnew.h"

#ifdef _DEBUG

#define new DEBUG_CLIENTBLOCK

#endif

int main( ) {

char *p1;

p1 = new char[40];

_CrtMemDumpAllObjectsSince( NULL );

Отладочная версия оператора delete работает со всеми типами блоков и не


требует изменений в программе при компиляции версии выпуска.

Функции отчетов о состоянии кучи


Чтобы создать сводный моментальный снимок состояния кучи в определенный
момент времени, используйте структуру _CrtMemState , определенную в <crtdbg.h> :

C++
typedef struct _CrtMemState

// Pointer to the most recently allocated block:

struct _CrtMemBlockHeader * pBlockHeader;

// A counter for each of the 5 types of block:

size_t lCounts[_MAX_BLOCKS];

// Total bytes allocated in each block type:

size_t lSizes[_MAX_BLOCKS];

// The most bytes allocated at a time up to now:

size_t lHighWaterCount;

// The total bytes allocated at present:

size_t lTotalCount;

} _CrtMemState;

Эта структура сохраняет указатель на первый (выделенный последним) блок в


связанном списке отладочной кучи. Затем в двух массивах он записывает
количество блоков памяти каждого типа ( _NORMAL_BLOCK , ,
_CLIENT_BLOCK _FREE_BLOCK и т. д.) в списке и количество байтов, выделенных в
каждом типе блока. И наконец она записывает наибольшее количество байтов,
выделенных в куче до настоящего времени, а также количество байтов,
выделенных в данный момент.

Другие функции отчетов CRT


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

Функция Описание

_CrtMemCheckpoint Сохраняет моментальный снимок кучи в _CrtMemState


структуре, предоставленной приложением.

_CrtMemDifference Сравнивает две структуры состояния памяти, сохраняет в


третьей структуре различие между ними и возвращает
значение TRUE при нахождении различий.

_CrtMemDumpStatistics Создает дампы для заданной _CrtMemState структуры.


Структура может содержать снимок состояния отладочной
кучи на данный момент или различие между двумя
состояниями.
Функция Описание

_CrtMemDumpAllObjectsSince Выводит сведения обо всех объектах, выделенных с момента


получения данного снимка кучи или с начала выполнения.
Каждый раз, когда он создает _CLIENT_BLOCK дамп блока, он
вызывает функцию-перехватчик, предоставляемую
приложением, если она была установлена с помощью
_CrtSetDumpClient .

_CrtDumpMemoryLeaks Определяет, не произошла ли утечка памяти с начала


выполнения программы, и, если произошла, выводит все
выделенные объекты. Каждый раз, когда _CrtDumpMemoryLeaks
создает дамп _CLIENT_BLOCK блока, он вызывает функцию-
перехватчик, предоставляемую приложением, если она была
установлена с помощью _CrtSetDumpClient .

Отслеживание запросов на выделение кучи


Зная имя исходного файла и номер строки макроса утверждения или отчета, часто
полезно найти причину проблемы. То же самое вряд ли будет верно и для функций
выделения кучи. Хотя макросы можно вставлять во многих соответствующих
точках в дереве логики приложения, выделение часто помещается в функцию,
вызываемую из разных мест в разное время. Вопрос не в том, какая строка кода
сделала плохое выделение. Вместо этого, это то, что один из тысяч выделений,
сделанных этой строкой кода, был плохим, и почему.

Уникальные номера запросов на выделение и


_crtBreakAlloc

Существует простой способ определить конкретный вызов выделения кучи,


который не ухорожал. Он использует уникальный номер запроса на выделение,
связанный с каждым блоком в отладочной куче. Когда данные о блоке помещены
в отчет одной из функций дампа, этот номер запроса выделения заключается в
фигурные скобки (например, "{36}").

После того как вы узнаете номер запроса на выделение неправильно выделенного


блока, вы можете передать его _CrtSetBreakAlloc в , чтобы создать точку останова.
Перед выделением блока выполнение прервется, и можно вернуться и определить,
какая процедура отвечает за плохой вызов. Чтобы избежать повторной
компиляции, можно выполнить то же самое в отладчике, задав _crtBreakAlloc
нужный номер запроса на выделение.
Создание отладочных версий процедур выделения
Более сложный подход заключается в создании отладочных версий собственных
подпрограмм выделения, сопоставимых с _dbg версиями функций выделения кучи.
Затем можно передать аргументы исходного файла и номера строки в базовые
подпрограммы выделения кучи, и вы сразу же сможете увидеть, где возникло
неправильное выделение.

Например, предположим, что приложение содержит часто используемую


подпрограмму, как в следующем примере:

C++

int addNewRecord(struct RecStruct * prevRecord,

int recType, int recAccess)

// ...code omitted through actual allocation...

if ((newRec = malloc(recSize)) == NULL)

// ... rest of routine omitted too ...

В файл заголовка можно добавить код, как показано в следующем примере:

C++

#ifdef _DEBUG

#define addNewRecord(p, t, a) \

addNewRecord(p, t, a, __FILE__, __LINE__)

#endif

Затем можно изменить выделение в процедуре создания записи следующим


образом:

C++

int addNewRecord(struct RecStruct *prevRecord,

int recType, int recAccess

#ifdef _DEBUG

, const char *srcFile, int srcLine

#endif

/* ... code omitted through actual allocation ... */

if ((newRec = _malloc_dbg(recSize, _NORMAL_BLOCK,

srcFile, scrLine)) == NULL)

/* ... rest of routine omitted too ... */

Теперь имя исходного файла и номер строки, где вызывалась addNewRecord , будут
сохранены в каждом выделенном в отладочной куче блоке и помещены в отчет
при проверке этого блока.

См. также
Отладка машинного кода
Версии отладки функций выделения
кучи
Статья • 03.04.2023

Библиотека среды выполнения C (CRT) содержит специальные отладочные версии


функций выделения кучи. Эти функции имеют те же имена, что и версии выпуска, к
_dbg которым добавлены. В этой статье описаны различия между версией выпуска

функции CRT и _dbg версией, используя malloc в качестве примеров и _malloc_dbg


.

Поведение в отладочных сборках


При _DEBUG определении CRT сопоставляет все malloc вызовы с _malloc_dbg.
Поэтому вам не нужно переписывать код, используя _malloc_dbg вместо malloc ,
чтобы получить преимущества во время отладки.

Конечно, при желании можно и явно вызывать _malloc_dbg . Явный вызов


_malloc_dbg имеет свои преимущества:

Отслеживание выделений типа _CLIENT_BLOCK .

Запись имени исходного файла и номера строки, где был сделан запрос на
выделение памяти.

Если вы не хотите преобразовывать вызовы _malloc_dbg в , можно получить


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

Чтобы отследить отдельные типы выделений памяти в клиентских блоках, нужно


непосредственно вызвать функцию _malloc_dbg и задать параметру blockType
значение _CLIENT_BLOCK .

Поведение в не отладочных сборках


Если _DEBUG параметр не определен, вызовы не malloc нарушаются, вызовы
разрешаются _malloc_dbg в malloc , определение _CRTDBG_MAP_ALLOC
игнорируется, а сведения об исходном файле, относящиеся к запросу на
выделение, не предоставляются. Так как malloc не имеет параметра типа блока,
запросы типов _CLIENT_BLOCK обрабатываются как стандартные выделения.

См. также раздел


Методы отладки CRT
Нахождение утечек памяти с
помощью библиотеки CRT
Статья • 03.04.2023

Утечки памяти представляют собой наиболее незаметные и сложные для


обнаружения ошибки в приложениях C/C++. Утечки памяти появляются в
результате неправильного освобождения выделенной памяти. Небольшая утечка
памяти сначала может остаться незамеченной, но постепенно может приводить к
различным симптомам: от снижения производительности до аварийного
завершения приложения из-за нехватки памяти. Приложение, в котором
происходит утечка памяти, может использовать всю доступную память и привести
к аварийному завершению других приложений, в результате чего может быть
непонятно, какое приложение отвечает за сбой. Даже безобидная утечка памяти
может быть признаком других проблем, требующих устранения.

Отладчик Visual Studio и библиотека времени выполнения C (CRT) помогают


обнаруживать и выявлять утечки памяти.

Включение обнаружения утечек памяти


Основными средствами обнаружения утечек памяти являются отладчик C/C++ и
функции отладочной кучи CRT.

Чтобы включить все отладочные функции кучи, вставьте в программу C++


следующие операторы в следующем порядке:

C++

#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

Оператор #define сопоставляет базовые версии функций кучи CRT


соответствующим отладочным версиям. Если оператор #define не используется,
дамп утечки памяти будет менее подробным.

Включая crtdbg.h, функции и free сопоставляются malloc с их отладочными


версиями и _malloc_dbg_free_dbg, которые отслеживают выделение памяти и
освобождение. Это сопоставление используется только в отладочных построениях,
в которых определен _DEBUG . В окончательных построениях используются
первоначальные функции malloc и free .

После включения функций отладочной кучи с помощью предыдущих инструкций


поместите вызов _CrtDumpMemoryLeaks перед точкой выхода приложения, чтобы
отобразить отчет об утечке памяти при выходе из приложения.

C++

_CrtDumpMemoryLeaks();

Если приложение имеет несколько выходов, вам не нужно вручную размещать


_CrtDumpMemoryLeaks в каждой точке выхода. Для автоматического вызова
_CrtDumpMemoryLeaks в каждой точке выхода поместите вызов _CrtSetDbgFlag в

начале приложения с помощью следующих битовых полей:

C++

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

По умолчанию _CrtDumpMemoryLeaks выводит отчет об утечке памяти в область


Отладка окна Вывод . Если используется библиотека, она может переустановить
вывод в другое расположение.

_CrtSetReportMode можно использовать для перенаправления отчета в другое

расположение или обратно в окно вывода, как показано ниже:

C++

_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_DEBUG );

В следующем примере показана простая утечка памяти и отображается


информация об утечке памяти с помощью _CrtDumpMemoryLeaks(); .

C++

// debug_malloc.cpp

// compile by using: cl /EHsc /W4 /D_DEBUG /MDd debug_malloc.cpp

#define _CRTDBG_MAP_ALLOC

#include <stdlib.h>

#include <crtdbg.h>

#include <iostream>

int main()

std::cout << "Hello World!\n";

int* x = (int*)malloc(sizeof(int));

*x = 7;

printf("%d\n", *x);

x = (int*)calloc(3, sizeof(int));

x[0] = 7;

x[1] = 77;

x[2] = 777;

printf("%d %d %d\n", x[0], x[1], x[2]);

_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);

_CrtDumpMemoryLeaks();

Интерпретация отчета об утечке памяти


Если приложение не определяет _CRTDBG_MAP_ALLOC , _CrtDumpMemoryLeaks
отображает отчет об утечке памяти, аналогичный следующему:

Командная строка Windows

Detected memory leaks!

Dumping objects ->

{18} normal block at 0x00780E80, 64 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

Если приложение определяет _CRTDBG_MAP_ALLOC , отчет об утечке памяти выглядит


следующим образом:

Командная строка Windows

Detected memory leaks!

Dumping objects ->

c:\users\username\documents\projects\leaktest\leaktest.cpp(20) : {18}

normal block at 0x00780E80, 64 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

Во втором отчете отображается имя файла и номер строки, в которой впервые


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

Номер выделения памяти, в этом примере — 18 .


Тип блока, в примере — normal .
Расположение памяти в шестнадцатеричном формате, в этом примере —
0x00780E80 .

Размер блока, в этом примере — 64 bytes .


Первые 16 байт данных в блоке, в шестнадцатеричном формате.

Типы блоков памяти: обычные, клиентские или CRT. Обычный блок — это
обыкновенная память, выделенная программой. Клиентский блок — особый тип
блока памяти, используемой программами MFC для объектов, для которых
требуется деструктор. Оператор new в MFC создает либо обычный, либо
клиентский блок, в соответствии с создаваемым объектом.

Блок CRT — это блок памяти, выделенной библиотекой CRT для внутреннего
использования. Библиотека CRT обрабатывает освобождение этих блоков, поэтому
CRT-блоки не будут отображаться в отчете об утечке памяти, если нет серьезных
проблем с библиотекой CRT.

Существуют два других типа блоков памяти, которые никогда не отображаются в


отчетах об утечке памяти. Свободный блок — это блок памяти, которая была
освобождена, поэтому по определению утечки здесь нет. Пропускаемый блок —
это память, специально помеченная для исключения из отчета об утечке памяти.

Предыдущие способы выявляют утечки памяти для памяти, выделенной с


помощью стандартной функции malloc библиотеки CRT. Однако если программа
выделяет память с использованием оператора new C++, то в отчете об утечке
памяти вы увидите только имя файла и номер строки, где operator new вызывает
_malloc_dbg . Чтобы создать более полезный отчет об утечке памяти, можно
написать макрос следующего вида, и в отчете будет указываться строка, в которой
было выполнено выделение:

C++

#ifdef _DEBUG

#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )

// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the

// allocations to be of _CLIENT_BLOCK type

#else

#define DBG_NEW new


#endif

Теперь можно заменить оператор new с помощью макроса DBG_NEW в коде. В


отладочных сборках использует перегрузку global operator new , DBG_NEW которая
принимает дополнительные параметры для типа блока, файла и номера строки.
Перегрузка new вызывает _malloc_dbg для записи дополнительных сведений.
Отчеты об утечке памяти показывают имя файла и номер строки, в которой были
выделены утечки объектов. Сборки выпуска по-прежнему используют new по
умолчанию. Вот пример этого метода:

C++

// debug_new.cpp

// compile by using: cl /EHsc /W4 /D_DEBUG /MDd debug_new.cpp

#define _CRTDBG_MAP_ALLOC

#include <cstdlib>

#include <crtdbg.h>

#ifdef _DEBUG

#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )

// Replace _NORMAL_BLOCK with _CLIENT_BLOCK if you want the

// allocations to be of _CLIENT_BLOCK type

#else

#define DBG_NEW new


#endif

struct Pod {

int x;

};

void main() {

Pod* pPod = DBG_NEW Pod;

pPod = DBG_NEW Pod; // Oops, leaked the original pPod!

delete pPod;

_CrtDumpMemoryLeaks();

При выполнении этого кода в отладчике Visual Studio вызов _CrtDumpMemoryLeaks


создает отчет в окне вывода, который выглядит аналогичным образом:

Output

Detected memory leaks!

Dumping objects ->

c:\users\username\documents\projects\debug_new\debug_new.cpp(20) : {75}

normal block at 0x0098B8C8, 4 bytes long.

Data: < > CD CD CD CD

Object dump complete.

Эти выходные данные сообщают о том, что утечка памяти находилась на строке 20
файла debug_new.cpp.

7 Примечание

Не рекомендуется создавать макрос препроцессора с именем new или любым


другим ключевым словом языка.

Задание точек останова для номера


выделения памяти
Номер выделения памяти сообщает, когда был выделен утекающий блок памяти.
Например, блок с номером выделения памяти 18 — это 18-й блок памяти,
выделенный во время выполнения программы. Отчет CRT учитывает все
выделения блоков памяти во время выполнения, включая выделение памяти
библиотекой CRT и другими библиотеками, такими как MFC. Поэтому блок с
номером выделения памяти 18 может не быть 18-м блоком памяти, выделенным
вашим кодом.

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

Установка точки останова для выделения памяти с


помощью окна контрольных значений
1. Установите точку останова рядом с началом приложения и запустите отладку.

2. Когда приложение приостанавливается в точке останова, откройте окно


Контрольные значения, последовательно выбрав пункты
Отладка>Windows>Контрольные значения 1 (или Контрольные значения 2,
Контрольные значения 3 или Контрольные значения 4).

3. В окне Контрольные значения введите _crtBreakAlloc в столбце Имя.

Если используется многопоточная версия DLL-библиотеки CRT (параметр


/MD), добавьте контекстный оператор: {,,ucrtbased.dll}_crtBreakAlloc

Убедитесь, что отладочные символы загружены. В противном _crtBreakAlloc


случае сообщается как неопознанный.

4. Нажмите клавишу ВВОД.


Отладчик выполнит оценку вызова и поместит результат в столбец Значение .
Это значение равно -1, если вы не установили точки останова при выделении
памяти.

5. В столбце Значение замените отображаемое значение номером выделения


памяти, на котором нужно приостановить выполнение.

После задания точки останова для номера выделения памяти можно продолжить
отладку. Убедитесь, что соблюдаются те же условия, чтобы номер выделения
памяти не изменился. Когда выполнение программы будет приостановлено на
заданном выделении памяти, с помощью окна Стек вызовов и других окон
отладчика определите условия выделения памяти. Затем можно продолжить
выполнение программы и проследить, что происходит с этим объектом и почему
выделенная ему память освобождается неправильно.

Иногда может быть полезно задать точку останова по данным на самом объекте.
Для получения дополнительной информации см. раздел Использование точек
останова.

Точки останова для выделения памяти можно также задать в коде. Можно
установить следующие значения:

C++

_crtBreakAlloc = 18;

или

C++

_CrtSetBreakAlloc(18);

Сравнение состояний памяти


Другая технология для обнаружения утечек памяти включает получение "снимков"
состояния памяти приложения в ключевых точках. Чтобы получить снимок
состояния памяти в заданной точке приложения, создайте структуру _CrtMemState и
передайте ее функции _CrtMemCheckpoint .

C++

_CrtMemState s1;

_CrtMemCheckpoint( &s1 );

Функция _CrtMemCheckpoint поместит в структуру снимок текущего состояния


памяти.

Чтобы вывести содержимое структуры _CrtMemState , передайте ее функции _


CrtMemDumpStatistics :

C++

_CrtMemDumpStatistics( &s1 );

Функция _CrtMemDumpStatistics выводит дамп состояния памяти, который выглядит


примерно таким образом:

Командная строка Windows

0 bytes in 0 Free Blocks.

0 bytes in 0 Normal Blocks.

3071 bytes in 16 CRT Blocks.

0 bytes in 0 Ignore Blocks.

0 bytes in 0 Client Blocks.

Largest number used: 3071 bytes.

Total allocations: 3764 bytes.

Чтобы определить, произошла ли утечка памяти на отрезке кода, можно сделать


снимок состояния памяти перед ним и после него, а затем сравнить оба состояния
с помощью функции _CrtMemDifference :

C++

_CrtMemCheckpoint( &s1 );

// memory allocations take place here

_CrtMemCheckpoint( &s2 );

if ( _CrtMemDifference( &s3, &s1, &s2) )

_CrtMemDumpStatistics( &s3 );

Функция _CrtMemDifference сравнивает состояния памяти s1 и s2 и возвращает


результат в ( s3 ), представляющий собой разницу между s1 и s2 .

Еще один способ поиска утечек памяти заключается в размещении вызовов


_CrtMemCheckpoint в начале и конце программы с последующим использованием

_CrtMemDifference для сравнения результатов. Если _CrtMemDifference показывает

утечку памяти, можно добавить дополнительные вызовы функции


_CrtMemCheckpoint , чтобы разделить программу с помощью двоичного поиска, пока

не будет найден источник утечки.

Ложные срабатывания
_CrtDumpMemoryLeaks может дать ложные признаки утечки памяти, если библиотека
помечает внутренние выделения как обычные блоки, а не блоки CRT или
клиентские блоки. В таком случае функция _CrtDumpMemoryLeaks не может различать
пользовательские выделения и внутренние выделения библиотеки. Если
глобальные деструкторы для выделений библиотеки выполняются после точки
вызова функции _CrtDumpMemoryLeaks , каждое внутреннее выделение библиотеки
принимается за утечку памяти. Версии библиотеки стандартных шаблонов,
предшествовавшие Visual Studio .NET, приводили к тому, что функция
_CrtDumpMemoryLeaks сообщала о таких ложных утечках.

См. также
Сведения о куче отладки CRT
Безопасность отладчика
Отладка машинного кода
Проверка типов (CRT)
Статья • 03.04.2023

Компилятор выполняет ограниченную проверку типов для функций, которые могут


принимать переменное число аргументов, как указано ниже:

Вызов функции Аргументы, для которых проверяется тип

_cprintf_s , _cscanf_s , Первый аргумент (строка форматирования)


printf_s , scanf_s

fprintf_s , fscanf_s , Первые два аргумента (файл или буфер и строка


sprintf_s , sscanf_s форматирования)

_snprintf_s Первые три аргумента (файл или буфер, количество и


строка форматирования)

_open Первые два аргумента (путь и флаг _open )

_sopen_s Первые три аргумента (путь, флаг _open и режим общего


доступа)

_execl , _execle , _execlp , Первые два аргумента (путь и первый указатель на


_execlpe аргумент)

_spawnl , _spawnle , _spawnlp , Первые три аргумента (флаг режима, путь и первый
_spawnlpe указатель на аргумент)

Компилятор выполняет такую же ограниченную проверку типов для аналогов этих


функций для расширенных символов.

См. также раздел


C runtime (CRT) и C++ Standard Library (STL) .lib files
Флаг направления
Статья • 03.04.2023

Флаг направления — это флаг ЦП, относящийся ко всем процессорам,


совместимым с архитектурой Intel x86. Он применяется ко всем инструкциям
сборки, которые используют REP префикс (повтор), например MOVS , , MOVSD MOVSW и
другие. Если флаг направления не установлен, предоставляемые этим инструкциям
адреса увеличиваются.

Подпрограммы времени выполнения C предполагают, что флаг направления не


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

Функции библиотеки времени выполнения C, например подпрограммы обработки


строк и управления буфером, ожидают, что флаг направления не установлен.

См. также раздел


C runtime (CRT) и C++ Standard Library (STL) .lib files
Возможности безопасности в CRT
Статья • 03.04.2023

Многие старые функции CRT имеют новые, более безопасные версии. Если
существует безопасная функция, более старая, менее безопасная версия
помечается как нерекомендуемая. Новая версия имеет _s суффикс (secure).

В этом контексте "не рекомендуется" означает, что использование функции не


рекомендуется. Это не означает, что функция будет удалена из CRT.

Безопасные функции не предотвращают и не исправляют ошибки безопасности.


Вместо этого они перехватывают ошибки при их возникновении. Они выполняют
дополнительные проверки на наличие ошибок. При возникновении ошибки они
вызывают обработчик ошибок (см. проверку параметров).

Например, функция не может определить, strcpy слишком ли копируется строка


для целевого буфера. Его безопасный аналог strcpy_s принимает размер буфера в
качестве параметра. Таким образом, он может определить, будет ли происходить
переполнение буфера. Если вы используете strcpy_s для копирования 11
символов в буфер 10 символов, это ошибка с вашей стороны; strcpy_s не удается
исправить ошибку. Но он может обнаружить ошибку и сообщить вам, вызвав
обработчик недопустимых параметров.

Устранение предупреждений о
нерекомендуемых функциях
Существует несколько способов устранить предупреждения о нерекомендуемых
функциях для старых менее безопасных функций. Проще всего просто определить
_CRT_SECURE_NO_WARNINGS или использовать warning pragma. Либо отключит

предупреждения об устаревании, но проблемы безопасности, вызвавшие


предупреждения, по-прежнему существуют. Рекомендуется оставить
предупреждения об устаревании включенными и воспользоваться новыми
функциями безопасности CRT.

В C++ самый простой способ устранить предупреждения об устаревании —


использовать безопасные перегрузки шаблонов. Перегрузки устраняют
предупреждения об устаревании во многих случаях. Они заменяют вызовы
нерекомендуемых функций вызовами безопасных версий функций. Например,
рассмотрим нерекомендуемый вызов функции strcpy :
C++

char szBuf[10];

strcpy(szBuf, "test"); // warning: deprecated

Задание символа _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES равным 1 устраняет


предупреждение, заменяя вызов функции strcpy вызовом функции strcpy_s ,
которая предотвращает переполнение буфера. Дополнительные сведения см. в
разделе "Безопасные перегрузки шаблонов".

Для тех нерекомендуемых функций, у которых нет безопасных шаблонных


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

Еще один источник предупреждений о нерекомендуемых функциях, не связанный с


безопасностью, — POSIX-функции. Замените имена функций POSIX стандартными
эквивалентами (например, изменением access_access) или отключите
предупреждения об устаревании, связанные с POSIX, путем определения
_CRT_NONSTDC_NO_WARNINGS . Дополнительные сведения см. в разделе Совместимость.

Дополнительные функции безопасности


Ниже перечислены некоторые функции безопасности.

Проверка параметров

Безопасные функции и многие из их небезопасных коллег проверяют


параметры. Проверка может включать:
NULL Проверка значений.
Проверка допустимости перечислимых значений.
Проверка принадлежности целочисленных значений допустимым
диапазонам.

Дополнительные сведения см. в разделе "Проверка параметров".

Разработчику также доступен обработчик недопустимого параметра. Если


функция сталкивается с недопустимым параметром, а не утверждением и
выходом из приложения, CRT позволяет проверить эти проблемы с помощью
_set_invalid_parameter_handler или _set_thread_local_invalid_parameter_handler.

Буферы размера
Необходимо передать размер буфера любой защищенной функции, которая
записывает данные в буфер. Безопасные версии проверяют, достаточно ли
большой буфер перед записью в него. Проверка помогает избежать опасных
ошибок переполнения буфера, которые могут позволить выполнять
вредоносный код. Эти функции обычно возвращают errno код ошибки и
вызывают обработчик недопустимых параметров, если размер буфера
слишком мал. Функции, выполняющие чтение из буферов ввода, например
gets , имеют безопасные версии, требующие указания максимального

размера.

Завершение null

Некоторые функции, которые оставили потенциально неоканированные


строки, имеют безопасные версии, которые гарантируют правильное
завершение строк со значением NULL.

Улучшенные отчеты об ошибках

Безопасные функции возвращают коды ошибок с большим объемом


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

Безопасность файловой системы

API безопасного файлового ввода-вывода по умолчанию поддерживает


безопасный доступ к файлам.

Безопасность Windows

Безопасные API для работы с процессами принудительно реализуют политики


безопасности и позволяют задавать списки управления доступом (ACL).

Форматирование проверки синтаксиса строки

Например, при использовании неправильных символов поля типа в printf


строках формата обнаруживаются недопустимые строки.

См. также раздел


Проверка параметров

Безопасные перегрузки шаблонов

Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib


Версии функций CRT повышенной
безопасности
Статья • 03.04.2023

Доступны более безопасные версии подпрограмм библиотеки среды выполнения.


Дополнительные сведения об улучшениях безопасности в CRT см. в разделе
"Функции безопасности" в CRT.

Безопасные функции
Функция CRT Функция с усиленной Использование
безопасностью

_access, _waccess _access_s, _waccess_s Определяют разрешения на доступ к


файлам

_alloca _malloca Выделение памяти в стеке

asctime, _wasctime asctime_s, _wasctime_s Преобразуют время из типа struct tm в


символьную строку.

bsearch bsearch_s Выполнение двоичного поиска по


отсортированному массиву

_cgets, _cgetws _cgets_s, _cgetws_s Возвращают строку символов из консоли

_chsize _chsize_s Изменяет размер файла

clearerr clearerr_s Сбрасывает индикатор ошибок для


потока

_control87, _controlfp, _controlfp_s Возвращает и задает управляющее слово


__control87_2 блока операций с плавающей запятой

_cprintf, _cprintf_l, _cprintf_s, _cprintf_s_l, Форматирует данные и печатает их в


_cwprintf, _cwprintf_l _cwprintf_s, _cwprintf_s_l консоли

_cscanf, _cscanf_l, _cscanf_s, _cscanf_s_l, Считывает отформатированные данные


_cwscanf, _cwscanf_l _cwscanf_s, _cwscanf_s_l из консоли

ctime, _ctime32, _ctime_s, _ctime32_s, Преобразуют время из типа time_t ,


_ctime64, _wctime, _ctime64_s, _wctime_s, __time32_t или __time64_t в символьную
_wctime32, _wctime64 _wctime32_s, строку
_wctime64_s

_ecvt _ecvt_s Преобразует число double в строку


Функция CRT Функция с усиленной Использование
безопасностью

_fcvt _fcvt_s Преобразует число с плавающей запятой


в строку

fopen, _wfopen fopen_s, _wfopen_s Открытие файла

fprintf, _fprintf_l, fprintf_s, _fprintf_s_l, Выводят форматированные данные в


fwprintf, _fwprintf_l fwprintf_s, _fwprintf_s_l поток

fread fread_s Считывает данные из файла

_fread_nolock _fread_nolock_s Считывает данные из файла без


использования блокировки
многопотоковой записи

freopen, _wfreopen freopen_s, _wfreopen_s Повторно открывает файл

fscanf, _fscanf_l, fscanf_s, _fscanf_s_l, Считывают форматированные данные из


fwscanf, _fwscanf_l fwscanf_s, _fwscanf_s_l потока

_ftime, _ftime32, _ftime_s, _ftime32_s, Отображают текущее время


_ftime64 _ftime64_s

_gcvt _gcvt_s Преобразует значение с плавающей


запятой в строку и сохраняет ее в буфер

getenv, _wgetenv getenv_s, _wgetenv_s Получают значение из текущей среды.

gets, getws gets_s, _getws_s Получают строку из потока stdin

gmtime, _gmtime32, _gmtime32_s, Преобразуют время из типа time_t в тип


_gmtime64 _gmtime64_s struct tm или из типа __time64_t в тип
struct tm .

itoa, _itoa, ltoa, _ltoa, _itoa_s, _ltoa_s, _ultoa_s, Преобразуют целочисленный тип в
ultoa, _ultoa, _i64toa, _i64toa_s, _ui64toa_s, строку
_ui64toa, _itow, _ltow, _itow_s, _ltow_s,
_ultow, _i64tow, _ultow_s, _i64tow_s,
_ui64tow _ui64tow_s

_lfind _lfind_s Выполняет линейный поиск указанного


ключа

localtime, _localtime32, localtime_s, Преобразуют время из типа time_t в тип


_localtime64 _localtime32_s, struct tm или из типа __time64_t в тип
_localtime64_s struct tm с поправкой на местное время.
Функция CRT Функция с усиленной Использование
безопасностью

_lsearch _lsearch_s Выполняет линейный поиск значения и


добавляет значение в конец списка, если
оно не найдено

_makepath, _makepath_s, Создают путь из компонентов


_wmakepath _wmakepath_s

_mbccpy, _mbccpy_l _mbccpy_s, _mbccpy_s_l Копирует многобайтовый символ из


одной строки в другую

_mbsnbcat, _mbsnbcat_s, Добавьте не более первых n байт одной


_mbsnbcat_l _mbsnbcat_s_l многобайтовой строки в другую

_mbsnbcpy, _mbsnbcpy_s, Копируют n байт строки в целевую


_mbsnbcpy_l _mbsnbcpy_s_l строку

_mbsnbset, _mbsnbset_s, Задают указанный символ в качестве


_mbsnbset_l _mbsnbset_s_l первых n байт строки

mbsrtowcs mbsrtowcs_s Преобразует строку многобайтовых


символов в строку соответствующих
расширенных символов

mbstowcs, _mbstowcs_l mbstowcs_s, Преобразует последовательность


_mbstowcs_s_l многобайтовых символов в
соответствующую последовательность
расширенных символов

memcpy, wmemcpy memcpy_s, wmemcpy_s Копирует символы из одного буфера в


другой

memmove, memmove_s, Перемещает один буфер в другой


wmemmove wmemmove_s

_mktemp, _wmktemp _mktemp_s, _wmktemp_s Создают уникальное имя файла

printf, _printf_l, wprintf, printf_s, _printf_s_l, Выводят форматированные выходные


_wprintf_l wprintf_s, _wprintf_s_l данные в стандартный выходной поток

_putenv, _wputenv _putenv_s, _wputenv_s Создают, изменяют или удаляют


переменные среды

qsort qsort_s Выполняет быструю сортировку

rand rand_s Создает псевдослучайное число

scanf, _scanf_l, wscanf, scanf_s, _scanf_s_l, Считывают форматированные данные из


_wscanf_l wscanf_s, _wscanf_s_l стандартного входного потока
Функция CRT Функция с усиленной Использование
безопасностью

_searchenv, _searchenv_s, Ищут файл, используя пути в среде


_wsearchenv _wsearchenv_s

snprintf, _snprintf, _snprintf_s, _snprintf_s_l, Записывают форматированных данных в


_snprintf_l, _snwprintf, _snwprintf_s, строку
_snwprintf_l _snwprintf_s_l

_snscanf, _snscanf_l, _snscanf_s, _snscanf_s_l, Считывают форматированные данные


_snwscanf, _snwscanf_l _snwscanf_s, указанной длины из строки
_snwscanf_s_l

_sopen, _wsopen _sopen_s, _wsopen_s Открывают файл для общего доступа

_splitpath, _wsplitpath _splitpath_s, Разбивают имя пути на компоненты


_wsplitpath_s

sprintf, _sprintf_l, sprintf_s, _sprintf_s_l, Записывают форматированных данных в


swprintf, _swprintf_l, swprintf_s, _swprintf_s_l строку
__swprintf_l

sscanf, _sscanf_l, sscanf_s, _sscanf_s_l, Считывают форматированные данные из


swscanf, _swscanf_l swscanf_s, _swscanf_s_l строки

strcat, wcscat, _mbscat strcat_s, wcscat_s, Добавляют строку


_mbscat_s

strcpy, wcscpy, strcpy_s, wcscpy_s, Копируют строку


_mbscpy _mbscpy_s

_strdate, _wstrdate _strdate_s, _wstrdate_s Возвращают текущую системную дату в


виде строки

strerror, _strerror, strerror_s, _strerror_s, Получает системное сообщение об


_wcserror, __wcserror _wcserror_s, __wcserror_s ошибке ( strerror , _wcserror ) или
выводит указанное пользователем
сообщение об ошибке ( _strerror ,
__wcserror )

_strlwr, _wcslwr, _strlwr_s, _strlwr_s_l, Преобразуют строку в нижний регистр


_mbslwr, _strlwr_l, _mbslwr_s, _mbslwr_s_l,
_wcslwr_l, _mbslwr_l _wcslwr_s, _wcslwr_s_l

strncat, _strncat_l, strncat_s, _strncat_s_l, Присоединяют символы к строке


wcsncat, _wcsncat_l, wcsncat_s, _wcsncat_s_l,
_mbsncat, _mbsncat_l _mbsncat_s,
_mbsncat_s_l
Функция CRT Функция с усиленной Использование
безопасностью

strncpy, _strncpy_l, strncpy_s, _strncpy_s_l, Копируют символы одной строки в


wcsncpy, _wcsncpy_l, wcsncpy_s, _wcsncpy_s_l, другую
_mbsncpy, _mbsncpy_l _mbsncpy_s,
_mbsncpy_s_l

_strnset, _strnset_l, _strnset_s, _strnset_s_l, Устанавливает для первых символов


_wcsnset, _wcsnset_l, _wcsnset_s, _wcsnset_s_l, строки (n) значение указанного символа
_mbsnset, _mbsnset_l _mbsnset_s,
_mbsnset_s_l

_strset, _strset_l, _strset_s, _strset_s_l, Устанавливает для всех символов строки


_wcsset, _wcsset_l, _wcsset_s, _wcsset_s_l, значение указанного символа
_mbsset, _mbsset_l _mbsset_s, _mbsset_s_l

_strtime, _wstrtime _strtime_s, _wstrtime_s Возвращают текущее системное время в


виде строки

strtok, _strtok_l, wcstok, strtok_s, _strtok_s_l, Находят следующий токен в строке,


_wcstok_l, _mbstok, wcstok_s, _wcstok_s_l, используя текущий или переданный
_mbstok_l _mbstok_s, _mbstok_s_l языковой стандарт

_strupr, _strupr_l, _strupr_s, _strupr_s_l, Преобразуют строку в верхний регистр


_mbsupr, _mbsupr_l, _mbsupr_s, _mbsupr_s_l,
_wcsupr_l, _wcsupr _wcsupr_s, _wcsupr_s_l

tmpfile tmpfile_s Создает временный файл

_tempnam, tmpnam_s, _wtmpnam_s Формирует имена, которые можно


_wtempnam, tmpnam, использовать для создания временных
_wtmpnam файлов

_umask _umask_s Задает маску разрешений файла по


умолчанию

_vcprintf, _vcprintf_l, _vcprintf_s, _vcprintf_s_l, Записывают форматированные


_vcwprintf, _vcwprintf_l _vcwprintf_s, выходные данные в консоль с помощью
_vcwprintf_s_l указателя на список аргументов

vfprintf, _vfprintf_l, vfprintf_s, _vfprintf_s_l, Записывают форматированные


vfwprintf, _vfwprintf_l vfwprintf_s, _vfwprintf_s_l выходные данные с помощью указателя
на список аргументов

vfscanf, vfwscanf vfscanf_s, vfwscanf_s Считывают форматированные данные из


потока

vprintf, _vprintf_l, vprintf_s, _vprintf_s_l, Записывают форматированные


vwprintf, _vwprintf_l vwprintf_s, _vwprintf_s_l выходные данные с помощью указателя
на список аргументов
Функция CRT Функция с усиленной Использование
безопасностью

vscanf, vwscanf vscanf_s, vwscanf_s Считывают форматированные данные из


стандартного входного потока

vsnprintf, _vsnprintf, vsnprintf_s, _vsnprintf_s, Записывают форматированные


_vsnprintf_l, _vsnprintf_s_l, выходные данные с помощью указателя
_vsnwprintf, _vsnwprintf_s, на список аргументов
_vsnwprintf_l _vsnwprintf_s_l

vsprintf, _vsprintf_l, vsprintf_s, _vsprintf_s_l, Записывают форматированные


vswprintf, _vswprintf_l, vswprintf_s, выходные данные с помощью указателя
__vswprintf_l _vswprintf_s_l на список аргументов

vsscanf, vswscanf vsscanf_s, vswscanf_s Считывают форматированные данные из


строки

wcrtomb wcrtomb_s Преобразует расширенный символ в


соответствующее представление
многобайтового символа

wcsrtombs wcsrtombs_s Преобразует строку расширенных


символов в соответствующее
представление многобайтовой строки

wcstombs, _wcstombs_l wcstombs_s, Преобразует последовательность


_wcstombs_s_l расширенных символов в
соответствующую последовательность
многобайтовых символов

wctomb, _wctomb_l wctomb_s, _wctomb_s_l Преобразует расширенный символ в


соответствующий многобайтовый
символ

См. также раздел


Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib
Проверка параметров
Статья • 03.04.2023

Большинство функций CRT с повышенным уровнем безопасности и многие из них


проверяют свои параметры на наличие таких элементов, как проверка указателей
NULL , то целые числа попадают в допустимый диапазон или что значения
перечисления являются допустимыми. Если найден недопустимый параметр,
вызывается обработчик недопустимых параметров.

Подпрограмма обработчика недопустимых


параметров
Когда функция библиотеки среды выполнения C обнаруживает недопустимый
параметр, она записывает некоторые сведения об ошибке, а затем вызывает
макрос, который заключает в оболочку функцию диспетчера недопустимых
параметров. Что будет одним из _invalid_parameter, _invalid_parameter_noinfoили
_invalid_parameter_noinfo_noreturn. Какая функция диспетчеризации вызывается,
зависит от того, является ли код, соответственно, отладочной сборкой, розничной
сборкой или ошибкой не считается восстанавливаемой.

В отладочных сборках макрос недопустимого параметра обычно вызывает


сбойное утверждение и точку останова отладчика перед вызовом функции
диспетчера. При выполнении кода утверждение может быть сообщено
пользователю в диалоговом окне с параметрами Abort, Retry и Continue или
аналогичными вариантами, которые зависят от операционной системы и версии
CRT. Эти параметры позволяют пользователю немедленно завершить программу,
подключить отладчик или позволить существующему коду продолжать
выполнение, которое вызывает функцию диспетчеризации.

Функция диспетчера недопустимых параметров вызывает обработчик


недопустимых параметров, назначаемый в данный момент. По умолчанию вызовы
_invoke_watson недопустимых параметров, что приводит к закрытию приложения и
созданию мини-дампа. Если эта функция включена операционной системой,
диалоговое окно запрашивает у пользователя отправку аварийного дампа в
корпорацию Майкрософт для анализа.

Это поведение можно изменить с помощью функций _set_invalid_parameter_handler


или _set_thread_local_invalid_parameter_handler задать обработчик недопустимых
параметров для собственной функции. Если указанная функция не завершает
работу приложения, элемент управления возвращается в функцию, которая
получила недопустимые параметры. В CRT эти функции обычно останавливают
выполнение функции, задают errno код ошибки и возвращают код ошибки. Во
многих случаях errno значение и возвращаемое значение являются обоими
EINVAL , чтобы указать недопустимый параметр. В некоторых случаях возвращается
более конкретный код ошибки, например EBADF , соответствующий указателю на
неправильный файл, переданному как параметр.

Дополнительные сведения о, см. в errno разделе errno, и


_sys_nerr_doserrno_sys_errlist.

См. также раздел


Функции безопасности в CRT

Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib


Безопасные перегрузки шаблонов
Статья • 03.04.2023

Корпорация Майкрософт объявила устаревшими многие функции библиотеки C


времени выполнения (CRT), заменив их версиями с более высоким уровнем
безопасности. Например, strcpy_s является более безопасной заменой для strcpy .
Устаревшие функции являются общими источниками ошибок безопасности, так как
они не препятствуют операциям, которые могут перезаписать память. По
умолчанию компилятор выдает предупреждение об устаревании, если в коде
присутствует любая из этих функций. CRT предоставляет для этих функций
перегруженные шаблоны C++, которые помогают упростить переход к более
безопасным вариантам.

Например, для этого фрагмента кода создается предупреждение, поскольку


функция strcpy объявлена устаревшей:

C++

char szBuf[10];

strcpy(szBuf, "test"); // warning: deprecated

Предупреждение об устаревании сообщает вам, что используемый код может быть


небезопасным. Если вы убедились, что код не может перезаписать память, у вас
есть несколько вариантов. Вы можете просто игнорировать это предупреждение.
Вы можете добавить символ _CRT_SECURE_NO_WARNINGS перед инструкциями include в
заголовках CRT, чтобы подавить предупреждение. Также вы можете изменить код,
заменив эту функцию на strcpy_s :

C++

char szBuf[10];

strcpy_s(szBuf, 10, "test"); // security-enhanced _s function

Перегрузки шаблонов предоставляют дополнительные варианты. Если задать


_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES значение 1, он включает перегрузки

шаблонов стандартных функций CRT, которые автоматически вызывают более


безопасные варианты. Если _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES имеет
значение "1", никаких изменений в коде не требуется. Вызов функции strcpy в
фоновом режиме заменяется вызовом функции strcpy_s с автоматической
подстановкой аргумента размера.
C++

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char szBuf[10];

strcpy(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Макрос _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES не влияет на функции, которые


принимают количество, например strncpy . Чтобы включить перегруженные
шаблоны для функций, принимающих количество, определите
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT как значение "1". Однако перед этим

действием следует убедиться, что код передает количество символов, а не размер


буфера (частая ошибка). Кроме того, код, который явно записывает значение NULL
в конец буфера после вызова функции, является необязательным, если вызывается
безопасный вариант. Если требуется поведение усечения, см. раздел _TRUNCATE.

7 Примечание

Макрос _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT требует, чтобы


_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES также был определен как значение

"1". Если _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT определен как


значение "1" и _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES определен как
значение "0", в приложении не выполняются никакие перегрузки шаблонов.

Если вы определите _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES со значением "1",


включается перегрузка шаблонов безопасными вариантами (имена которых
оканчиваются на "_s"). В этом случае, если _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES
определен как значение "1", в исходном коде необходимо сделать одно небольшое
изменение.

C++

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char szBuf[10];

strcpy_s(szBuf, "test"); // ==> strcpy_s(szBuf, 10, "test")

Требуется изменить только имена функций (добавив к ним символы "_s"), а


перегрузка шаблона автоматически подставит аргумент размера.
По умолчанию _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES и
_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT определены как "0" (запрещено), а
_CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES определен как "1" (разрешено).

Перегрузки шаблона работают только для статических массивов. Для динамически


выделенных буферов требуются другие изменения исходного кода. В приведенных
выше примерах:

C++

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

// ...

char *szBuf = (char*)malloc(10);

strcpy(szBuf, "test"); // still deprecated; change it to


// strcpy_s(szBuf, 10, "test");

И в этом примере:

C++

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// ...

char *szBuf = (char*)malloc(10);

strcpy_s(szBuf, "test"); // doesn't compile; change it to

// strcpy_s(szBuf, 10, "test");

См. также раздел


Функции безопасности в CRT

C runtime (CRT) и C++ Standard Library (STL) .lib files


Заметки SAL
Статья • 03.04.2023

При просмотре библиотечных заголовочных файлов вы можете обратить


внимание на некоторые непривычные заметки, например _In_z и
_Out_z_cap_(_Size) . Эти заметки являются примерами языка заметок исходного
кода Майкрософт (SAL). SAL предоставляет набор заметок, описывающий, как
функция использует его параметры и тип возвращаемого значения. Например, он
указывает предположения, которые он делает о них, и гарантии, которые он делает
при отделке. Файл заголовка <sal.h> определяет заметки.

Дополнительные сведения об использовании заметок SAL в Visual Studio см. в


статье "Использование заметок SAL" для уменьшения дефектов кода C/C++.

См. также раздел


C runtime (CRT) и C++ Standard Library (STL) .lib files
Производительность многопотоковых
библиотек
Статья • 03.04.2023

Однопоточные CRT более не доступны. В этой статье описывается, как получить


максимальную производительность из многопоточных библиотек.

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

Независимая блокировка потока позволяет заблокировать поток, а затем


использовать _nolock функции , которые обращаются к потоку напрямую. Эта
функция позволяет подключить использование блокировки за пределами
критически важных циклов.

Языковой стандарт для каждого потока снижает затраты на доступ к


языковому стандарту для многопоточных сценариев (см. раздел
_configthreadlocale).

Функции, зависящие от языкового стандарта (с именами, заканчивающимися


на _l), принимают языковой стандарт в качестве параметра, удаляя
значительные затраты (например, printf, , _printf_lwprintf). _wprintf_l

Оптимизации для общих кодовых страниц снижают стоимость множества


коротких операций.

_CRT_DISABLE_PERFCRIT_LOCKS Определение заставляет все операции ввода-


вывода предполагать однопотоковую модель ввода-вывода и использовать
_nolock формы функций. Этот макрос позволяет повысить
производительность однопоточных приложений на основе ввода-вывода.

Предоставление дескриптора кучи CRT позволяет включить кучу низкой


фрагментации Windows (LFH) для кучи CRT, что может значительно повысить
производительность в высокомасштабируемых сценариях.
См. также раздел
Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib
Параметры ссылок
Статья • 03.04.2023

Каталог библиотекИ CRT содержит несколько небольших объектных файлов,


которые включают определенные функции CRT без изменения кода. Эти
объектные файлы называются "параметрами ссылок", так как для их использования
необходимо только добавить их в командную строку компоновщика.

Версии этих объектов в чистом режиме среды CLR отмечены как нерекомендуемые
для использования в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.
Используйте обычные версии для машинного кода и кода /clr.

Машинный код и /clr Чистый режим Описание

binmode.obj pbinmode.obj Устанавливает в качестве режима


преобразования файлов по
умолчанию двоичный режим. См.
раздел _fmode.

chkstk.obj Недоступно Обеспечивает поддержку


проверки и распределения стека,
если CRT не используется.

commode.obj pcommode.obj Присваивает глобальному флагу


фиксации значение "commit". См.
разделfopen , _wfopen и fopen_s.
_wfopen_s
Машинный код и /clr Чистый режим Описание

exe_initialize_mta.lib Недоступно Инициализирует подразделение


MTA во время запуска EXE-файла,
который позволяет использовать
COM-объекты в глобальных
интеллектуальных указателях. Так
как этот параметр пропускает
ссылку на квартиру MTA во время
завершения работы, не
используйте ее для библиотек DLL.
Связывание с этим файлом
эквивалентно включению
combase.h и определению
_EXE_INITIALIZE_MTA . При
использовании этого параметра
ссылки onecore.lib добавляется в
список библиотек по умолчанию.
Если этот эффект нежелателен
(например, при использовании
onecore_apiset.lib или другой
библиотеки зонтика), используйте
/NODEFAULTLIB , чтобы
переопределить это поведение и
предоставить альтернативу.

fp10.obj Недоступно Изменяет управление точностью


по умолчанию на 64 бита. См.
раздел Поддержка математических
вычислений и операций с
плавающей запятой.

invalidcontinue.obj pinvalidcontinue.obj Определяет обработчик


недопустимых параметров по
умолчанию, который не делает
ничего, т. е. недопустимые
параметры, передаваемые в
функции CRT, получают значение
errno и возвращают ошибку.
Машинный код и /clr Чистый режим Описание

legacy_stdio_float_rounding.obj Недоступно Исправлена печать значений с


плавающей запятой (например,
при использовании printf) с
Windows 10 19041 Universal C
Runtime. Теперь он правильно
округляет точно представляемые
числа с плавающей запятой и
учитывает округление с
плавающей запятой, запрошенное
fesetround. Это обновление
поведения доступно в Visual Studio
2019 версии 16.2 и более поздних
версиях. Устаревшее поведение
используется в более ранних
версиях Visual Studio или путем
предоставления этой ссылки.

loosefpmath.obj Недоступно Гарантирует, что код с плавающей


точкой кода допускает
нестандартные значения.

newmode.obj pnewmode.obj Вызывает malloc новый


обработчик при сбое. См. разделы
_set_new_mode, _set_new_handler,
calloc и realloc.

noarg.obj pnoarg.obj Отключает обработку аргументов


argc и argv.

nochkclr.obj Недоступно Не выполняет никаких действий.


Удалите из проекта.

noenv.obj pnoenv.obj Отключает создание


кэшированной среды для CRT.

nothrownew.obj pnothrownew.obj Позволяет использовать


внеочередную версию новых
функций в CRT. См. раздел
Операторы new и delete.

setargv.obj psetargv.obj Включает расширение аргументов


заполнителей в командной строке.
См. раздел Расширение
аргументов с подстановочными
знаками.
Машинный код и /clr Чистый режим Описание

threadlocale.obj pthreadlocale.obj Включает языковой стандарт


отдельного потока для всех новых
потоков по умолчанию.

wsetargv.obj pwsetargv.obj Включает расширение аргументов


заполнителей в командной строке.
См. раздел Расширение
аргументов с подстановочными
знаками.

См. также раздел


Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib
Потенциальные ошибки при
передаче объектов CRT через
границы DLL
Статья • 03.04.2023

Код может содержать ошибки при передаче объектов среды выполнения C (CRT),
таких как дескрипторы файлов, языковые параметры и переменные среды, в
библиотеку DLL или из нее. Вызовы функций через границу библиотеки DLL могут
привести к непредвиденному поведению, если библиотека DLL и все файлы,
вызывающие библиотеку DLL, используют разные копии библиотек CRT.

Связанная проблема может возникнуть при выделении памяти (явно с new


помощью или malloc , или неявно с strdup помощью , strstreambuf::str и т. д.), а
затем передачи указателя через границу библиотеки DLL, где она освобождается.
Такие указатели могут привести к нарушению доступа к памяти или повреждению
кучи, если библиотека DLL и ее потребители используют разные копии библиотек
CRT.

Еще одним симптомом этой проблемы является ошибка в окне вывода во время
отладки, например HEAP[]: Invalid Address specified to RtlValidateHeap(#,#)

Причины
Каждая копия библиотеки CRT имеет определенное собственное состояние,
которое хранится приложением или библиотекой DLL в локальном хранилище
потока приложения.

Объекты CRT, такие как дескрипторы файлов, переменные среды и языковые


параметры, допустимы только для копии CRT в приложении или библиотеке DLL,
где были выделены или заданы эти объекты. Если библиотека DLL и ее клиенты
используют разные копии библиотеки CRT, вы не можете ожидать, что эти объекты
CRT будут использоваться правильно при передаче через границу библиотеки DLL.

Это особенно касается версий CRT до универсальной версии CRT в Visual Studio
2015 и более поздних версий. В Visual Studio 2013 и более ранних версиях
создавались специальные библиотеки CRT для каждой версии Visual Studio.
Сведения о внутренней реализации CRT, такие как структуры данных и соглашения
об именовании, были различными в каждой версии. Динамическая компоновка
кода, скомпилированного для одной версии CRT, с другой версией библиотеки DLL
CRT никогда не поддерживалась. Иногда это будет работать, но из-за удачи, а не
дизайна.

Каждая копия библиотеки CRT имеет собственный диспетчер кучи. Это может
привести к повреждению кучи, если вы выделяете память в одной библиотеке CRT
и передаете указатель через границу библиотеки DLL для освобождения другой
копией библиотеки CRT. Если библиотека DLL передает объекты CRT через границу
библиотеки DLL или выделяет память, освобожденную за пределами библиотеки
DLL, клиенты библиотеки DLL должны использовать ту же копию библиотеки CRT,
что и библиотека DLL.

Библиотека DLL и ее клиенты используют одну и ту же копию библиотеки CRT,


только если при загрузке они будут связаны с одной и той же версией DLL CRT. Так
как библиотека DLL универсальной библиотеки CRT, используемая Visual Studio
2015 и более поздних версий, теперь является централизованно развернутой
компонентом Windows ( ucrtbase.dll ), она аналогична для приложений, созданных
с помощью Visual Studio 2015 и более поздних версий. Однако даже если код CRT
идентичен, вы не можете предоставить память, выделенную в одной куче,
компоненту, который использует другую кучу.

Пример. Передача дескриптора файла через


границу БИБЛИОТЕКи DLL

Описание
В этом примере дескриптор файла передается через границу библиотеки DLL.

Файлы DLL и .exe создаются с помощью /MD , чтобы они совместно используют
одну копию CRT.

При перестроении с /MT таким образом, чтобы они использовали отдельные копии
CRT, запуск в результате test1Main.exe приведет к нарушению доступа.

Исходный файл test1Dll.cpp DLL:

C++

// test1Dll.cpp

// compile with: cl /EHsc /W4 /MD /LD test1Dll.cpp

#include <stdio.h>

__declspec(dllexport) void writeFile(FILE *stream)

char s[] = "this is a string\n";

fprintf( stream, "%s", s );

fclose( stream );

Исполняемый исходный файл test1Main.cpp :

C++

// test1Main.cpp

// compile with: cl /EHsc /W4 /MD test1Main.cpp test1Dll.lib

#include <stdio.h>

#include <process.h>

void writeFile(FILE *stream);

int main(void)

FILE * stream;

errno_t err = fopen_s( &stream, "fprintf.out", "w" );

writeFile(stream);

system( "type fprintf.out" );

Output

this is a string

Пример. Передача переменных среды через


границу библиотеки DLL

Описание
В этом примере переменные среды передаются через границу библиотеки DLL.

Исходный файл test2Dll.cpp DLL:

C++

// test2Dll.cpp

// compile with: cl /EHsc /W4 /MT /LD test2Dll.cpp

#include <stdio.h>

#include <stdlib.h>

__declspec(dllexport) void readEnv()

char *libvar;

size_t libvarsize;

/* Get the value of the MYLIB environment variable. */

_dupenv_s( &libvar, &libvarsize, "MYLIB" );

if( libvar != NULL )


printf( "New MYLIB variable is: %s\n", libvar);

else

printf( "MYLIB has not been set.\n");

free( libvar );

Исполняемый исходный файл test2Main.cpp :

C++

// test2Main.cpp

// compile with: cl /EHsc /W4 /MT test2Main.cpp test2dll.lib

#include <stdlib.h>

#include <stdio.h>

void readEnv();

int main( void )

_putenv( "MYLIB=c:\\mylib;c:\\yourlib" );

readEnv();

Output

MYLIB has not been set.

Если вы создаете файлы DLL и EXE с помощью /MD , чтобы использовать только
одну копию CRT, программа успешно запустится и выведет следующие выходные
данные:

Output

New MYLIB variable is: c:\mylib;c:\yourlib

См. также раздел


Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib
Инициализация CRT
Статья • 03.04.2023

В этой статье описывается, как CRT инициализирует глобальное состояние в


машинном коде.

По умолчанию компоновщик включает библиотеку CRT, которая предоставляет


собственный код запуска. Этот код запуска инициализирует библиотеку CRT,
вызывает глобальные инициализаторы и затем вызывает предоставленную
пользователем функцию main для консольных приложений.

Хотя это и не рекомендуется, чтобы воспользоваться преимуществами поведения


компоновщика майкрософт для вставки собственных глобальных инициализаторов
в определенном порядке. Этот код не является переносимым и содержит
некоторые важные предостережения.

Инициализация глобального объекта


Рассмотрим следующий код.

int func(void)

return 3;

int gi = func();

int main()

return gi;

В соответствии со стандартом C/C++, функцию func() необходимо вызывать перед


выполнением функции main() . Однако кто ее вызывает?

Одним из способов определить вызывающий объект является установка точки


останова, func() отладка приложения и изучение стека. Возможно, так как
исходный код CRT входит в состав Visual Studio.

При просмотре функций в стеке вы увидите, что CRT вызывает список указателей
функций. Эти функции похожи на func() конструкторы для экземпляров классов.
CRT получает список указателей функций из компилятора Microsoft C++. Когда
компилятор видит глобальный инициализатор, он создает динамический
инициализатор в .CRT$XCU разделе, где CRT имя раздела и XCU является именем
группы. Чтобы получить список динамических инициализаторов, выполните
команду dumpbin /all main.obj и выполните поиск в .CRT$XCU разделе. Эта команда
применяется только при main.cpp компиляции в виде файла C++, а не файла C. Он
должен быть похож на этот пример:

Командная строка Windows

SECTION HEADER #6

.CRT$XCU name

0 physical address

0 virtual address

4 size of raw data

1F2 file pointer to raw data (000001F2 to 000001F5)

1F6 file pointer to relocation table

0 file pointer to line numbers

1 number of relocations

0 number of line numbers

40300040 flags

Initialized Data

4 byte align

Read Only

RAW DATA #6

00000000: 00 00 00 00 ....

RELOCATIONS #6

Symbol Symbol

Offset Type Applied To Index Name

-------- ---------------- ----------------- -------- -------

00000000 DIR32 00000000 C ??__Egi@@YAXXZ


(void __cdecl `dynamic initializer for 'gi''(void))

CRT определяет два указателя:

__xc_a в .CRT$XCA

__xc_z в .CRT$XCZ

Ни у одной группы не определены другие символы, кроме __xc_a и __xc_z .

Теперь, когда компоновщик считывает различные .CRT подразделы (часть после),


$ она объединяет их в одном разделе и упорядочивает их в алфавитном порядке.
Это означает, что определяемые пользователем глобальные инициализаторы
(которые компилятор Microsoft C++ помещает) .CRT$XCU всегда приходят после
.CRT$XCA и до .CRT$XCZ .
Раздел должен выглядеть примерно так:

asm

.CRT$XCA

__xc_a

.CRT$XCU

Pointer to Global Initializer 1

Pointer to Global Initializer 2

.CRT$XCZ

__xc_z

Таким образом, библиотека CRT использует и __xc_a __xc_z для определения


начала и окончания списка глобальных инициализаторов из-за того, как они
размещаются в памяти после загрузки образа.

Функции компоновщика для инициализации


Стандарт C++ не предоставляет соответствующий способ указать относительный
порядок между единицами перевода для предоставленного пользователем
глобального инициализатора. Однако, так как компоновщик Майкрософт
упорядочивает .CRT подразделы в алфавитном порядке, можно воспользоваться
этим заказом, чтобы указать порядок инициализации. Мы не рекомендуем
использовать этот метод, зависящий от Майкрософт, и он может прервать выпуск в
будущем выпуске. Мы задокументировали его только для того, чтобы вы не
создавали код, который не усложнялся диагностикой.

Чтобы предотвратить проблемы в коде, начиная с Visual Studio 2019 версии 16.11,
мы добавили два новых предупреждения по умолчанию: C5247 и C5248. Включите
эти предупреждения для обнаружения проблем при создании собственных
инициализаторов.

Вы можете добавить инициализаторы в неиспользуемые зарезервированные


имена разделов, чтобы создать их в определенном относительном порядке для
созданных компилятором динамических инициализаторов:

C++

#pragma section(".CRT$XCT", read)

// 'i1' is guaranteed to be called before any compiler generated C++ dynamic


initializer

__declspec(allocate(".CRT$XCT")) type i1 = f;

#pragma section(".CRT$XCV", read)

// 'i2' is guaranteed to be called after any compiler generated C++ dynamic


initializer

__declspec(allocate(".CRT$XCV")) type i2 = f;

Имена .CRT$XCT и .CRT$XCV не используются компилятором или библиотекой CRT


прямо сейчас, но нет никакой гарантии, что они останутся неиспользуемыми в
будущем. И переменные по-прежнему могут быть оптимизированы компилятором.
Прежде чем применять этот метод, рассмотрите потенциальные проблемы
проектирования, обслуживания и переносимости.

См. также раздел


C runtime (CRT) и C++ Standard Library (STL) .lib files
Глобальное состояние в CRT
Статья • 03.04.2023

Некоторые функции в универсальной среде выполнения C (UCRT) используют


глобальное состояние. Например, setlocale() задает языковой стандарт для всей
программы, который влияет на разделители цифр, текстовую кодовую страницу и
т. д.

Глобальное состояние UCRT не совместно используется между приложениями и


ОПЕРАЦИОННОй системой. Например, если приложение вызывает setlocale() , он
не повлияет на языковой стандарт для компонентов ОС, использующих время
выполнения C, или наоборот.

Версии функций CRT для конкретных ОС


В UCRT функции, взаимодействующие с глобальным состоянием, имеют функцию
"двойника" с префиксом _o_ . Например:

setlocale() влияет на глобальное состояние приложения.

_o_setlocale() влияет на глобальное состояние, совместно используемое


всеми компонентами ОС, но не приложениями.

Единственное различие между этими функциями двойников заключается в том, что


при чтении и записи глобального состояния CRT версии для конкретной ОС (то есть
версии, начинающиеся с _o_ ) используют копию глобального состояния ОС вместо
копии глобального состояния приложения.

Версии этих функций зависят от ucrt.osmode.lib операционной системы. Например,


версия операционной системы зависит от конкретной setlocale() ос
_o_setlocale()

Существует два способа изолировать состояние CRT компонента от состояния CRT


приложения:

Статически свяжите компонент с помощью параметров /MT компилятора


(выпуск) или /MTd (отладка). Дополнительные сведения см. в разделе /MD,
/MT, /LD. Статическое связывание может значительно увеличить двоичный
размер.
Начиная с версий Windows, начиная с Windows 10 версии 2004, динамически
связываются с CRT, но вызывают экспорты в режиме ОС (функции,
начинающиеся с o). Чтобы вызвать экспорт в режиме ОС, статически свяжите
как и раньше, но игнорируйте статический UCRT с помощью параметра
/NODEFAULTLIB:libucrt.lib компоновщика (выпуска) или
/NODEFAULTLIB:libucrtd.lib (отладки). И добавьте ucrt.osmode.lib в входные

данные компоновщика. Дополнительные сведения см. в разделе


/NODEFAULTLIB (игнорировать библиотеки ).

7 Примечание

В исходном коде напишите setlocale() , а не _o_setlocale() . При связывании


со ucrt.osmode.lib ссылкой компоновщик автоматически подставляет версию
функции для конкретной ОС. То есть setlocale() будет заменено
_o_setlocale() на .

Связывание отключает ucrt.osmode.lib некоторые вызовы UCRT, доступные только


в режиме приложения. Попытка вызова этих функций приведет к ошибке ссылки.

Глобальное состояние, затронутое


разделением приложений и ОС
Глобальное состояние, затронутое разделением состояния приложения и ОС,
включает:

Данные языкового стандарта


Обработчики сигналов, заданные по signal
Процедуры завершения, заданные по terminate
errno и _doserrno
Состояние создания случайного числа, используемое rand и srand
Функции, возвращающие буфер, который пользователю не нужно
освобождать: strtok, wcstok_mbstok

Tmpnam, _wtmpnam

asctime, _wasctime

gmtime, _gmtime32, _gmtime64

_fcvt

_ecvt

strerror, _strerror, _wcserror, __wcserror


Буфер, используемый параметром_putch , _putwch
_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler
_set_new_handler и _set_new_mode
fmode
Сведения часового пояса

См. также раздел


Справочник по библиотеке C Run-Time
Математические символы
универсального типа
Статья • 03.04.2023

Для стандарта ISO C 11 (C11) и более поздних версий <tgmath.h> заголовок в


дополнение к включению <math.h> и <complex.h> предоставляет макросы, которые
вызывают соответствующую математическую функцию на основе типов
параметров.

Математические функции библиотеки среды выполнения C доступны в реальных и


сложных вариантах. Каждый вариант имеет три варианта в зависимости от типа
аргумента: float , double и long double . Так как C не поддерживает перегрузку,
например C++, у каждого варианта есть другое имя. Например, чтобы получить
абсолютное значение реального значения с плавающей запятой, вызовите
fabsf fabs либо , либо fabsl в зависимости от того, передаете float ли вы значение

double или long double значение соответственно. Чтобы получить комплексное


абсолютное значение, вызовите одно из cabsf cabs , или cabsl в зависимости от
того, передаете float ли вы значение , double и long double комплексное значение
соответственно. Если аргументы не соответствуют ни одному из указанных выше
типов, функция выбирается так, как если бы аргументы были двойными.

<tgmath.h> содержит макросы, упрощающие выбор правильной математической


функции для вызова. Макросы проверяют тип, который они передаются, а затем
вызывают правильную функцию. Например, sqrt макрос привязывается,
sqrtf() но привязывается sqrt(9.9f) sqrt(9.9) к sqrt() . Если хотя бы один
аргумент макроса для универсального параметра является сложным, макрос
привязывается к сложной функции; в противном случае она вызывает реальную
функцию.

Макросы универсального типа позволяют писать более переносимый <tgmath.h>


код, так как вам не нужно управлять приведением или выбирать разные имена
функций в зависимости от типа аргумента.

Эти макросы находятся в собственном заголовке, чтобы программы, написанные с


помощью заголовка <math.h> , не прерывались. Поэтому double x = sin(42); ведет
себя так, как всегда есть при включении <math.h>. Несмотря на это, большинство
существующих программ C, как ожидается, не затрагиваются, если <tgmath.h>
заголовок включен вместо <math.h> него. <complex.h>
В следующей таблице перечислены макросы, доступные и <tgmath.h> развернутые
в них. modf не включен в эту таблицу, так как он не имеет соответствующего
универсального макроса типа, так как не ясно, как сделать его безопасным без
усложнения разрешения типов.

Макрос Реальные
Реальные
Реальные
Комплекс
Комплекс
Комплекс

float double long double float double long double

acos acosf acos acosl cacosf cacos cacosl

acosh acoshf acosh acoshl cacoshf cacosh cacoshl

asin asinf asin asinl casinf casin casinl

asinh asinhf asinh asinhl casinhf casinh casinhl

atan atanf atan atanl catanf catan catanl

atanh atanhf atanh atanhl catanhf catanh catanhl

cos cosf cos cosl ccosf ccos ccosl

cosh coshf cosh coshl ccoshf ccosh ccoshl

exp expf exp expl cexpf cexp cexpl

fabs fabsf fabs fabsl cabsf cabs cabsl

log logf log logl clogf clog clogl

pow powf pow powl cpowf cpow cpowl

sin sinf sin sinl csinf csin csinl

sinh sinhf sinh sinhl csinhf csinh csinhl

sqrt sqrtf sqrt sqrtl csqrtf csqrt csqrtl

tan tanf tan tanl ctanf ctan ctanl

tanh tanhf tanh tanhl ctanhf ctanh ctanhl

atan2 atan2f atan2 atan2l - - -

cbrt cbrtf cbrt cbrtl - - -

ceil ceilf ceil ceill - - -

copysign copysignf copysign copysignl - - -

erf erff erf erfl - - -


Макрос Реальные
Реальные
Реальные
Комплекс
Комплекс
Комплекс

float double long double float double long double

erfc erfcf erfc erfcl - - -

exp2 exp2f exp2 exp2l - - -

expm1 expm1f expm1 expm1l - - -

fdim fdimf fdim fdiml - - -

floor floorf floor floorl - - -

fma fmaf fma fmal - - -

fmax fmaxf fmax fmaxl - - -

fmin fminf fmin fminl - - -

fmod fmodf fmod fmodl - - -

frexp frexpf frexp frexpl - - -

hypot hypotf hypot hypotl - - -

ilogb ilogbf ilogb ilogbl - - -

ldexp ldexpf ldexp ldexpl - - -

lgamma lgammaf lgamma lgammal - - -

llrint llrintf llrint llrintl - - -

llround llroundf llround llroundl - - -

log10 log10f log10 log10l - - -

log1p log1pf log1p log1pl - - -

log2 log2f log2 log2l - - -

logb logbf logb logbl - - -

lrint lrintf lrint lrintl - - -

lround lroundf lround lroundl - - -

nearbyint nearbyintf nearbyint nearbyintl - - -

nextafter nextafterf nextafter nextafterl - - -

nexttoward nexttowardf nexttoward nexttowardl - - -


Макрос Реальные
Реальные
Реальные
Комплекс
Комплекс
Комплекс

float double long double float double long double

remainder remainderf remainder remainderl - - -

remquo remquof remquo remquol - - -

rint rintf rint rintl - - -

round roundf round roundl - - -

scalbln scalblnf scalbln scalblnl - - -

scalbn scalbnf scalbn scalbnl - - -

tgamma tgammaf tgamma tgammal - - -

trunc truncf trunc truncl - - -

carg - - - cargf carg cargl

conj - - - conjf conj conjl

creal - - - crealf creal creall

cimag - - - cimagf cimag cimagl

cproj - - - cprojf cproj cprojl

Требования
Выполните сборку с помощью команды /std:c11.

Пакет Windows SDK 10.0.20348.0 (версия 2104) или выше. Скачать последнюю


версию Windows SDK можно здесь. Инструкции по установке и использованию
пакета SDK для разработки C11 и C17 см. в статье Включение поддержки C11 и C17
в Visual Studio.

См. также раздел


Справочник по библиотеке C Run-Time
Файлы среды выполнения C (CRT) и
стандартной библиотеки C++ (STL)
.lib
Статья • 03.04.2023

В этой статье перечислены файлы библиотеки .lib среды выполнения Microsoft C,


с которыми можно связаться при разработке приложения, а также связанные с
ними параметры компилятора и директивы препроцессора.

Сведения о развертывании файлов среды выполнения C, необходимых для


поддержки приложения, см. в статье Распространение файлов Visual C++ .

Если вам нужен справочник по API для библиотеки среды выполнения C, см. статью
Справочник по библиотеке среды выполнения C.

7 Примечание

Реализацию стандартной библиотеки C++ корпорации Майкрософт часто


называют STL или стандартной библиотекой шаблонов. Хотя стандартная
библиотека C++ является официальным именем библиотеки, как определено
в ISO 14882, из-за популярного использования "STL" и "стандартной
библиотеки шаблонов" в поисковых системах, мы иногда используем эти
имена, чтобы упростить поиск нашей документации.

С исторической точки зрения, "STL" первоначально относится к стандартной


библиотеке шаблонов, написанной Александром Степановым. Части этой
библиотеки были стандартизированы в стандартной библиотеке C++. Стандартная
библиотека также включает библиотеку среды выполнения ISO C, части
библиотеки Boost и другие функции. Иногда "STL" используется для обозначения
контейнеров и алгоритмов стандартной библиотеки C++, адаптированной на
основе STL Стефанова. В этой документации стандартная библиотека шаблонов
(STL) относится к стандартной библиотеке C++ в целом.

Файлы среды выполнения .lib C


Стандартная библиотека ISO C является частью стандартной библиотеки C++.
Библиотеки Visual C++, которые реализуют CRT, поддерживают разработку с
использованием машинного кода, а также сочетания машинного и управляемого
кода. Все версии библиотек CRT поддерживают разработку многопоточного кода.
Большинство библиотек поддерживает как статическое связывание (для
связывания библиотеки непосредственно в коде), так и динамическое связывание
(для использования в коде общих библиотек DLL).

В Visual Studio 2015 CRT был рефакторингован в новые двоичные файлы.


Универсальная библиотека CRT (UCRT) содержит функции и глобальные
переменные, экспортируемые стандартной библиотекой CRT C99. UCRT теперь
является компонентом Windows и поставляется в составе Windows 10 и более
поздних версий. Статическая библиотека, библиотека импорта DLL и файлы
заголовков для UCRT теперь находятся в windows SDK. При установке Visual C++
программа установки Visual Studio устанавливает подмножество windows SDK,
необходимое для использования UCRT. Библиотеку UCRT можно использовать в
любой версии Windows, поддерживаемой Visual Studio 2015 и более поздними
версиями. Вы можете распространить его с помощью vcredist для поддерживаемых
версий Windows, отличных от Windows 10 или более поздних версий.
Дополнительные сведения см. в разделе Распространение файлов Visual C++.

В следующей таблице перечислены библиотеки, которые реализуют UCRT.

Библиотека Связанная Характеристики Параметр Директивы


DLL препроцессора

libucrt.lib Нет Статически связывает UCRT в /MT _MT


коде.

libucrtd.lib Нет Отладочная версия UCRT для /MTd _DEBUG , _MT


статического связывания.
Нераспространяемый
компонент.

ucrt.lib ucrtbase.dll DLL-библиотека импорта для /MD _MT , _DLL


UCRT.

ucrtd.lib ucrtbased.dll DLL-библиотека импорта для /MDd _DEBUG , _MT ,


отладочной версии UCRT. _DLL
Нераспространяемый
компонент.

Библиотека vcruntime содержит код, зависящий от реализации Visual C++ CRT:


поддержку обработки исключений и отладки, проверки среды выполнения и
сведения о типе, сведения о реализации и некоторые расширенные функции
библиотеки. Версия библиотеки vcruntime должна соответствовать версии
используемого компилятора.
В этой таблице перечислены библиотеки, которые реализуют библиотеку
vcruntime.

Библиотека Связанная DLL Характеристики Параметр Директивы


препроцессора

libvcruntime.lib Нет Статически связанная /MT _MT


с кодом.

libvcruntimed.lib Нет Отладочная версия /MTd _MT , _DEBUG


для статического
связывания.
Нераспространяемый
компонент.

vcruntime.lib vcruntime<version>.dll DLL-библиотека /MD _MT , _DLL


импорта для
vcruntime.

vcruntimed.lib vcruntime<version>d.dll DLL-библиотека /MDd _DEBUG , _MT ,


импорта для _DLL
отладочной версии
vcruntime.
Нераспространяемый
компонент.

7 Примечание

При рефакторинге UCRT функции среды выполнения с параллелизмом были


перемещены в concrt140.dll , который был добавлен в распространяемый
пакет C++. Эта библиотека DLL необходима для параллельных контейнеров и
алгоритмов C++, таких как concurrency::parallel_for . Кроме того, стандартная
библиотека C++ требует, чтобы эта библиотека DLL в Windows XP
поддерживала примитивы синхронизации, так как в Windows XP нет
переменных условий.

Код, инициализирующий CRT, находится в одной из нескольких библиотек в


зависимости от статического или динамического связывания библиотеки CRT и
использования машинного, управляемого или смешанного кода. Этот код
обрабатывает запуск, инициализацию внутренних данных потоков и завершение
CRT. Это зависит от используемой версии компилятора. Эта библиотека всегда
статически связана, даже при использовании динамически связанной библиотеки
UCRT.
В этой таблице перечислены библиотеки, которые реализуют инициализацию и
завершение CRT.

Библиотека Характеристики Параметр Директивы


препроцессора

libcmt.lib Статически связывает в коде запуск CRT /MT _MT


машинного кода.

libcmtd.lib Статически связывает отладочную версию /MTd _DEBUG , _MT


запуска CRT в машинном коде.
Нераспространяемый компонент.

msvcrt.lib Статическая библиотека для запуска CRT в /MD _MT , _DLL


машинном коде для использования с DLL,
UCRT и vcruntime.

msvcrtd.lib Статическая библиотека для запуска /MDd _DEBUG , _MT ,


отладочной версии CRT в машинном коде для _DLL
использования с DLL, UCRT и vcruntime.
Нераспространяемый компонент.

msvcmrt.lib Статическая библиотека для запуска CRT в /clr


смешанном машинном и управляемом коде
для использования с DLL, UCRT и vcruntime.

msvcmrtd.lib Статическая библиотека для запуска /clr


отладочной версии CRT в смешанном
машинном и управляемом коде для
использования с DLL, UCRT и vcruntime.
Нераспространяемый компонент.

msvcurt.lib Нерекомендуемая статическая библиотека /clr:pure


для CRT с полностью управляемым кодом.

msvcurtd.lib Нерекомендуемая статическая библиотека /clr:pure


для отладочной версии CRT с полностью
управляемым кодом. Нераспространяемый
компонент.

При связывании программы из командной строки без параметра компилятора,


указывающего библиотеку среды выполнения C, компоновщик будет использовать
статически связанные библиотеки CRT: libcmt.lib , libvcruntime.lib и libucrt.lib .

Использование статически скомпонованных CRT означает, что все сведения о


состоянии, сохраненные библиотекой времени выполнения C, будут локальны по
отношению к этому экземпляру CRT. Например, при использовании strtok
статически связанной strtok CRT позиция средства синтаксического анализа не
связана с strtok состоянием, используемым в коде в том же процессе (но в другой
библиотеке DLL или EXE), связанном с другим экземпляром статической CRT.
Напротив, динамически скомпонованная библиотека CRT позволяет использовать
состояние всему коду в процессе, который динамически скомпонован с этой
библиотекой CRT. Эта проблема не применяется, если вы используете новые более
безопасные версии этих функций; например, strtok_s не имеет этой проблемы.

Так как библиотека DLL, созданная путем связывания со статической CRT, имеет
собственное состояние CRT, не рекомендуется связывать статически с CRT в
библиотеке DLL, если последствия не понятны и не нужны. Например, при вызове
_set_se_translator в исполняемом файле, который загружает библиотеку DLL,
связанную с собственной статической CRT, все аппаратные исключения, созданные
кодом в библиотеке DLL, не будут перехватываемы переводчиком, но аппаратные
исключения, созданные кодом в основном исполняемом файле, будут
перехватываться.

Если вы используете параметр компилятора /clr , код будет связан со статической


библиотекой msvcmrt.lib . Эта статическая библиотека предоставляет функцию
прокси между управляемым кодом и неуправляемой средой CRT. Вы не можете
использовать статически связанную CRT ( /MT или /MTd параметры) с /clr . Вместо
этого используйте динамически связанные библиотеки ( /MD или /MDd ). Полностью
управляемые библиотеки CRT отмечены как нерекомендуемые для использования
в Visual Studio 2015 и не поддерживаются в Visual Studio 2017.

Дополнительные сведения об использовании CRT с /clr см. в разделе Смешанные


(собственные и управляемые) сборки.

Чтобы создать отладочную версию приложения, _DEBUG необходимо определить


флаг и связать приложение с отладочной версией одной из этих библиотек.
Дополнительные сведения об использовании отладочных версий файлов
библиотеки см. в статье Методы отладки CRT.

Эта версия CRT не полностью соответствует стандарту C99. В версиях до Visual


Studio 2019 версии 16.8 <tgmath.h> заголовок не поддерживается. Во всех версиях
CX_LIMITED_RANGE макросы и FP_CONTRACT pragma не поддерживаются. Некоторые

элементы, такие как значения спецификаторов параметров в стандартных


функциях ввода-вывода, по умолчанию используют интерпретации прежних
версий. Вы можете использовать /Zc параметры соответствия компилятора и
указать параметры компоновщика для управления некоторыми аспектами
соответствия библиотек.
Файлы стандартной библиотеки C++ (STL)
.lib
Стандартная Характеристики Параметр Директивы
библиотека препроцессора
C++

libcpmt.lib Многопоточная, статическая компоновка. /MT _MT

msvcprt.lib Многопоточность, динамическая ссылка /MD _MT , _DLL


(импорт библиотеки для
msvcp<version>.dll )

libcpmtd.lib Многопоточная, статическая компоновка. /MTd _DEBUG , _MT

msvcprtd.lib Multithreaded, dynamic link (import library /MDd _DEBUG , _MT ,


for msvcp<version>d.dll ) _DLL

При сборке версии выпуска проекта одна из базовых библиотек среды


выполнения C ( libcmt.lib , msvcmrt.lib , msvcrt.lib ) связана по умолчанию в
зависимости от выбранного параметра компилятора (многопоточный, DLL, /clr ).
Если включить в код один из файлов заголовков стандартной библиотеки C++ ,
стандартная библиотека C++ будет автоматически связана с помощью Visual C++
во время компиляции. Пример:

C++

#include <ios>

Для совместимости на уровне двоичного кода одна библиотека импорта может


задавать несколько DLL-файлов. Обновления версий могут ввести библиотеки
dot — отдельные DLL-файлы, которые вводят новые функции библиотеки.
Например, в Visual Studio 2017 версии 15.6 реализована msvcp140_1.dll поддержка
более стандартных функций библиотек без нарушения двоичного интерфейса
приложения (ABI), поддерживаемого msvcp140.dll . Библиотека импорта,
включенная msvcprt.lib в набор инструментов для Visual Studio 2017 версии 15.6,
поддерживает обе библиотеки DLL, а vcredist для этой версии устанавливает обе
библиотеки DLL. После доставки библиотека dot имеет фиксированный ABI и
никогда не будет зависеть от библиотеки dot более поздней версии.
Если приложение использует несколько
версий CRT, с какими проблемами можно
столкнуться?
С каждым исполняемым образом (EXE или DLL) может статически связываться
собственная библиотека CRT. В образе может создаваться динамическая ссылка на
CRT. Версия CRT статически включена или динамически загружается в зависимости
от версии средств и библиотек, в которой она был создана. В рамках одного
процесса может загружаться несколько образов EXE и DLL, каждый с собственной
библиотекой CRT. Распределители, внутренние структуры макета и варианты
организации хранилища для этих CRT могут быть разными. Это означает, что
выделенная память, ресурсы CRT или классы, передаваемые через границу
библиотеки DLL, могут вызвать проблемы с управлением памятью, внутренним
статическим использованием или интерпретацией макета. Например, если класс
выделен в одной библиотеке DLL, но передан в другую и удален, какой
используется метод освобождения CRT? Вызванные ошибки могут варьироваться
от незначительных до немедленного неустранимого, поэтому не рекомендуется
прямая передача таких ресурсов.

Многие из этих проблем можно избежать, используя технологии двоичного


интерфейса приложения (ABI), так как они предназначены для обеспечения
стабильной и версиообразуемой версии. Разрабатывайте ваши интерфейсы
экспорта DLL для передачи информации в виде значения или для работы в памяти,
которая передается вызывающим объектом, а не в локально выделенной памяти,
которая возвращается вызывающей стороне. Используйте методы маршалинга для
копирования структурированных данных между исполняемыми образами.
Инкапсулируйте ресурсы локально и допускайте действия только через
дескрипторы или функции, которые вы предоставляете клиентам.

Кроме того, вы можете избежать некоторых из этих проблем, если для всех
образов в процессе будет использоваться одна и та же версия динамически
загружаемой библиотеки CRT. Чтобы убедиться, что все компоненты используют
одну и ту же версию библиотеки DLL CRT, выполните сборку /MD с помощью
параметра и используйте один набор инструментов компилятора и параметры
свойств.

Будьте внимательны, если программа передает определенные ресурсы CRT через


границы DLL. Ресурсы, такие как дескрипторы файлов, языковые стандарты и
переменные среды, могут вызвать проблемы даже при использовании одной и той
же версии CRT. Дополнительные сведения о проблемах и способах их устранения
см. в статье Потенциальные ошибки при передаче объектов CRT через границы
DLL.

См. также раздел


Справочник по библиотеке времени выполнения C

Распространение файлов Visual C++


Подпрограммы универсальной среды
выполнения C по категориям
Статья • 03.04.2023

В этом разделе перечислены подпрограммы библиотеки универсальной среды


выполнения C (UCRT) по категориям. Для удобства пользования справочником
некоторые подпрограммы присутствуют в нескольких категориях. Подпрограммы
для работы с многобайтовыми символами и расширенными символами
сгруппированы с их аналогами для однобайтовых символов, если последние
существуют.

Категории подпрограмм библиотеки UCRT


Основные категории подпрограмм библиотеки времени выполнения UCRT:

Доступ к аргументам
Операции с буфером
Классификация байтов
Классификация символов
Поддержка сложных математических выражений
Выравнивание данных
Преобразование данных
Подпрограммы отладки
Управление каталогами
Обработка ошибок
Процедуры обработки исключений
Обработка файлов
Поддержка математических функций для чисел с плавающей запятой
Ввод и вывод
Интернационализация
Выделение памяти
Управление процессами и средой
Устойчивость
Проверка ошибок во время выполнения
Сортировка и поиск
Обработка строк
Системные вызовы
Управление временем
См. также раздел
Справочник по библиотеке времени выполнения C
Доступ к аргументам
Статья • 03.04.2023

Макросы va_arg , va_end , и va_start предоставляют доступ к аргументам функций,


когда число аргументов является переменным. Эти макросы определены в
<stdarg.h> для совместимости ANSI/ISO C и в <varargs.h> для обеспечения
совместимости с UNIX System V.

Макросы для доступа к аргументам


Макрос Использование

va_arg Извлечение аргумента из списка

va_end Сброс указателя

va_start Установка указателя на начало списка аргументов

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Операции с буфером
Статья • 03.04.2023

Используйте эти подпрограммы для побайтной работы с областями памяти.

Подпрограммы для операций с буфером


Подпрограмма Использование

_memccpy Копирование символов из одного буфера в другой, пока


указанный символ или заданное число символов не будут
скопированы

memchr, wmemchr Возвращение указателя к первому вхождению указанного


символа в буфере в пределах указанного числа символов

memcmp, wmemcmp Сравнение указанного количество символов из двух буферов

memcpy, wmemcpy, Копирование указанного количество символов из одного буфера


memcpy_s, wmemcpy_s в другой

_memicmp, _memicmp_l Сравнение указанного количества символов из двух буферов без


учета регистра

memmove, Копирование указанного количество символов из одного буфера


wmemmove,memmove_s, в другой
wmemmove_s

memset, wmemset Использование указанного символа для инициализации


указанного числа байтов в буфере

_swab Смена байтов данных и сохранение их в указанном


расположении

При перекрытии исходной и целевой областей только memmove гарантированно


скопирует полный исходный код правильно.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Классификация байтов
Статья • 03.04.2023

Каждая из этих подпрограмм проверяет указанный байт многобайтового символа


на соответствие условию. Если это не указано в противном случае, выходное
значение зависит от параметра LC_CTYPE категории языкового стандарта. Для
получения дополнительной информации см. setlocale. Версии этих функций без
суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта.

7 Примечание

По определению символы между 0 и 127 кодировки ASCII являются


подмножеством всех многобайтовых кодировок. Например, японская
кодировка катакана содержит как символы ASCII, так и другие символы.

Предопределенные константы в следующей таблице определены в <ctype.h> .

Подпрограммы классификации байтов


многобайтовых символов
Подпрограмма Условие проверки байта

isleadbyte, Старший байт; результат теста зависит от значения категории LC_CTYPE


_isleadbyte_l текущего языкового стандарта

_ismbbalnum, isalnum || _ismbbkalnum


_ismbbalnum_l

_ismbbalpha, isalpha || _ismbbkalpha


_ismbbalpha_l

_ismbbgraph, То же, что _ismbbprint _ismbbgraph и символ пробела (0x20)


_ismbbgraph_l

_ismbbkalnum, Не входящий в набор ASCII текстовый символ, отличный от знака


_ismbbkalnum_l препинания. Например, только для кодовой страницы 932, функция
_ismbbkalnum проверяет на принадлежность к алфавитно-цифровым
символам катаканы
Подпрограмма Условие проверки байта

_ismbbkana, Катакана (0xA1–0xDF), только для кодовой страницы 932


_ismbbkana_l

_ismbbkprint, Не входящие в набор ASCII текстовые и пунктуационные символы.


_ismbbkprint_l Например, только для кодовой страницы 932, _ismbbkprint проверяет на
принадлежность к алфавитно-цифровым или пунктуационным символам
катаканы (диапазон: 0xA1–0xDF).

_ismbbkpunct, Не входящий в набор ASCII знак препинания. Например, только для


_ismbbkpunct_l кодовой страницы 932, _ismbbkpunct проверяет на принадлежность к
пунктуационным символам катаканы.

_ismbblead, Первый байт многобайтового символа. Например, только для кодовой


_ismbblead_l страницы 932, допустимые диапазоны: 0x81–0x9F, 0xE0–0xFC.

_ismbbprint, isprint || _ismbbkprint . ismbbprint содержит символ пробела (0x20)


_ismbbprint_l

_ismbbpunct, ispunct || _ismbbkpunct


_ismbbpunct_l

_ismbbtrail, Второй байт многобайтового символа. Например, только для кодовой


_ismbbtrail_l страницы 932, допустимые диапазоны: 0x40–0x7E, 0x80–0xEC.

_ismbslead, Старший байт (в контексте строк)


_ismbslead_l

ismbstrail, Младший байт (в контексте строк)


_ismbstrail_l

_mbbtype, Возвращает тип байта, основываясь на предыдущем байте


_mbbtype_l

_mbsbtype, Возвращает тип байта в строке


_mbsbtype_l

mbsinit Отслеживает состояние преобразования многобайтового символа.

Макрос MB_LEN_MAX , определенный в <limits.h> , расширяется до максимальной


длины в байтах, которые может иметь любой многобайтовый символ. MB_CUR_MAX ,
определенный в <stdlib.h> , расширяется до максимальной длины в байтах любого
многобайтового символа в текущем языковом стандарте.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Классификация символов
Статья • 03.04.2023

Каждая из этих подпрограмм проверяет указанный однобайтовый, расширенный


или многобайтовый символ на соответствие определенному условию. (По
определению, набор символов ASCII от 0 до 127 — это подмножество всех
многобайтовых наборов символов. Например, японский катакана включает как
символы ASCII, так и не ASCII.)

Условия теста влияют на настройку LC_CTYPE параметра категории языкового


стандарта. Для получения дополнительной информации см. setlocale. Версии этих
функций без суффикса _l используют текущий языковой стандарт для данного
поведения, зависимого от языкового стандарта. Версии с суффиксом _l
идентичны, однако они используют переданный параметр языкового стандарта.

Обычно эти подпрограммы выполняются быстрее, чем написанные вами тесты, и


им следует отдавать предпочтение. Например, следующий код выполняется
медленнее, чем вызов isalpha(c) :

if ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'))

return TRUE;

Подпрограммы классификации символов


Подпрограмма Условие теста символа

isalnum, iswalnum, _isalnum_l, _iswalnum_l, Буквенно-цифровой


_ismbcalnum, _ismbcalnum_l, _ismbcalpha,
_ismbcalpha_l, _ismbcdigit, _ismbcdigit_l

_ismbcalnum, _ismbcalnum_l, _ismbcalpha, Многобайтовый буквенно-цифровой


_ismbcalpha_l, _ismbcdigit, _ismbcdigit_l

isalpha, iswalpha, _isalpha_l, _iswalpha_l, По алфавиту


_ismbcalnum, _ismbcalnum_l, _ismbcalpha,
_ismbcalpha_l, _ismbcdigit, _ismbcdigit_l

isascii, __isascii, iswascii ASCII

isblank, iswblank, _isblank_l, _iswblank_l, Пробелы или символы горизонтальной


_ismbcsblank, _ismbcsblank_l табуляции
Подпрограмма Условие теста символа

iscntrl, iswcntrl, _iscntrl_l, _iswcntrl_l Control

iscsym, iscsymf, __iscsym, __iswcsym, __iscsymf, Буква, символ подчеркивания или цифра
__iswcsymf, _iscsym_l, _iswcsym_l, _iscsymf_l,
_iswcsymf_l

iscsym, iscsymf, __iscsym, __iswcsym, __iscsymf, Буква или символ подчеркивания


__iswcsymf, _iscsym_l, _iswcsym_l, _iscsymf_l,
_iswcsymf_l

isdigit, iswdigit, _isdigit_l, _iswdigit_l, _ismbcalnum, Десятичная цифра


_ismbcalnum_l, _ismbcalpha, _ismbcalpha_l,
_ismbcdigit, _ismbcdigit_l

isgraph, iswgraph, _isgraph_l, _iswgraph_l, Любые печатные символы, кроме


_ismbcgraph, _ismbcgraph_l, _ismbcprint, пробела
_ismbcprint_l, _ismbcpunct, _ismbcpunct_l,
_ismbcblank, _ismbcblank_l, _ismbcspace,
_ismbcspace_l

islower, iswlower, _islower_l, _iswlower_l, Строчные буквы


_ismbclower, _ismbclower_l, _ismbcupper,
_ismbcupper_l

_ismbchira, _ismbchira_l, _ismbckata, _ismbckata_l Хирагана

_ismbchira, _ismbchira_l, _ismbckata, _ismbckata_l Катакана

_ismbclegal, _ismbclegal_l, _ismbcsymbol, Допустимый многобайтовый символ


_ismbcsymbol_l

_ismbcl0, _ismbcl0_l, _ismbcl1, _ismbcl1_l, _ismbcl2, Японский многобайтовый символ уровня


_ismbcl2_l 0

_ismbcl0, _ismbcl0_l, _ismbcl1, _ismbcl1_l, _ismbcl2, Японский многобайтовый символ уровня


_ismbcl2_l 1

_ismbcl0, _ismbcl0_l, _ismbcl1, _ismbcl1_l, _ismbcl2, Японский многобайтовый символ уровня


_ismbcl2_l 2

_ismbclegal, _ismbclegal_l, _ismbcsymbol, Многобайтовый символ, кроме


_ismbcsymbol_l алфавитно-цифровых

isprint, iswprint, _isprint_l, _iswprint_l, _ismbcgraph, Печатные символы


_ismbcgraph_l, _ismbcprint, _ismbcprint_l,
_ismbcpunct, _ismbcpunct_l, _ismbcblank,
_ismbcblank_l, _ismbcspace, _ismbcspace_l
Подпрограмма Условие теста символа

ispunct, iswpunct, _ispunct_l, _iswpunct_l, Пунктуация


_ismbcgraph, _ismbcgraph_l, _ismbcprint,
_ismbcprint_l, _ismbcpunct, _ismbcpunct_l,
_ismbcblank, _ismbcblank_l, _ismbcspace,
_ismbcspace_l

isspace, iswspace, _isspace_l, _iswspace_l, Пробел


_ismbcgraph, _ismbcgraph_l, _ismbcprint,
_ismbcprint_l, _ismbcpunct, _ismbcpunct_l,
_ismbcblank, _ismbcblank_l, _ismbcspace,
_ismbcspace_l

isupper, iswupper, _ismbclower, _ismbclower_l, Прописные буквы


_ismbcupper, _ismbcupper_l

_isctype, iswctype, _isctype_l, _iswctype_l Свойство, указанное в аргументе desc

isxdigit, iswxdigit, _isxdigit_l, _iswxdigit_l Шестнадцатеричная цифра

_mbclen, mblen, _mblen_l Возвращает длину допустимого


многобайтового символа. Результат
зависит от настроек категории LC_CTYPE
для выбранного языкового стандарта

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Поддержка операций с
комплексными числами в C
Статья • 03.04.2023

Библиотека среды выполнения Microsoft C (CRT) предоставляет сложные функции


математической библиотеки, включая все функции, необходимые для ISO C99.
Компилятор не поддерживает напрямую ключевое complex слово или _Complex
ключевое слово, поэтому реализация Майкрософт использует типы структур для
представления сложных чисел.

Эти функции предназначены для балансировки производительности и


правильности. Так как получение правильно округленного результата может
оказаться неоправданно дорогим, эти функции позволяют получить значение,
максимально приближенное к правильно округленному результату. В большинстве
случаев результат создается в пределах +/-1 единицы наименьшей точности (ULP)
правильно округленного результата, хотя в некоторых случаях возникает большая
неточность.

В основе процедур для работы с комплексными числами лежат функции


библиотеки математических операций для обработки чисел с плавающей запятой.
Эти функции имеют различные реализации для различных архитектур ЦП.
Например, в 32-разрядных CRT x86 могут использоваться не такие реализации, как
в 64-разрядных CRT x64. Кроме того, некоторые функции могут содержать сразу
несколько реализаций заданной архитектуры ЦП. Наиболее эффективная
реализация выбирается в среде выполнения динамически в зависимости от того,
какие наборы инструкций поддерживает ЦП. Например, в 32-разрядных CRT x86
некоторые функции включают сразу две реализации — x87 и SSE2. При работе на
ЦП, который поддерживает SSE2, используется более быстрая реализация SSE2.
При запуске на ЦП, который не поддерживает SSE2, используется медленная
реализация x87. Так как различные реализации функций математической
библиотеки могут использовать для получения результатов различные инструкции
ЦП и разнообразные алгоритмы, эти функции могут давать различные результаты
на разных ЦП. В большинстве случаев результаты находятся в пределах +/-1 от
правильно округленного результата, но фактические результаты могут отличаться в
разных ЦП.

Типы, используемые в операциях с


комплексными числами
Реализация заголовка complex.h Майкрософт определяет эти типы как эквиваленты
для стандартных сложных типов C99:

Стандартный тип Тип Майкрософт

float complex или float _Complex _Fcomplex

double complex или double _Complex _Dcomplex

long double complex или long double _Complex _Lcomplex

Заголовок math.h определяет отдельный тип, struct _complex используемый _cabs


для функции. Тип struct _complex не используется эквивалентными сложными
математическими функциями cabs, cabsf, cabsl.

Комплексные константы и макросы


I определяется как сложный тип _Fcomplex , инициализированный с помощью {

0.0f, 1.0f } .

Тригонометрические функции
Функция Описание

cacos, cacosf, cacosl Вычисляет комплексный арккосинус комплексного числа

casin, casinf, casinl Вычисляет комплексный арксинус комплексного числа

catan, catanf, catanl Вычисляет комплексный арктангенс комплексного числа

ccos, ccosf, ccosl Вычисляет комплексный косинус комплексного числа

csin, csinf, csinl Вычисляет комплексный синус комплексного числа

ctan, ctanf, ctanl Вычисляет комплексный тангенс комплексного числа

Гиперболические функции
Функция Описание

cacosh, cacoshf, Вычисляет комплексный гиперболический арккосинус комплексного


cacoshl числа
Функция Описание

casinh, casinhf, Вычисляет комплексный гиперболический арксинус комплексного


casinhl числа

catanh, catanhf, Вычисляет комплексный гиперболический арктангенс комплексного


catanhl числа

ccosh, ccoshf, ccoshl Вычисляет комплексный гиперболический косинус комплексного


числа

csinh, csinhf, csinhl Вычисляет комплексный гиперболический синус комплексного числа

ctanh, ctanhf, ctanhl Вычисляет комплексный гиперболический тангенс комплексного


числа

Экспоненциальные и логарифмические
функции
Функция Описание

cexp, cexpf, cexpl Вычисляет комплексную экспоненту комплексного числа с основанием


e

clog, clogf, clogl Вычисляет комплексный натуральный (по основанию e) логарифм


комплексного числа

clog10, clog10f, Вычисляет комплексный логарифм комплексного числа по основанию


clog10l 10

Функции возведения в степень и


вычисления абсолютного значения
Функция Описание

cabs, Вычисляет комплексное абсолютное значение (также называемое нормой,


cabsf, модулем или порядком величины) комплексного числа
cabsl

cpow, Вычисление сложной функции питания


cpowf,
cpowl
Функция Описание

csqrt, Вычисляет комплексный квадратный корень комплексного числа


csqrtf,
csqrtl

Функции обработки
Функция Описание

_Cbuild, _FCbuild, Формирует комплексное число из вещественной и мнимой частей


_LCbuild

carg, cargf, cargl Вычисляет аргумент комплексного числа (также называемый


фазовым углом)

cimag, cimagf, cimagl Вычисляет мнимую часть комплексного числа

conj, conjf, conjl Вычисляет комплексно сопряженную величину комплексного числа

cproj, cprojf, cprojl Вычисляет проекцию комплексного числа на сферу Римана

creal, crealf, creall Вычисляет вещественную часть комплексного числа

norm, normf, norml Вычисляет абсолютное значение комплексного числа в квадрате

Функции арифметических операций


Поскольку сложные числа не являются собственным типом в компиляторе
Майкрософт, стандартные арифметические операторы не определены для сложных
типов. Для удобства представлены следующие библиотечные функции, которые
позволяют выполнять некоторые операции с комплексными числами в
пользовательском коде.

Функция Описание

_Cmulcc, _FCmulcc, _LCmulcc Произведение двух комплексных чисел

_Cmulcr, _FCmulcr, _LCmulcr Умножает комплексное число на число с плавающей запятой

См. также раздел


Математические символы универсального типа

Подпрограммы универсальной среды выполнения C по категориям


Выравнивание данных
Статья • 03.04.2023

Следующие функции времени выполнения C поддерживают выравнивание данных.

Подпрограммы выравнивания данных


Подпрограмма Использование

_aligned_free Освобождает блок памяти, выделенный с _aligned_mallocили


_aligned_offset_malloc.

_aligned_free_dbg Освобождает блок памяти, выделенный или


_aligned_malloc_aligned_offset_malloc (только для отладки).

_aligned_malloc Размещение памяти на указанной границе выравнивания.

_aligned_malloc_dbg Выделяет память на указанной границе выравнивания с


дополнительным пространством для заголовка отладки и
перезаписи буферов (только отладочная версия).

_aligned_msize Возвращает размер блока памяти, выделенного в куче.

_aligned_msize_dbg Возвращает размер блока памяти, выделенного в куче (только


в отладочной версии).

_aligned_offset_malloc Размещение памяти на указанной границе выравнивания.

_aligned_offset_malloc_dbg Размещение памяти на указанной границе выравнивания


(только в отладочной версии).

_aligned_offset_realloc Изменяет размер блока памяти, который был выделен или


_aligned_malloc_aligned_offset_malloc.

_aligned_offset_realloc_dbg Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc (только для отладочной
версии).

_aligned_offset_recalloc Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc инициализирует память
на 0.

_aligned_offset_recalloc_dbg Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc инициализирует память
на 0 (только отладочная версия).

_aligned_realloc Изменяет размер блока памяти, который был выделен или


_aligned_malloc_aligned_offset_malloc.
Подпрограмма Использование

_aligned_realloc_dbg Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc (только для отладочной
версии).

_aligned_recalloc Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc инициализирует память
на 0.

_aligned_recalloc_dbg Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc инициализирует память
на 0 (только отладочная версия).

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Преобразование данных
Статья • 03.04.2023

Эти процедуры позволяют преобразовывать данные из одной формы в другую.


Обычно эти процедуры выполняются быстрее, чем создаваемые вами
преобразования. Каждая процедура, которая начинается с префикса to ,
реализуется и как функция, и как макрос. Сведения о выборе реализации см. в
рекомендациях по выбору между функциями и макросами .

Подпрограммы преобразования данных


Подпрограмма Использование

abs Находит абсолютное значение целого


числа

atof, _atof_l Преобразуют строку в float

atoi, _atoi_l Преобразуют строку в int

_atoi64, _atoi64_l Преобразование строки в __int64 или


long long

atol, _atol_l Преобразуют строку в long

c16rtomb, c32rtomb Преобразуют символ UTF-16 или UTF-


32 в эквивалентный многобайтовый
символ

_ecvt, _ecvt_s Преобразуют double в строку символов


указанной длины

_fcvt, _fcvt_s Преобразование double в строку с


указанным количеством цифр после
десятичной запятой

_gcvt, _gcvt_s Преобразуют число double в строку и


сохраняют эту строку в буфер

_itoa, _ltoa, _ultoa, _i64toa, _ui64toa, _itow, _ltow, Преобразуют целочисленные типы в
ultow, _i64tow, _ui64tow, _itoa_s, _ltoa_s, _ultoa_s, строку
_i64toa_s, _ui64toa_s, _itow_s, _ltow_s, _ultow_s,
_i64tow_s, _ui64tow_s

labs Находят абсолютное значение целого


числа long
Подпрограмма Использование

llabs Находят абсолютное значение целого


числа long long

_mbbtombc, _mbbtombc_l Преобразуют однобайтовый


многобайтовый символ в
соответствующий двухбайтовый
многобайтовый символ

_mbcjistojms, _mbcjistojms_l, _mbcjmstojis, Преобразуют символ из стандарта


_mbcjmstojis_l Japan Industry Standard (JIS) в стандарт
Japan Microsoft (JMS)

_mbcjistojms, _mbcjistojms_l, _mbcjmstojis, Преобразуют символ из стандарта JMS


_mbcjmstojis_l в стандарт JIS

_mbctohira, _mbctohira_l, _mbctokata, _mbctokata_l Преобразуют многобайтовый символ в


однобайтовый код хираганы

_mbctohira, _mbctohira_l, _mbctokata, _mbctokata_l Преобразуют многобайтовый символ в


однобайтовый код катаканы

_mbctombb, _mbctombb_l Преобразуют двухбайтовый


многобайтовый символ в
соответствующий однобайтовый
многобайтовый символ

mbrtoc16, mbrtoc32 Преобразуют многобайтовый символ в


эквивалентный символ UTF-16 или UTF-
32

mbstowcs, _mbstowcs_l, mbstowcs_s, _mbstowcs_s_l Преобразовать последовательность


многобайтовых символов в
соответствующую последовательность
расширенных символов.

mbtowc, _mbtowc_l Преобразовать многобайтовый символ


в соответствующий расширенный
символ.

strtod, _strtod_l, wcstod, _wcstod_l Преобразуют строку в double

strtol, wcstol, _strtol_l, _wcstol_l Преобразуют строку в целое число long

strtoul, _strtoul_l, wcstoul, _wcstoul_l Преобразуют строку в целое число


unsigned long

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l Преобразуют строку в упорядоченную


форму, основываясь на данных
языкового стандарта
Подпрограмма Использование

toascii, __toascii Преобразуют символ в код ASCII

tolower, _tolower, towlower, _tolower_l, _towlower_l, Проверяют символ и преобразуют его в


_mbctolower, _mbctolower_l, _mbctoupper, нижний регистр, если это символ
_mbctoupper_l верхнего регистра

tolower, _tolower, towlower, _tolower_l, _towlower_l Преобразуют символ в нижний регистр


без дополнительных условий

toupper, _toupper, towupper, _toupper_l, Проверяют символ и преобразуют его в


_towupper_l, _mbctolower, _mbctolower_l, верхний регистр, если это символ
_mbctoupper, _mbctoupper_l нижнего регистра

toupper, _toupper, towupper, _toupper_l, Преобразуют символ в верхний регистр


_towupper_l без дополнительных условий

wcstombs, _wcstombs_l, wcstombs_s, _wcstombs_s_l Преобразовать последовательность


расширенных символов в
соответствующую последовательность
многобайтовых символов

wctomb, _wctomb_l, wctomb_s, _wctomb_s_l Преобразовать расширенный символ в


соответствующий многобайтовый
символ

_wtof, _wtof_l Преобразуют строку расширенных


символов в double

_wtoi, _wtoi_l Преобразуют строку расширенных


символов в int

_wtoi64, _wtoi64_l Преобразование строки расширенных


символов в __int64 строку или long
long

_wtol, _wtol_l Преобразуют строку расширенных


символов в long

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Подпрограммы отладки
Статья • 03.04.2023

Отладочная версия библиотеки времени выполнения C предоставляет множество


служб диагностики, упрощающих отладку программ и позволяющих
разработчикам:

пошагово входить непосредственно в функции времени выполнения во время


отладки;

разрешать утверждения, ошибки и исключения;

трассировать выделение памяти в куче и предотвращать утечки памяти;

выводить отладочные сообщения пользователю.

Отладочные версии подпрограмм


библиотеки времени выполнения C
Чтобы использовать эти подпрограммы, _DEBUG необходимо определить флаг . В
окончательной сборке приложения все эти подпрограммы не выполняют никаких
действий. Дополнительные сведения об использовании новых процедур отладки
см. в статье Методы отладки CRT.

Подпрограмма Использование

_ASSERT Вычисление выражения и создание отчета об отладке при


получении результата FALSE

_ASSERTE Аналогична _ASSERT , но включает в создаваемый отчет


выражение, где произошел сбой

_CrtCheckMemory Проверяет целостность выделенных блоков памяти в


отладочной куче

_CrtDbgBreak Устанавливает точку останова.

_CrtDbgReport, Создает отладочный отчет с сообщением для пользователя и


_CrtDbgReportW отправляет отчет в три возможных назначения

_CrtDoForAllClientObjects Вызывает предоставленную приложением функцию для всех


типов _CLIENT_BLOCK в куче

_CrtDumpMemoryLeaks Сбрасывает все блоки памяти в отладочной куче при


значительной утечке памяти
Подпрограмма Использование

_CrtIsMemoryBlock Проверяет, что указанный блок памяти находится в


локальной куче, а также что он имеет допустимый
идентификатор типа блока отладочной кучи

_CrtIsValidHeapPointer Проверяет, что указанный указатель находится в локальной


куче

_CrtIsValidPointer Проверяет, что указанный диапазон памяти допустим для


чтения и записи

_CrtMemCheckpoint Получает текущее состояние отладочной кучи и сохраняет


его в предоставленной приложением структуре _CrtMemState

_CrtMemDifference Сравнивает два состояния памяти на предмет значащих


отличий и возвращает результаты

_CrtMemDumpAllObjectsSince Сбрасывает сведения об объектах в куче с указанной


контрольной точки или с начала выполнения программы

_CrtMemDumpStatistics Сбрасывает данные заголовка отладки для указанного


состояния памяти в понятной пользователю форме

_CrtReportBlockType Возвращает тип и подтип блока, связанные с указателем


блока заданной отладочной кучи.

_CrtSetAllocHook Устанавливает определяемую клиентом функцию выделения


путем присоединения ее к отладочному процессу выделения
памяти времени выполнения C

_CrtSetBreakAlloc Устанавливает точку останова на указанном порядковом


номере выделения объекта

_CrtSetDbgFlag Извлекает или изменяет состояние флага _crtDbgFlag для


управления поведением выделения диспетчера отладочной
кучи

_CrtSetDumpClient Устанавливает определяемую приложением функцию,


которая вызывается при каждом вызове функции
отладочного дампа для сброса блоков памяти типа
_CLIENT_BLOCK

_CrtSetReportFile Указывает файл или поток, используемый в качестве


назначения для определенного типа отчета _CrtDbgReport

_CrtSetReportHook Устанавливает определяемую клиентом функцию отчетов


путем присоединения ее к отладочному процессу отчетов
времени выполнения С
Подпрограмма Использование

_CrtSetReportHook2, Устанавливает или удаляет определяемую клиентом


_CrtSetReportHookW2 функцию отчетов путем ее присоединения к отладочному
процессу отчетов времени выполнения языка C.

_CrtSetReportMode Задает общие назначения для определенного типа отчета,


создаваемого _CrtDbgReport

_RPT[0,1,2,3,4] Отслеживает ход выполнения приложения путем создания


отладочного отчета, вызывая _CrtDbgReport со строкой
формата и переменным количеством аргументов. Не
предоставляет сведений об исходном файле и номере
строки.

_RPTF[0,1,2,3,4] Аналогична макросам _RPTn , но предоставляет имя файла и


номер строки в файле, где возник запрос отчета

_calloc_dbg Выделение указанного количества блоков памяти в куче с


дополнительным пространством для заголовка отладки и
перезаписи буферов

_expand_dbg Изменяет размер указанного блока памяти в куче,


увеличивая его или сжимая

_free_dbg Освобождает блок памяти в куче

_fullpath_dbg, _wfullpath_dbg Создайте абсолютный или полный путь для указанного


относительного имени пути, используя _malloc_dbg для
выделения памяти.

_getcwd_dbg, _wgetcwd_dbg Получение текущего рабочего каталога с помощью


_malloc_dbg для выделения памяти.

_malloc_dbg Выделение блока памяти в куче с дополнительным


пространством для заголовка отладки и перезаписи буферов

_msize_dbg Вычисляет размер блока памяти в куче

_realloc_dbg Перераспределяет указанный блок памяти в куче,


перемещая его и (или) изменяя его размер

_strdup_dbg, _wcsdup_dbg Дублирует строку, используя _malloc_dbg для выделения


памяти.

_tempnam_dbg, Создайте имена, которые можно использовать для создания


_wtempnam_dbg временных файлов, а также _malloc_dbg для выделения
памяти.
Подпрограммы среды выполнения C,
недоступные в форме исходного кода
Отладчик можно использовать для пошагового выполнения исходного кода
большинства подпрограмм среды выполнения C в процессе отладки. Однако
корпорация Майкрософт считает некоторые технологии собственными и,
следовательно, не предоставляет исходный код для подмножества этих
подпрограмм. Большинство этих подпрограмм относится либо к обработке
исключений, либо к группам операций с плавающей запятой, однако есть также
несколько подпрограмм других категорий. Эти подпрограммы перечислены в
следующей таблице.

acos

acosh

asin

asinh

atan, atan2

atanh

Bessel functions

_cabs

ceil

_chgsign

_clear87, _clearfp

_control87, _controlfp

copysign

cos

cosh

Exp

fabs

_finite

floor

fmod

_fpclass

_fpieee_flt

_fpreset

frexp

_hypot

_isnan

ldexp

log

_logb

log10

longjmp

_matherr

modf

_nextafter

pow

printf_s

printf

_scalb

scanf_s

scanf

setjmp

sin

sinh

sqrt

_status87, _statusfp

tan

tanh

Хотя исходный код доступен для большинства printf подпрограмм и scanf , они
выполняют внутренний вызов другой подпрограммы, для которой исходный код
не предоставляется.

Подпрограммы, которые ведут себя иначе в


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

Подпрограмма C abort

C assert routine
Оператор C++ delete

C++ new operator

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Проверка ошибок среды выполнения


Управление каталогами
Статья • 03.04.2023

Эти подпрограммы имеют доступ к структуре каталогов, изменяют ее и получают о


ней сведения.

Подпрограммы управления каталогами


Подпрограмма Использование

_chdir, _wchdir Изменение текущей рабочей папки

_chdrive Изменение текущего диска

_getcwd, _wgetcwd Получение текущей рабочей папки для диска по


умолчанию

_getdcwd, _wgetdcwd Получение текущей рабочей папки для выбранного


диска

_getdiskfree Заполняет структуру _diskfree_t сведениями о диске.

_getdrive Получение текущего диска (по умолчанию)

_getdrives Возвращает битовую маску, которая представляет


доступные в данный момент диски.

_mkdir, _wmkdir Создание нового каталога

_rmdir, _wrmdir Удалить каталог

_searchenv, _wsearchenv, Поиск выбранного файла в указанных папках


_searchenv_s, _wsearchenv_s

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Обработка файлов

Системные вызовы
Обработка ошибок (CRT)
Статья • 03.04.2023

Используйте эти подпрограммы для обработки ошибок в программах.

Процедуры обработки ошибок


Подпрограмма Использование

assertМакрос Проверка на наличие ошибок в логике программы; доступен как в


итоговой, так и в отладочной версии библиотек среды выполнения.

_ASSERT, _ASSERTE Подобен assert , но доступен только в отладочных версиях


макросы библиотеки среды выполнения.

clearerr Сброс индикатора ошибки. Вызов rewind или закрытие потока также
приводит к сбросу индикатора ошибки.

_eof Поиск конца файла в низкоуровневых операциях ввода-вывода.

feof Проверка на наличие конца файла. Конец файла также указан, если
_read возвращает результат 0.

ferror Проверка на наличие ошибок потокового ввода-вывода.

_RPT, _RPTF Создают отчет, подобный printf , но доступны только в отладочных


макросы версиях библиотеки среды выполнения.

_set_error_mode Изменяет __error_mode для определения отличного от используемого


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

_set_purecall_handler Задает обработчик для вызова чистой виртуальной функции.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Процедуры обработки исключений
Статья • 03.04.2023

Использование функций обработки исключений C++ для восстановления после


непредвиденных событий во время выполнения программы.

Функции обработки исключений


Функция Использование

_set_se_translator Обрабатывает исключения Win32 (структурированные исключения C) как


типизированные исключения C++

set_terminate Установите собственную подпрограмму завершения, чтобы ее можно


было вызвать с помощью функции terminate

set_unexpected Установите собственную функцию завершения, чтобы ее можно было


вызвать с помощью функции unexpected

terminate Вызывается автоматически при определенных условиях после


исключения. Эта функция terminate вызывает функцию abort или
функцию, указанную с помощью set_terminate

unexpected Вызывает функцию terminate или функцию, заданную с помощью


set_unexpected . Эта unexpected функция не используется в текущей
реализации обработки исключений Microsoft C++.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Обработка файлов
Статья • 03.04.2023

Эти подпрограммы предназначены для создания и удаления файлов, управления


файлами, а также задания и проверки разрешений доступа к файлам.

В библиотеках времени выполнения C количество одновременно открытых файлов


ограничено 512 файлами. Попытка открыть больше максимального количества
дескрипторов файлов или файловых потоков приводит к сбою программы.
Используется для _setmaxstdio изменения этого числа.

Процедуры обработки файлов (дескриптор


файла)
Эти подпрограммы работают с файлами, идентифицируемыми дескрипторами
файлов.

Подпрограмма Использование

_chsize,_chsize_s Изменяет размер файла

_filelength, _filelengthi64 Получает длину файла

_fstat, _fstat32, _fstat64, Получает сведения о состоянии файла по дескриптору


_fstati64, _fstat32i64,
_fstat64i32

_get_osfhandle Возвращает дескриптор файла операционной системы,


связанный с существующими дескриптором файла среды
выполнения C.

_isatty Проверяет символьное устройство

_locking Блокирует области файла

_open_osfhandle Связывает дескриптор файла времени выполнения C с


существующим дескриптором файла операционной системы

_setmode Устанавливает режим преобразования файлов

Подпрограммы обработки файлов (путь или


имя файла)
Эти подпрограммы работают с файлами, указанными с помощью пути или имени
файла.

Подпрограмма Использование

_access, _waccess, _access_s, Проверяет параметры разрешений файла


_waccess_s

_chmod, _wchmod Изменяет параметры разрешений файла

_fullpath, _wfullpath Расширяет относительный путь до абсолютного пути

_makepath, _wmakepath, Объединяет компоненты пути в один полный путь


_makepath_s, _wmakepath_s

_mktemp, _wmktemp, _mktemp_s, Создает уникальное имя файла


_wmktemp_s

remove, _wremove Удалить файл

rename, _wrename Переименовать файл

_splitpath, _wsplitpath, Разбирает путь на компоненты


_splitpath_s, _wsplitpath_s

_stat, _stat64, _stati64, _wstat, Получает сведения о состоянии файла по имени


_wstat64, _wstati64

_umask, _umask_s Задает маску разрешений по умолчанию для новых


файлов, создаваемых программой

_unlink, _wunlink Удалить файл

Подпрограммы обработки файлов


(открытие файлов)
Эти подпрограммы открывают файлы.

Подпрограмма Использование

fopen, _wfopen, fopen_s, Открывает файл и возвращает указатель на открытый файл.


_wfopen_s

_fsopen, _wfsopen Открывает поток в режиме совместного доступа к файлу и


возвращает указатель на открытый файл.

_open, _wopen Открывает файл и возвращает дескриптор открытого файла.


Подпрограмма Использование

_sopen, _wsopen, _sopen_s, Открывает файл в режиме совместного доступа и возвращает


_wsopen_s дескриптор открытого файла.

_pipe Создает канал для чтения и записи.

freopen, _wfreopen, Переназначает указатель файла.


freopen_s, _wfreopen_s

Эти подпрограммы предоставляют возможность изменить представление файла


между структурой FILE , дескриптором файла и Win32-дескриптором файла.

Подпрограмма Использование

_fdopen, Связывает поток с файлом, который ранее был открыт для


_wfdopen низкоуровневого ввода-вывода, и возвращает указатель на открытый
поток.

_fileno Получает дескриптор файла, связанного с потоком.

_get_osfhandle Возвращает дескриптор файла операционной системы, связанный с


существующими дескриптором файла среды выполнения C.

_open_osfhandle Связывает дескриптор файла времени выполнения C с существующим


дескриптором файла операционной системы.

Следующие функции Win32 также открывают файлы и каналы:

CreateFile

CreatePipe

CreateNamedPipe

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Управление каталогами

Системные вызовы
Поддержка математических функций
для чисел с плавающей запятой
Статья • 03.04.2023

Библиотека универсальной среды выполнения C (UCRT) предоставляет множество


функций математической библиотеки целочисленных и с плавающей запятой,
включая все функции, необходимые стандарту ISO C99. Функции с плавающей
запятой предназначены для балансировки производительности и правильности.
Так как получение правильно округленного результата может оказаться
неоправданно дорогим, эти функции позволяют получить значение, максимально
приближенное к правильно округленному результату. В большинстве случаев
результат создается в пределах +/-1 ULP (единица наименьшей точности)
правильно округленного результата, хотя в некоторых случаях возникает большая
неточность.

Для стандарта ISO C 11 (C11) и более поздних версий <tgmath.h> заголовок в


дополнение к включению <math.h> и <complex.h> предоставляет макросы, которые
вызывают соответствующую математическую функцию на основе типов
параметров. Дополнительные сведения см. в разделе "Универсальный тип".

Во многих функциях математической библиотеки с плавающей точкой


используются различные реализации разной архитектуры ЦП. Например, в 32-
разрядных CRT x86 могут использоваться не такие реализации, как в 64-разрядных
CRT x64. Кроме того, некоторые функции могут содержать сразу несколько
реализаций заданной архитектуры ЦП. Наиболее эффективная реализация
выбирается в среде выполнения динамически в зависимости от того, какие наборы
инструкций поддерживает ЦП. Например, в 32-разрядных CRT x86 некоторые
функции включают сразу две реализации — x87 и SSE2. При работе на ЦП, который
поддерживает SSE2, используется более быстрая реализация SSE2. При запуске на
ЦП, который не поддерживает SSE2, используется медленная реализация x87. Так
как различные реализации функций математической библиотеки могут
использовать для получения результатов различные инструкции ЦП и
разнообразные алгоритмы, эти функции могут давать различные результаты на
разных ЦП. В большинстве случаев результаты находятся в пределах +/-1 от
правильно округленного результата, но фактические результаты могут отличаться в
разных ЦП.

Предыдущие 16-разрядные версии Microsoft C/C++ и Microsoft Visual C++


поддерживали тип long double как тип данных с плавающей точкой 80-битной
точности. В более поздних версиях Visual C++ тип данных long double представляет
собой тип данных с плавающей запятой 64-битной точности, идентичный типу
double . Компилятор обрабатывает long double и double как различные типы
данных, однако функции long double идентичны своим аналогам, double . Для
обеспечения совместимости с исходным кодом ISO C99 в CRT предоставляются
long double -версии математических функций, однако следует иметь в виду, что

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

Поддерживаемые математические функции


для чисел с плавающей запятой
Подпрограмма Использование

abs, labs, llabs, _abs64 Вычисляет абсолютное значение целого числа

acos, acosf, acosl Вычисляет арккосинус

acosh, acoshf, acoshl Вычисляет гиперболический арккосинус

asin, asinf, asinl Вычисляет арксинус

asinh, asinhf, asinhl Вычисляет гиперболический арксинус

atan, atanf, atanl, atan2, atan2f, atan2l Вычисляет арктангенс

atanh, atanhf, atanhl Вычисляет гиперболический арктангенс

_atodbl, _atodbl_l Преобразует строку, зависят от языкового стандарта,


в double

atof, _atof_l Преобразует строку в double

_atoflt, _atoflt_l, _atoldbl, _atoldbl_l Преобразует строку для конкретного языкового


стандарта в строку float или long double

cbrt, cbrtf, cbrtl Вычисляет кубический корень

ceil, ceilf, ceill Вычисляет с округлением вверх

_chgsign, _chgsignf, _chgsignl Вычисляет аддитивную инверсию

_clear87, _clearfp Получает и сбрасывает реестр состояния блока


операций с плавающей запятой

_control87, _controlfp, __control87_2 Получает и задает управляющее слово блока


операций с плавающей запятой

_controlfp_s Безопасная версия _controlfp


Подпрограмма Использование

copysign, copysignf, copysignl, Возвращает значение, которое имеет абсолютное


_copysign, _copysignf, _copysignl значение одного аргумента и знак другого

cos, cosf, cosl Вычисляет синус

cosh, coshf, coshl Вычисляет гиперболический синус

div, ldiv, lldiv Вычисляет частное и остаток от деления двух


целочисленных значений

_ecvt, ecvt Преобразует объект в double строку

_ecvt_s Безопасная версия _ecvt

erf, erff, erfl Вычисляет функцию ошибок

erfc, erfcf, erfcl Вычисляет дополнительную функцию ошибок

exp, expf, expl Вычисляет экспоненту ex

exp2, exp2f, exp2l Вычисляет экспоненту 2x

expm1, expm1f, expm1l Вычисляет ex-1

fabs, fabsf, fabsl Вычисляет абсолютное значение типа с плавающей


запятой

_fcvt, fcvt Преобразует число с плавающей запятой в строку

_fcvt_s Безопасная версия _fcvt

fdim, fdimf, fdiml Определяет положительную разность между двумя


значениями

feclearexcept Сбрасывает указанные исключения с плавающей


запятой

fegetenv Хранит текущую среду с плавающей запятой

fegetexceptflag Получает состояние указанных исключений с


плавающей запятой

fegetround Получает режим округления чисел с плавающей


запятой

feholdexcept Задает безостановочный режим исключений с


плавающей запятой

feraiseexcept Вызывает указанные исключения с плавающей


запятой
Подпрограмма Использование

fesetenv Задает текущую среду с плавающей запятой

fesetexceptflag Задает флаги состояния указанных чисел с


плавающей запятой

fesetround Задает режим округления указанных чисел с


плавающей запятой

fetestexcept Определяет, какие флаги состояния исключения с


плавающей запятой заданы

feupdateenv Восстанавливает среду с плавающей запятой, а затем


вызывает предыдущее исключение

floor, floorf, floorl Вычисляет с округлением вниз

fma, fmaf, fmal Вычисляет склеенную операцию умножения-


сложения

fmax, fmaxf, fmaxl Вычисляет максимальное значение аргументов

fmin, fminf, fminl Вычисляет минимальное количество аргументов.

fmod, fmodf, fmodl Вычисляет остаток с плавающей запятой

_fpclass, _fpclassf Возвращает классификацию значения с плавающей


запятой

fpclassify Возвращает классификацию значения с плавающей


запятой

_fpieee_flt Задает обработчик исключений с плавающей


запятой

_fpreset Сбрасывает среду с плавающей запятой

frexp, frexpf, frexpl Получает мантиссу и показатель степени числа с


плавающей запятой

_gcvt, gcvt Преобразует число с плавающей запятой в строку

_gcvt_s Безопасная версия _gcvt

_get_FMA3_enable, _set_FMA3_enable Получает или задает флаг для использования


инструкций FMA3 в 64-разрядной среде

hypot, hypotf, hypotl, _hypot, _hypotf, Вычисляет гипотенузу


_hypotl
Подпрограмма Использование

ilogb, ilogbf, ilogbl Вычисляет показатель степени целого числа по


основанию 2

imaxabs Вычисляет абсолютное значение целого числа

imaxdiv Вычисляет частное и остаток от деления двух


целочисленных значений

isfinite, _finite, _finitef Определяет, является ли значение конечным

isgreater, isgreaterequal, isless, Сравнивает порядок двух значений с плавающей


islessequal, islessgreater, isunordered запятой

isinf Определяет, является ли значение с плавающей


запятой бесконечным

isnan, _isnan, _isnanf Проверяет значение с плавающей запятой для NaN

isnormal Проверяет, является ли значение с плавающей


запятой конечным и не субнормальным

_j0, _j1, _jn Вычисляет функцию Бесселя

ldexp, ldexpf, ldexpl Вычисляет x*2n

lgamma, lgammaf, lgammal Вычисляет натуральный логарифм абсолютного


значения гамма-функции

llrint, llrintf, llrintl Округляет значение с плавающей запятой до


ближайшего long long значения.

llround, llroundf, llroundl Округляет значение с плавающей запятой до


ближайшего long long значения.

log, logf, logl, log10, log10f, log10l Вычисляет натуральный логарифма или логарифм по
основанию 10

log1p, log1pf, log1pl Вычисляет натуральный логарифм числа 1+x

log2, log2f, log2l Вычисляет логарифм по основанию 2

logb, logbf, logbl, _logb, _logbf Возвращает показатель степени значения с


плавающей запятой

lrint, lrintf, lrintl Округляет значение с плавающей запятой до


ближайшего long значения.

_lrotl, _lrotr Чередует целочисленное значение влево или вправо


Подпрограмма Использование

lround, lroundf, lroundl Округляет значение с плавающей запятой до


ближайшего long значения.

_matherr Обработчик математических ошибок по умолчанию

__max Макрос, который возвращает большее из двух


значений

__min Макрос, который возвращает меньшее из двух


значений

modf, modff, modfl Разбивает значение с плавающей запятой на


дробную и целую части

nan, nanf, nanl Возвращает несигнальное значение NaN (QNaN)

nearbyint, nearbyintf, nearbyintl Возвращает округленное значение

nextafter, nextafterf, nextafterl, Возвращает следующее представимое значение с


_nextafter, _nextafterf плавающей запятой

nexttoward, nexttowardf, nexttowardl Возвращает следующее представимое значение с


плавающей запятой

pow, powf, powl Возвращает значение x y

remainder, remainderf, remainderl Вычисляет остаток от частного двух значений с


плавающей запятой

remquo, remquof, remquol Вычисляет остаток от деления двух целочисленных


значений

rint, rintf, rintl Округляет значение с плавающей запятой

_rotl, _rotl64, _rotr, _rotr64 Чередует биты в целочисленных типах

round, roundf, roundl Округляет значение с плавающей запятой

_scalb, _scalbf Масштабирует аргумент по степени числа 2

scalbn, scalbnf, scalbnl, scalbln, Умножает число с плавающей запятой на


scalblnf, scalblnl целочисленное значение FLT_RADIX

_set_controlfp Задает управляющее слово блока операций с


плавающей запятой

_set_SSE2_enable Включает или отключает инструкции SSE2

signbit Проверяет знаковый бит значения с плавающей


запятой
Подпрограмма Использование

sin, sinf, sinl Вычисляет синус

sinh, sinhf, sinhl Вычисляет гиперболический синус

sqrt, sqrtf, sqrtl Вычисляет квадратный корень

_status87, _statusfp, _statusfp2 Получает слово состояния модуля операций с


плавающей запятой

strtof, _strtof_l Преобразует строку в float

strtold, _strtold_l Преобразует строку в long double

tan, tanf, tanl Вычисляет тангенс

tanh, tanhf, tanhl Вычисляет гиперболический тангенс

tgamma, tgammaf, tgammal Вычисляет гамма-функцию

trunc, truncf, truncl Усекает дробную часть

_wtof, _wtof_l Преобразует широкую строку в double

_y0, _y1, _yn Вычисляет функцию Бесселя

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Примитивы с плавающей запятой


Ввод и вывод
Статья • 03.04.2023

Функции ввода-вывода производят чтение из файлов и устройств и запись в них.


Операции файлового ввода-вывода выполняются в текстовом или двоичном
режиме. Библиотека времени выполнения Microsoft содержит три типа функций
ввода-вывода:

Функции потокового ввода-вывода обрабатывают данные как поток


отдельных символов.

Функции низкоуровневого ввода-вывода напрямую вызывают операционную


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

Функции ввода-вывода на консоль и в порты производят чтение или запись


непосредственно на консоль (клавиатуру и экран) или в порт ввода-вывода
(например, порт принтера).

7 Примечание

Поскольку потоковые функции используют буфер, а низкоуровневые


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

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Файловый ввод-вывод в текстовом и
двоичном режиме
Статья • 03.04.2023

Операции ввода-вывода файлов выполняются в одном из двух режимов перевода,


текста или двоичного файла в зависимости от режима открытия файла. Файлы
данных часто обрабатываются в текстовом режиме. Для управления режимом
преобразования файла можно:

Сохранить текущий параметр по умолчанию и указывать альтернативный


режим только при открытии выбранных файлов.

Используйте функцию _set_fmode , чтобы изменить режим по умолчанию для


вновь открытых файлов. Используется _get_fmode для поиска текущего
режима по умолчанию. Начальная настройка по умолчанию — текстовый
режим ( _O_TEXT ).

Измените режим перевода по умолчанию напрямую, задав глобальную


переменную _fmode в программе. Значение этой переменной
устанавливается функцией _set_fmode , но его можно также задать
непосредственно.

При вызове функции открытия файла, например _open, , fopen, fopen_s,


freopen_s_fsopenfreopenили _sopen_s, можно переопределить текущий параметр
_fmode по умолчанию, указав соответствующий аргумент функции._set_fmode

Потоки stdin , stdout и stderr по умолчанию всегда открываются в текстовом


режиме; можно также переопределить это значение по умолчанию при открытии
любого из этих файлов. Используется _setmode для изменения режима перевода с
помощью дескриптора файла после открытия файла.

См. также раздел


Ввод и вывод

Подпрограммы универсальной среды выполнения C по категориям


Ввод-вывод в поток в кодировке
Юникод в текстовом и двоичном
режиме
Статья • 03.04.2023

Когда подпрограмма потокового ввода-вывода Юникода (например, fwprintf ,


fwscanf , fgetwc , fputwc , fgetws или fputws ) работает с файлом, открытым в
текстовом режиме (по умолчанию), выполняются два типа преобразования
символов:

Преобразование Юникод-в-MBCS или MBCS-в-Юникод. Если функция ввода-


вывода потока Юникода работает в текстовом режиме, исходный или
конечный поток рассматривается как последовательность многобайтовых
символов. Поэтому входные функции потока Юникода преобразуют
многобайтовые символы в расширенные (как если бы для этого вызывалась
функция mbtowc ). По той же причине выходные функции потока Юникода
преобразуют расширенные символы в многобайтовые (как если бы для этого
вызывалась функция wctomb ).

Преобразование символов возврата каретки — перевода строки (CR-LF). Это


преобразование происходит перед преобразованием MBCS — Юникод (для
функций потокового ввода Юникода) и после преобразования Юникод —
MBCS (для функций потокового вывода Юникода). Во время ввода каждое
сочетание "возврат каретки — перевод строки" преобразуется в один символ
перевода строки. Во время вывода каждый символ перевода строки
преобразуется в сочетание "возврат каретки — перевод строки".

Однако если функция потокового ввода-вывода Юникода работает в двоичном


режиме, предполагается, что файл будет в Юникоде, и преобразование CR-LF или
преобразование символов во время ввода или вывода не производится. Для
правильного использования wcin с текстовым файлом Юникода примените
инструкцию _setmode( _fileno( stdin ), _O_BINARY ); .

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Ввод и вывод
Потоковый ввод-вывод
Статья • 03.04.2023

Эти функции обрабатывают данные различных размеров и форматов, — от одного


символа до больших структур данных. Они также предоставляют возможность
буферизации, которая может повысить производительность. Размер буфера потока
по умолчанию составляет 4 КБ. Эти подпрограммы влияют только на буферы,
созданные подпрограммами библиотеки времени выполнения, и не затрагивают
буферы, созданные операционной системой.

Подпрограммы потокового ввода-вывода


Подпрограмма Использование

clearerr, clearerr_s Очистка индикатора ошибки для потока

fclose Закрытие потока

_fcloseall Закрытие всех открытых потоков, кроме stdin ,


stdout и stderr

_fdopen, wfdopen Связывание потока с дескриптором открытого


файла

feof Проверка файла или потока на предмет конца

ferror Проверка на наличие ошибки в потоке

fflush Сброс потока в буфер или на запоминающее


устройство

fgetc, fgetwc Считывание символа из потока (функциональные


версии getc и getwc )

_fgetchar, _fgetwchar Считать символ из stdin (функциональные


версии getchar и getwchar )

fgetpos Получение индикатора позиции потока

fgets, fgetws Считывание строки из потока

_fileno Получение дескриптора файла, связанного с


потоком

_flushall Сброс всех потоков в буфер или запоминающее


устройство
Подпрограмма Использование

fopen, _wfopen, fopen_s, _wfopen_s Открытие потока

fprintf, _fprintf_l, fwprintf, _fwprintf_l, Запись форматированных данных в поток


fprintf_s, _fprintf_s_l, fwprintf_s,
_fwprintf_s_l

fputc, fputwc Запись символа в поток (функциональные версии


putc и putwc )

_fputchar, _fputwchar Запись символа в stdout (функциональные


версии putchar и putwchar )

fputs, fputws Запись строки в поток

fread Считывание неформатированных данных из


потока

freopen, _wfreopen, freopen_s, Переназначение потокового указателя FILE ,


_wfreopen_s чтобы он указывал на новый файл или устройство

fscanf, fwscanf, fscanf_s, _fscanf_s_l, Считывание форматированных данных из потока


fwscanf_s, _fwscanf_s_l

fseek, _fseeki64 Перемещение позиции в файле в заданное место

fsetpos Задание индикатора позиции в потоке

_fsopen, _wfsopen Открытие потока с совместным доступом к файлу

ftell, _ftelli64 Получение текущей позиции в файле

fwrite Запись неформатированных элементов данных в


поток

getc, getwc Считывание символа из потока (версии-макросы


fgetc и fgetwc )

getchar, getwchar Считывание символа из stdin (версии-макросы


fgetchar и fgetwchar )

_getmaxstdio Возвращает количество одновременно открытых


файлов, допустимое на уровне потокового ввода-
вывода.

gets_s, _getws_s Считывание строки из stdin

_getw Считывание двоичного числа int из потока

printf, _printf_l, wprintf, _wprintf_l,printf_s, Запись форматированных данных в stdout


_printf_s_l, wprintf_s, _wprintf_s_l
Подпрограмма Использование

putc, putwc Запись символа в поток (версии-макросы fputc и


fputwc )

putchar, putwchar Запись символа в stdout (версии-макросы


fputchar и fputwchar )

puts, _putws Запись строки в поток

_putw Запись двоичного числа int в поток

rewind Перемещение позиции в файле в начало потока

_rmtmp Удаление временных файлов, созданных tmpfile

scanf, _scanf_l, wscanf, _wscanf_l,scanf_s, Считывание форматированных данных из stdin


_scanf_s_l, wscanf_s, _wscanf_s_l

setbuf Управление потоковой буферизацией

_setmaxstdio Задание максимального числа одновременно


открытых файлов на уровне потокового ввода-
вывода

setvbuf Управление потоковой буферизацией и размером


буфера

_snprintf, _snwprintf, _snprintf_s, Запись форматированных данных указанной


_snprintf_s_l, _snwprintf_s, _snwprintf_s_l длины в строку

_snscanf, _snwscanf, _snscanf_s, Считывают форматированные данные указанной


_snscanf_s_l, _snwscanf_s, _snwscanf_s_l длины из стандартного входного потока.

sprintf, swprintf, sprintf_s, _sprintf_s_l, Запись форматированных данных в строку


swprintf_s, _swprintf_s_l

sscanf, swscanf,sscanf_s _sscanf_s_l, Считывание форматированных данных из строки


swscanf_s_swscanf_s_l

_tempnam, _wtempnam Создание временного имени файла в заданном


каталоге

tmpfile, tmpfile_s Создание временного файла

tmpnam, _wtmpnam, tmpnam_s, Создание временного имени файла


_wtmpnam_s

ungetc, ungetwc Отправка символа обратно в поток

_vcprintf, _vcwprintf, _vcprintf_s, Вывод форматированных данных на консоль


_vcprintf_s_l, _vcwprintf_s, _vcwprintf_s_l
Подпрограмма Использование

vfprintf, vfwprintf, vfprintf_s, _vfprintf_s_l, Запись форматированных данных в поток


vfwprintf_s, _vfwprintf_s_l

vprintf, vwprintf, vprintf_s, _vprintf_s_l, Запись форматированных данных в stdout


vwprintf_s, _vwprintf_s_l

_vsnprintf, _vsnwprintf, vsnprintf_s, Запись форматированных данных указанной


_vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, длины в буфер
_vsnwprintf_s_l

vsprintf, vswprintf, vsprintf_s, _vsprintf_s_l, Запись форматированных данных в буфер


vswprintf_s, _vswprintf_s_l

Когда программа начинает выполнение, код запуска автоматически открывает


несколько потоков: стандартный ввода (на который указывает stdin ), стандартный
вывода (на который указывает stdout ) и стандартный вывода ошибок (на который
указывает stderr ). Эти потоки по умолчанию направляются на консоль (клавиатуру
и экран). С помощью freopen можно перенаправить stdin , stdout или stderr на
файл на диске или на устройство.

Файлы, открытые с помощью потоковых подпрограмм, по умолчанию


буферизуются. Функции stdout stderr очищаются каждый раз, когда они
заполнены или, если вы пишете на символьное устройство, после каждого вызова
библиотеки. Если программа завершается аварийно, буферы вывода могут не быть
сброшены, что приводит к потере данных. Используйте fflush или _flushall
убедитесь, что буфер, связанный с указанным файлом, сбрасывается в
операционную систему или все открытые буферы сбрасываются. Операционная
система может кэшировать данные перед записью на диск. Функция фиксации на
диск гарантирует, что содержимое буфера с очисткой не будет потеряно при сбое
системы.

Существует два способа сохранить зафиксировать содержимое буфера на диске:

Скомпоновать код с файлом COMMODE.OBJ, чтобы установить глобальный


флаг фиксации. По умолчанию этот глобальный флаг имеет значение n , т. е.
"не фиксировать".

Установите флаг режима в c с помощью fopen или _fdopen .

Любой файл, открытый с флагом c или n , ведет себя в соответствии со значением


флага, вне зависимости от состояния глобального флага фиксации.
Если программа не закрывает поток явным образом, поток автоматически
закрывается при завершении программы. Следует, однако, закрывать поток, когда
программа завершает работу с ним, так как количество потоков, которые могут
одновременно быть открыты, ограничено. См _setmaxstdio . сведения об этом
ограничении.

Ввод может следовать сразу за выводом только с промежуточным вызовом fflush


или функции позиционирования в файле ( fseek , fsetpos или rewind ). За входными
данными можно следовать без промежуточного вызова функции
позиционирования файлов, если операция ввода обнаруживает конец файла.

См. также раздел


Ввод и вывод

Подпрограммы универсальной среды выполнения C по категориям


Низкоуровневый ввод-вывод
Статья • 03.04.2023

Эти функции напрямую обращаются к операционной системе для выполнения


операций более низкого уровня, чем при потоковом вводе-выводе.
Низкоуровневые входные и выходные вызовы не буферизовы и не форматировать
данные.

Низкоуровневые процедуры могут обращаться к стандартным потокам, открытым


при запуске программы, с помощью следующих стандартных дескрипторов файла.

STREAM Дескриптор файла

stdin 0

stdout 1

stderr 2

Низкоуровневые подпрограммы ввода-вывода задают глобальную errno


переменную при возникновении ошибки. При использовании низкоуровневых
функций необходимо включать STDIO.H только в том случае, если программе
требуется константа, определенная в STDIO.H , например индикатор конца файла
( EOF ).

Низкоуровневые функции ввода-вывода


Функция Использование

_close Закрывает файл

_commit Сбрасывает файл на диск

_creat, _wcreat Создать файл

_dup Возвращает следующий доступный дескриптор файла для


указанного файла

_dup2 Создает второй дескриптор для указанного файла

_eof Проверяет достижение конца файла

_lseek, _lseeki64 Перемещает указатель файла в указанное положение

_open, _wopen Открывает файл


Функция Использование

_read Считывает данные из файла

_sopen, _wsopen, _sopen_s, Открывает файл для совместного использования


_wsopen_s

_tell, _telli64 Получает текущую позицию указателя файла

_umask, _umask_s Задает маску разрешений для файла

_write Записывает данные в файл

Обычно _dup и _dup2 используются для связи предопределенных дескрипторов


файлов с разными файлами.

См. также раздел


Ввод и вывод

Подпрограммы универсальной среды выполнения C по категориям

Системные вызовы
Ввод-вывод на консоль и порт
Статья • 03.04.2023

Эти процедуры выполняют чтение и запись для консоли или порта с


определенным номером. Подпрограммы ввода-вывода консоли несовместимы с
подпрограммами потокового ввода-вывода или низкоуровневой библиотеки
ввода-вывода. Консоль или порт не должны быть открыты или закрыты перед
выполнением операций ввода-вывода, поэтому в этой категории нет открытых или
закрытых подпрограмм. В операционных системах Windows выходные данные этих
функций всегда направляются в консоль и не могут быть перенаправлены.

Процедуры ввода-вывода консоли и порта


Подпрограмма Использование

_cgets, _cgetws, _cgets_s, Считывание строки из консоли


_cgetws_s

_cprintf, _cwprintf, _cprintf_s, Вывод форматированных данных на консоль


_cprintf_s_l, _cwprintf_s,
_cwprintf_s_l

_cputs Вывод строки на консоль

_cscanf, _cwscanf, _cscanf_s, Считывание форматированных данных из консоли


_cscanf_s_l, _cwscanf_s,
_cwscanf_s_l

_getch, _getwch Считывание символа из консоли

_getche, _getwche Считывание и отображение символа из консоли

_inp Чтение байта из указанного порта ввода-вывода

_inpd Считывание двойного слова из указанного порта ввода-


вывода

_inpw Считывание двухбайтового слова из указанного порта


ввода-вывода

_kbhit Проверка нажатия клавиш в консоли, которую следует


выполнять перед попыткой чтения из консоли

_outp Запись байта в указанный порт ввода-вывода

_outpd Запись двойного слова в указанный порт ввода-вывода


Подпрограмма Использование

_outpw Запись слова в указанный порт ввода-вывода

_putch, _putwch Запись символа в консоль

_ungetch, _ungetwch "Отмена чтения" последнего символа, полученного из


консоли, чтобы он стал следующим символом для
считывания

См. также раздел


Ввод и вывод

Подпрограммы универсальной среды выполнения C по категориям


Функции _nolock
Статья • 03.04.2023

Функции _nolock — это версии функций ввода-вывода, которые не выполняют


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

Используйте функции _nolock только в том случае, если программа действительно


является однопоточной или если она устанавливает собственные блокировки.

Подпрограммы без блокировки


_fclose_nolock

_fflush_nolock

_fgetc_nolock, _fgetwc_nolock

_fread_nolock

_fseek_nolock, _fseeki64_nolock

_ftell_nolock, _ftelli64_nolock

_fwrite_nolock

_getc_nolock, _getwc_nolock

_getch_nolock, _getwch_nolock

_getchar_nolock, _getwchar_nolock

_getche_nolock, _getwche_nolock

_getdcwd_nolock, _wgetdcwd_nolock

_putc_nolock, _putwc_nolock

_putch_nolock, _putwch_nolock

_putchar_nolock, _putwchar_nolock

_ungetc_nolock, _ungetwc_nolock
_ungetch_nolock, _ungetwch_nolock

См. также раздел


Ввод и вывод

Подпрограммы универсальной среды выполнения C по категориям


Интернационализация
Статья • 03.04.2023

Библиотека среды выполнения Майкрософт предоставляет множество процедур,


которые можно использовать для настройки приложения для международных
рынков, таких как:

Подпрограммы, связанные с языковым стандартом


Подпрограммы расширенных символов
Многобайтовые процедуры символов
подпрограммы универсального текста

Для удобства большинство процедур, связанных с языковым стандартом, также


классифицируются по их действиям.

Многобайтовые подпрограммы и расширенные символьные процедуры


описываются вместе с их однобайтовыми аналогами, когда они существуют.

Также включены альтернативные варианты операторов ISO646.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Locale
Статья • 03.04.2023

Языковой стандарт — это настройки страны/региона и языковые настройки, с


помощью которых можно настраивать программы. К числу категорий, зависящих
от языкового стандарта, относится отображение форматов дат и денежных
значений. Дополнительные сведения см. в категориях языкового стандарта.

setlocale Используйте функцию для изменения или запроса некоторых или всех
сведений о языковом стандарте текущей программы или потока при
использовании функций без суффикса _l . Функции с суффиксом _l используют
переданные им параметры языкового стандарта только во время выполнения этой
конкретной функции. Чтобы создать языковой стандарт для использования с
функцией с суффиксом _l , используйте _create_locale. Чтобы освободить этот
языковой стандарт, используйте _free_locale. Чтобы получить текущий языковой
стандарт, используйте _get_current_locale.

Используется для _configthreadlocale управления тем, имеет ли каждый поток


собственный языковой стандарт или все потоки в программе совместно
используют один и тот же языковой стандарт. Дополнительные сведения см. в
разделе "Языковые параметры" и "Кодовые страницы".

Доступны более безопасные версии этих функций, в следующей таблице они


отмечены суффиксом _s ("secure, безопасная"). Дополнительные сведения см. в
разделе "Функции безопасности" в CRT.

Подпрограммы, зависящие от языкового


стандарта
Подпрограмма Использование Зависимость
настройки
категории
setlocale

atof, _atof_l, _wtof, _wtof_l Преобразовать символ в значение с LC_NUMERIC


плавающей запятой

atoi, _atoi_l, _wtoi, _wtoi_l Преобразовать символ в LC_NUMERIC


целочисленное значение
Подпрограмма Использование Зависимость
настройки
категории
setlocale

_atoi64, _atoi64_l, _wtoi64, Преобразовать символ в 64- LC_NUMERIC


_wtoi64_l разрядное целочисленное
значение

atol, _atol_l, _wtol, _wtol_l Преобразовать символ в значение LC_NUMERIC


long

_atodbl, _atodbl_l, _atoldbl, Преобразовать символ в значение LC_NUMERIC


_atoldbl_l, _atoflt, _atoflt_l double-long

is, isw подпрограммы Проверить данное целое число на LC_CTYPE


указанное условие.

isleadbyte, _isleadbyte_l Проверить на старший байт LC_CTYPE

localeconv Прочитать соответствующие LC_MONETARY,


значения для форматирования LC_NUMERIC
числовых величин

MB_CUR_MAX Максимальная длина в байтах LC_CTYPE


любого многобайтового символа в
текущем языковом стандарте
(макрос определен в STDLIB.H )

_mbccpy, _mbccpy_l,_mbccpy_s, Скопировать один многобайтовый LC_CTYPE


_mbccpy_s_l символ

_mbclen, mblen, _mblen_l Проверить и вернуть количество LC_CTYPE


байтов в многобайтовом символе

strlen, wcslen, _mbslen, _mbslen_l, Для строк многобайтовой LC_CTYPE


_mbstrlen, _mbstrlen_l кодировки: проверить каждый
символ в строке; вернуть длину
строки

mbstowcs, Преобразовать последовательность LC_CTYPE


_mbstowcs_l,mbstowcs_s, многобайтовых символов в
_mbstowcs_s_l соответствующую
последовательность расширенных
символов.

mbtowc, _mbtowc_l Преобразовать многобайтовый LC_CTYPE


символ в соответствующий
расширенный символ.
Подпрограмма Использование Зависимость
настройки
категории
setlocale

Функцииprintf Записать форматированные LC_NUMERIC


выходные данные (определяет
вывод символа
системы
счисления)

Функцииscanf Прочитать форматированные LC_NUMERIC


входные данные (определяет
распознавание
символа системы
счисления)

setlocale, _wsetlocale Выбрать языковой стандарт для Неприменимо


программы

strcoll, wcscoll, _mbscoll, _strcoll_l, Сравнить символы двух строк LC_COLLATE


_wcscoll_l, _mbscoll_l

_stricmp, _wcsicmp, _mbsicmp, Сравнить две строки без учета LC_CTYPE


_stricmp_l, _wcsicmp_l, _mbsicmp_l регистра

_stricoll, _wcsicoll, _mbsicoll, Сравнить символы двух строк LC_COLLATE


_stricoll_l, _wcsicoll_l, _mbsicoll_l (регистр не учитывается)

_strncoll, _wcsncoll, _mbsncoll, Сравнить первые n символов двух LC_COLLATE


_strncoll_l, _wcsncoll_l, _mbsncoll_l строк.

_strnicmp, _wcsnicmp, _mbsnicmp, Сравнить символы двух строк без LC_CTYPE


_strnicmp_l, _wcsnicmp_l, учета регистра.
_mbsnicmp_l

_strnicoll, _wcsnicoll, _mbsnicoll, Сравнить первые n символов двух LC_COLLATE


_strnicoll_l, _wcsnicoll_l, строк (регистр не учитывается)
_mbsnicoll_l

strftime, wcsftime, _strftime_l, Форматировать значение даты и LC_TIME


_wcsftime_l времени в соответствии с
предоставленным аргументом
format

_strlwr, _wcslwr, _mbslwr, _strlwr_l, Преобразовать "на месте" каждую LC_CTYPE


_wcslwr_l, _mbslwr_l,_strlwr_s, прописную букву в указанной
_strlwr_s_l, _mbslwr_s, _mbslwr_s_l, строке в нижний регистр
_wcslwr_s, _wcslwr_s_l
Подпрограмма Использование Зависимость
настройки
категории
setlocale

strtod, _strtod_l, wcstod, _wcstod_l Преобразовать строку символов в LC_NUMERIC


значение double (определяет
распознавание
символа системы
счисления)

strtol, wcstol, _strtol_l, _wcstol_l Преобразовать строку символов в LC_NUMERIC


значение long (определяет
распознавание
символа системы
счисления)

strtoul, _strtoul_l, wcstoul, Преобразовать строку символов в LC_NUMERIC


_wcstoul_l значение unsigned long (определяет
распознавание
символа системы
счисления)

_strupr, _strupr_l, _mbsupr, Преобразовать "на месте" каждую LC_CTYPE


_mbsupr_l, _wcsupr_l, букву в нижнем регистре в строке в
_wcsupr,_strupr_s, _strupr_s_l, верхний регистр
_mbsupr_s, _mbsupr_s_l, _wcsupr_s,
_wcsupr_s_l

strxfrm, wcsxfrm, _strxfrm_l, Преобразовать строку в LC_COLLATE


_wcsxfrm_l упорядоченную форму в
соответствии с языковым
стандартом

tolower, _tolower, towlower, Преобразовать указанный символ в LC_CTYPE


_tolower_l, соответствующий символ нижнего
_towlower_l,_mbctolower, регистра
_mbctolower_l, _mbctoupper,
_mbctoupper_l

toupper, _toupper, towupper, Преобразовать указанный символ в LC_CTYPE


_toupper_l, соответствующую прописную букву
_towupper_l,_mbctolower,
_mbctolower_l, _mbctoupper,
_mbctoupper_l
Подпрограмма Использование Зависимость
настройки
категории
setlocale

wcstombs, Преобразовать последовательность LC_CTYPE


_wcstombs_l,wcstombs_s, расширенных символов в
_wcstombs_s_l соответствующую
последовательность многобайтовых
символов

wctomb, _wctomb_l,wctomb_s, Преобразовать расширенный LC_CTYPE


_wctomb_s_l символ в соответствующий
многобайтовый символ

7 Примечание

Для многобайтовых подпрограмм кодовая страница с многобайтовой


кодировкой должна быть эквивалентна языковому стандарту.setlocale
_setmbcpс аргументом _MB_CP_LOCALE делает многобайтовую кодовую
страницу той же, что и кодовая setlocale страница.

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Кодовые страницы
Статья • 03.04.2023

Кодовая страница — это набор символов, который может содержать числа, знаки
пунктуации и другие глифы. Различные языки и языковые стандарты могут
использовать разные кодовые страницы. Например, кодовая страница ANSI 1252
используется для английского и большинства европейских языков; кодовая
страница OEM 932 используется для японского иероглифического письма Кандзи.

Кодовая страница может быть представлена в таблице в виде сопоставления


символов с однобайтовых или многобайтовых значений. Многие кодовые
страницы включают в себя набор символов ASCII для символов в диапазоне 0x00–
0x7F.

Библиотека среды выполнения Майкрософт использует следующие типы кодовых


страниц:

Системная кодовая страница ANSI по умолчанию. По умолчанию при запуске


система среды выполнения автоматически устанавливает многобайтовую
кодовую страницу на кодовую страницу ANSI по умолчанию системы,
полученную из операционной системы. Вызов

setlocale ( LC_ALL, "" );

также устанавливает для языкового стандарта системную кодовую страницу


ANSI по умолчанию.

Кодовая страница языкового стандарта. Поведение нескольких подпрограмм


времени выполнения зависит от текущего параметра языкового стандарта,
который включает кодовую страницу языкового стандарта. (Дополнительные
сведения см. в разделе "Языковой стандарт".) По умолчанию все
подпрограммы, зависящие от языкового стандарта, в библиотеке времени
выполнения Майкрософт используют кодовую страницу, соответствующую
языковому стандарту C. Во время выполнения можно изменить или запросить
кодовую страницу языкового стандарта, используемую с вызовом setlocale.

Многобайтовая кодовая страница. Поведение большинства подпрограмм


библиотеки времени выполнения, работающих с многобайтовыми
символами, зависит от текущей настройки многобайтовой кодовой страницы.
По умолчанию эти подпрограммы используют системную кодовую страницу
ANSI по умолчанию. Во время выполнения можно запрашивать и изменять
кодовую страницу _getmbcp с многобайтовой и _setmbcpсоответственно.

Языковой стандарт "C" определен ANSI для обеспечения соответствия


языковому стандарту, с которым обычно выполнялись программы C. Кодовая
страница для языкового стандарта "C" (кодовая страница "C") соответствует
кодировке ASCII. Например, в языковом стандарте "C" функция islower
возвращает значение true только для значений 0x61–0x7A. В другом языковом
стандарте islower может возвращаться true для этих и других значений, как
определено этим языковым стандартом.

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Интерпретация последовательностей
многобайтовых символов
Статья • 03.04.2023

Большинство подпрограмм для многобайтовых символов в библиотеке времени


выполнения Microsoft распознают последовательности многобайтовых символов,
относящиеся к многобайтовой кодовой странице. Выходное значение зависит от
параметра LC_CTYPE категории языкового стандарта. Для получения
дополнительной информации см. setlocale. Версии этих функций без суффикса _l
используют текущий языковой стандарт для этого поведения, зависяющего от
языкового стандарта. Версии с суффиксом _l идентичны, за исключением того, что
они используют параметр языкового стандарта вместо текущего языкового
стандарта.

Многобайтовые подпрограммы, зависящие


от языкового стандарта
Подпрограмма Использование

_mbclen, mblen, Проверить и вернуть количество байтов в многобайтовом символе


_mblen_l

strlen, wcslen, _mbslen, Для строк многобайтовой кодировки: проверить каждый символ в
_mbslen_l, _mbstrlen, строке и вернуть длину строки. Для строки расширенных символов:
_mbstrlen_l вернуть длину строки.

mbstowcs, Преобразовать последовательность многобайтовых символов в


_mbstowcs_l, соответствующую последовательность расширенных символов.
mbstowcs_s,
_mbstowcs_s_l

mbtowc, _mbtowc_l Преобразовать многобайтовый символ в соответствующий


расширенный символ.

wcstombs, Преобразовать последовательность расширенных символов в


_wcstombs_l, соответствующую последовательность многобайтовых символов
wcstombs_s,
_wcstombs_s_l

wctomb, _wctomb_l, Преобразовать расширенный символ в соответствующий


wctomb_s, многобайтовый символ
_wctomb_s_l
Независимые от языкового стандарта
многобайтовые подпрограммы
Подпрограмма Использование

mbrtoc16, Преобразование многобайтового символа UTF-8 в эквивалентный символ


mbrtoc32 UTF-16 или UTF-32

c16rtomb, Преобразование символа UTF-16 или UTF-32 в эквивалентный


c32rtomb многобайтовый символ UTF-8

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Операторы ISO646
Статья • 03.04.2023

Предоставляет читаемые альтернативы некоторым операторам или символам


пунктуации. Стандартный заголовок <iso646.h> доступен даже в автономной
реализации.

Макросы
Название Описание

and Альтернатива оператору && .

and_eq Альтернатива оператору &= .

bitand Альтернатива оператору & .

bitor Альтернатива оператору | .

compl Альтернатива оператору ~ .

not Альтернатива оператору ! .

not_eq Альтернатива оператору != .

or Альтернатива оператору || .

or_eq Альтернатива оператору |= .

xor Альтернатива оператору ^ .

xor_eq Альтернатива оператору ^= .

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Однобайтовые и многобайтовые
кодировки
Статья • 03.04.2023

Кодировка ASCII определяет символы в диапазоне от 0x00 до 0x7F. Существует


множество других наборов символов, в первую очередь европейских, которые
определяют символы в диапазоне 0x00 — 0x7F идентично набору символов ASCII,
а также определяют расширенный набор символов из 0x80 — 0xFF. 8-разрядный
однобайтовый набор символов (SBCS) достаточно для представления набора
символов ASCII и наборов символов для многих европейских языков. Однако
некоторые неевропейские наборы символов, такие как японский канджи, содержат
гораздо больше символов, чем могут быть представлены в однобайтовой схеме
кодирования и поэтому требуют многобайтового набора символов (MBCS).

7 Примечание

Многие подпрограммы библиотеки времени выполнения Майкрософт SBCS


обрабатывают многобайтовые байты, символы и строки соответствующим
образом. Многие многобайтовые кодировки определяют кодировку ASCII как
свое подмножество. Во многих многобайтовых кодировках каждый символ в
диапазоне от 0x00 до 0x7F совпадает с символом в кодировке ASCII, который
имеет то же значение. Например, и в строках ASCII, и в строках многобайтовой
кодировки однобайтовый нуль-символ ('\0') имеет значение 0x00 и означает
завершающий нуль-символ.

Многобайтовый набор символов может состоять из двухбайтовых и двухбайтовых


символов. Многобайтовая строка может содержать сочетание однобайтовых и
двухбайтовых символов. Двухбайтовый многобайтовый символ имеет старший
байт и младший байт. В отдельных многобайтовых кодировках старшие и младшие
байты попадают в определенный диапазон. При перекрытии этих диапазонов
может потребоваться оценить контекст, чтобы определить, работает ли заданный
байт в качестве байта свинца или байта следа.

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Типы данных SBCS и MBCS
Статья • 03.04.2023

Любая подпрограмма библиотеки времени выполнения Microsoft MBCS,


обрабатывающая только один многобайтовый символ или один байт
многобайтового символа, ожидает unsigned int аргумент (где 0x0000 <=
символьное значение <= 0xFFFF и 0x00 <= байтовое значение <= 0xFF).
Подпрограмма с многобайтовой кодировкой, обрабатывающая многобайтовые
байты или символы в контексте строк, ожидает строку многобайтовых символов,
представленную как указатель на тип unsigned char .

U Внимание!

Каждый байт многобайтового символа можно представить в виде 8-


разрядного типа char . Однако однобайтовый символ типа char SBCS или
MBCS со значением, превышающим 0x7F, является отрицательным. Если такой
символ преобразуется непосредственно в тип int или long , компилятор
дополняет результат знаком, что может привести к непредсказуемым
результатам.

Лучше представить байт многобайтового символа в виде 8-разрядного unsigned


char символа. Кроме того, чтобы избежать отрицательного результата,
преобразуйте однобайтовый символ типа в тип char unsigned char перед его
преобразованием в int объект или символ . long

Так как некоторые функции обработки строк SBCS принимают (подписанные)


char * параметры, предупреждение компилятора о несоответствии типов приведет

к _MBCS определению. Существует три способа избежать этого предупреждения,


они перечислены в порядке эффективности:

1. Использование подставляемых типобезопасных функций из файла TCHAR.H.


Поведение по умолчанию.

2. Используйте прямые макросы в TCHAR. H путем определения _MB_MAP_DIRECT


в командной строке. В этом случае необходимо вручную сопоставить типы.
Этот метод является самым быстрым, но не типобезопасно.

3. Использование типобезопасных функций статической библиотеки,


содержащихся в файле TCHAR.H. Для этого необходимо определить константу
_NO_INLINING в командной строке. Этот метод является самым медленным, но

наиболее типобезопасным.

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Юникод: Набор расширенных
символов
Статья • 03.04.2023

Расширенный символ — это двухбайтовый многоязыковой код символа. Все


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

Расширенный символ типа wchar_t . Строка расширенных символов представлена в


виде массива wchar_t[] . Вы указываете на массив с wchar_t* помощью указателя.

Вы можете представить любой символ ASCII в виде широкого символа,


префиксируя букву L . Например, L'\0' является завершающим расширенным (16-
разрядным) пустым символом.

Строковый литерал ASCII можно представить как строковый литерал с


расширенным символом, префиксируя букву L . Например, L"Hello" .

Как правило, широкие символы используют больше места в памяти, чем


многобайтовые символы. Но широкие символы быстрее обрабатываются.
Одновременно в многобайтовой кодировке может быть представлен только один
языковой стандарт. Все наборы символов в мире представлены одновременно
представлением Юникода.

См. также раздел


Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Использование универсальных
текстовых сопоставлений
Статья • 03.04.2023

Блок, относящийся только к системам Microsoft

Чтобы упростить написание кода для разных международных рынков, в


библиотеке времени выполнения Microsoft имеются специфичные для Microsoft
"универсальные текстовые" сопоставления для многих типов данных, подпрограмм
и других объектов. Эти сопоставления определяются в TCHAR.H. Данные
сопоставления имен можно использовать для написания универсального кода,
который можно компилировать в любом из трех типов наборов символов (ASCII
(однобайтовая кодировка), многобайтовая кодировка или Юникод), в зависимости
от константы манифеста, указанной с помощью оператора #define . Сопоставления
универсального текста — это расширения Майкрософт, которые не совместимы с
ANSI.

Директивы препроцессора для сопоставлений


универсального текста

#define Скомпилированная Пример


версия

_UNICODE Юникод _tcsrev


(расширенные соответствует
символы) _wcsrev

_MBCS Многобайтовые _tcsrev


символы соответствует
_mbsrev

Нет (значение по умолчанию: оба _UNICODE и Однобайтовая _tcsrev


_MBCS не определено) кодировка (ASCII) соответствует
strrev

Например, определенная в файле TCHAR.H универсальная текстовая функция


_tcsrev сопоставляется с функцией mbsrev , если в программе определена
константа MBCS , или с функцией _wcsrev , если определена константа _UNICODE . В
противном случае _tcsrev сопоставляется с strrev .
Универсальный текстовый тип данных _TCHAR , также определенный в TCHAR.H,
сопоставляется типу char , если определена константа _MBCS , типу wchar_t , если
определена константа _UNICODE , и типу char , если ни одна из констант не
определена. Для удобства в файле TCHAR.H также предусмотрены другие
сопоставления типов данных, однако _TCHAR является наиболее полезным типом.

Сопоставления типов данных универсального текста

Имя Однобайтовая _MBCS _UNICODE определено


универсального кодировка (_UNICODE, определено
текстового типа _MBCS не определены)
данных

_TCHAR char char wchar_t

_TINT int int wint_t

_TSCHAR signed char signed char wchar_t

_TUCHAR unsigned char unsigned char wchar_t

_TXCHAR char unsigned char wchar_t

_T или _TEXT Не действует (удаляется Не действует L (преобразует


препроцессором) (удаляется следующий символ или
препроцессором) строку в аналог в
Юникоде)

Полный список универсальных текстовых сопоставлений подпрограмм,


переменных и других объектов см. в разделе Сопоставления универсального
текста.

В следующих примерах кода показано использование функций _TCHAR и _tcsrev


для сопоставления моделям многобайтовой кодировки, Юникод и однобайтовой
кодировки.

_TCHAR *RetVal, *szString;

RetVal = _tcsrev(szString);

Если указано MBCS , препроцессор сопоставляет предыдущий фрагмент следующему


коду:

C
char *RetVal, *szString;

RetVal = _mbsrev(szString);

Если указано _UNICODE , препроцессор сопоставляет тот же фрагмент следующему


коду:

wchar_t *RetVal, *szString;

RetVal = _wcsrev(szString);

Если и _MBCS _UNICODE не определены, препроцессор сопоставляет фрагмент с


однобайтовый код ASCII следующим образом:

char *RetVal, *szString;

RetVal = strrev(szString);

Эти макросы позволяют создавать, обслуживать и компилировать один файл


исходного кода с помощью подпрограмм, относящихся ко всем трем типам
наборов символов.

Завершение блока, относящегося только к системам Майкрософт

См. также
Универсальные текстовые сопоставления

Сопоставления типов данных

Сопоставления констант и глобальных переменных

Сопоставления подпрограмм

Пример программы, использующей обычный текст


Пример программы, использующей
обычный текст
Статья • 03.04.2023

Блок, относящийся только к системам Microsoft

Следующая программа, GENTEXT.C, предоставляет более подробный пример


использования универсальных текстовых сопоставлений, определенных в TCHAR.H:

// GENTEXT.C

// use of generic-text mappings defined in TCHAR.H

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <direct.h>

#include <errno.h>

#include <tchar.h>

int __cdecl _tmain(int argc, _TCHAR **argv, _TCHAR **envp)

_TCHAR buff[_MAX_PATH];

_TCHAR *str = _T("Astring");

char *amsg = "Reversed";

wchar_t *wmsg = L"Is";

#ifdef _UNICODE

printf("Unicode version\n");

#else /* _UNICODE */

#ifdef _MBCS

printf("MBCS version\n");

#else

printf("SBCS version\n");

#endif

#endif /* _UNICODE */

if (_tgetcwd(buff, _MAX_PATH) == NULL)

printf("Can't Get Current Directory - errno=%d\n", errno);

else

_tprintf(_T("Current Directory is '%s'\n"), buff);

_tprintf(_T("'%s' %hs %ls:\n"), str, amsg, wmsg);

_tprintf(_T("'%s'\n"), _tcsrev(_tcsdup(str)));

return 0;

Если определена константа _MBCS , GENTEXT.C сопоставляется следующей


программе с многобайтовой кодировкой (MBCS):

// crt_mbcsgtxt.c

/*

* Use of generic-text mappings defined in TCHAR.H

* Generic-Text-Mapping example program

* MBCS version of GENTEXT.C

*/

#include <stdio.h>

#include <stdlib.h>

#include <mbstring.h>

#include <direct.h>

int __cdecl main(int argc, char **argv, char **envp)

char buff[_MAX_PATH];

char *str = "Astring";

char *amsg = "Reversed";

wchar_t *wmsg = L"Is";

printf("MBCS version\n");

if (_getcwd(buff, _MAX_PATH) == NULL) {

printf("Can't Get Current Directory - errno=%d\n", errno);

else {

printf("Current Directory is '%s'\n", buff);

printf("'%s' %hs %ls:\n", str, amsg, wmsg);

printf("'%s'\n", _mbsrev(_mbsdup((unsigned char*) str)));

return 0;

Если определена константа _UNICODE , GENTEXT.C сопоставляется следующей


Юникод-версии программы. Дополнительные сведения об использовании wmain в
программах Юникода в качестве замены main см. в справочнике wmain по языку C.

// crt_unicgtxt.c

/*

* Use of generic-text mappings defined in TCHAR.H

* Generic-Text-Mapping example program

* Unicode version of GENTEXT.C

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <direct.h>

int __cdecl wmain(int argc, wchar_t **argv, wchar_t **envp)

wchar_t buff[_MAX_PATH];

wchar_t *str = L"Astring";

char *amsg = "Reversed";

wchar_t *wmsg = L"Is";

printf("Unicode version\n");

if (_wgetcwd(buff, _MAX_PATH) == NULL) {

printf("Can't Get Current Directory - errno=%d\n", errno);

else {

wprintf(L"Current Directory is '%s'\n", buff);

wprintf(L"'%s' %hs %ls:\n", str, amsg, wmsg);

wprintf(L"'%s'\n", wcsrev(wcsdup(str)));

return 0;

Если _MBCS или _UNICODE он не определен, GENTEXT. C сопоставляется с кодом ASCII


с одним байтом следующим образом:

// crt_sbcsgtxt.c

/*

* Use of generic-text mappings defined in TCHAR.H

* Generic-Text-Mapping example program

* Single-byte (SBCS) Ascii version of GENTEXT.C

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <direct.h>

int __cdecl main(int argc, char **argv, char **envp)

char buff[_MAX_PATH];

char *str = "Astring";

char *amsg = "Reversed";

wchar_t *wmsg = L"Is";

printf("SBCS version\n");

if (_getcwd(buff, _MAX_PATH) == NULL) {

printf("Can't Get Current Directory - errno=%d\n", errno);

else {

printf("Current Directory is '%s'\n", buff);

printf("'%s' %hs %ls:\n", str, amsg, wmsg);

printf("'%s'\n", strrev(strdup(str)));

return 0;

Завершение блока, относящегося только к системам Майкрософт

См. также
Универсальные текстовые сопоставления

Сопоставления типов данных

Сопоставления констант и глобальных переменных

Сопоставления подпрограмм

Использование универсальных текстовых сопоставлений


Использование типов данных tchar.h с
_MBCS
Статья • 03.04.2023

Блок, относящийся только к системам Microsoft

Как указывает таблица сопоставлений подпрограмм универсального текста (см.


универсальные текстовые сопоставления), когда определена константа _MBCS
манифеста, данная универсальная текстовая подпрограмма будет сопоставляться с
одним из следующих видов подпрограмм:

Подпрограмма для однобайтовой кодировки, которая правильно


обрабатывает многобайтовые символы и строки. В этом случае ожидается,
что строковые аргументы будут иметь тип char* . Например, функция _tprintf
сопоставляется с функцией printf ; строковые аргументы функции printf
имеют тип char* . При использовании универсального строкового типа
данных _TCHAR типы формальных и фактических параметров функции printf
совпадают, потому что _TCHAR* сопоставляется с char* .

Подпрограмма, специально созданная для многобайтовой кодировки. В этом


случае ожидается, что строковые аргументы будут иметь тип unsigned char* .
Например, функция _tcsrev сопоставляется с функцией _mbsrev , которая
ожидает и возвращает строку типа unsigned char* . Опять же, если вы
используете универсальный текстовый _TCHAR тип данных для строковых
типов, существует потенциальный конфликт типов, так как _TCHAR
сопоставляется с типом char .

Есть три способа предотвратить такой конфликт типов (и избежать


предупреждений компилятора C или ошибок компиляции C++).

Использовать поведение по умолчанию. Файл TCHAR.H содержит прототипы


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

char *_tcsrev(char *);

В случае по умолчанию прототип функции _tcsrev сопоставляется с функцией


_mbsrev через преобразователь в LIBC.LIB. Этот элемент изменяет типы
_mbsrev входящих параметров и исходящее возвращаемое значение с

_TCHAR* (например char* ) на unsigned char* . Этот метод обеспечивает


сопоставление типов при использовании _TCHAR , но это относительно
медленно из-за затрат на вызов функции.

Использовать встраивание функций, включив в код следующую инструкцию


препроцессора.

#define _USE_INLINING

При этом подходе вызывается встроенный преобразователь функции,


реализованный в файле TCHAR.H, который непосредственно отображает
универсальную текстовую подпрограмму на соответствующую MBCS-
подпрограмму. Следующий фрагмент кода из TCHAR. H предоставляет пример
того, как это сделать.

__inline char *_tcsrev(char *_s1)

{return (char *)_mbsrev((unsigned char *)_s1);}

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

Использовать "прямое отображение" путем включения в код следующей


инструкции препроцессора.

#define _MB_MAP_DIRECT

Этот подход предоставляет быструю альтернативу, если вы не хотите


использовать поведение по умолчанию или не можете использовать
встраивание. Макрос сопоставляет подпрограмму универсального текста с
версией подпрограммы MBCS, как показано в следующем примере из
TCHAR.H.

#define _tcschr _mbschr

При таком подходе будьте внимательны, чтобы убедиться, что соответствующие


типы данных используются для строковых аргументов и возвращаемых строковых
значений. Можно воспользоваться явным приведением типов, чтобы
гарантировать соответствие типов, либо универсальным строковым типом данных
_TXCHAR . Тип _TXCHAR сопоставляется с типом char в коде с однобайтовой
кодировкой, но в коде с многобайтовой кодировкой он сопоставляется с типом
unsigned char . Дополнительные сведения о макросах универсального текста см. в

разделе "Универсальные текстовые сопоставления".

Завершение блока, относящегося только к системам Майкрософт

См. также
Интернационализация

Подпрограммы универсальной среды выполнения C по категориям


Выделение памяти
Статья • 03.04.2023

Эти подпрограммы выделяют, освобождают и перераспределять память.

Процедуры выделения памяти


Подпрограмма Использование

_alloca, _malloca Выделение памяти из стека

calloc Выделение массива и инициализация его элементов равным 0 (нулю)

_calloc_dbg Отладочная версия calloc . Доступно только в отладочных версиях


библиотек времени выполнения.

operator delete, Выделенная в куче свободная память


operator delete[]

_expand Расширение или сжатие блока памяти без его перемещения

_expand_dbg Отладочная версия _expand . Доступно только в отладочных версиях


библиотек времени выполнения.

free Выделенная в куче свободная память

_free_dbg Отладочная версия free . Доступно только в отладочных версиях


библиотек времени выполнения.

_freea Свободная память, выделенная в стеке

_get_heap_handle Получите Win32 HANDLE в кучу среды выполнения C (CRT).

_heapadd Добавление памяти в кучу

_heapchk Проверка кучи на согласованность

_heapmin Освобождение неиспользуемой памяти в куче

_heapset Заполнение свободных записей кучи значением

_heapwalk Получение сведений о каждой записи в куче

malloc Выделение памяти из кучи

_malloc_dbg Отладочная версия malloc ; доступна только в отладочных версиях


библиотек среды выполнения

_msize Возврат размера выделенного блока памяти


Подпрограмма Использование

_msize_dbg Отладочная версия _msize ; доступна только в отладочных версиях


библиотек среды выполнения

new, new[] Выделение блока памяти из кучи

_query_new_handler Получение адреса текущей новой подпрограммы обработчика,


заданной по _set_new_handler

_query_new_mode Получение нового режима обработчика, заданного для


_set_new_mode malloc

realloc Перераспределять блок до нового размера

_realloc_dbg Отладочная версия realloc ; доступна только в отладочных версиях


библиотек среды выполнения

_set_new_handler Включение механизма обработки ошибок, когда оператору new не


удается выделить память, и включение компиляции стандартных
библиотек C++

_set_new_mode Установка нового режима обработчика для malloc

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Управление процессами и средой
Статья • 03.04.2023

С помощью подпрограмм для управления процессами можно запускать и


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

Функции управления процессами и средой


Подпрограмма Использование

abort Прерывает процесс без очистки буферов или вызова функций,


зарегистрированных с помощью atexit и _onexit

assert Проверяет на наличие логических ошибок.

_ASSERT, Подобны assert , но доступны только в отладочных версиях библиотек


_ASSERTE времени выполнения
макросы

atexit Подпрограммы расписания для выполнения при завершении программы.

_beginthread, Создает новый поток в процессе операционной системы Windows.


_beginthreadex

_cexit Выполняет процедуры завершения exit (например, очистка буферов), а


затем возвращает управление вызывающей программе без прерывания
процесса.

_c_exit Выполняет процедуры завершения _exit , а затем возвращает управление


вызывающей программе без прерывания процесса.

_cwait Ожидает завершения другого процесса.

_endthread, Завершает поток операционной системы Windows.


_endthreadex

_execl, _wexecl Выполняет новый процесс со списком аргументов.

_execle, Выполняет новый процесс со списком аргументов и заданной средой.


_wexecle

_execlp, Выполняет новый процесс, используя переменную PATH и список


_wexeclp аргументов.
Подпрограмма Использование

_execlpe, Выполняет новый процесс, используя переменную PATH , заданную среду


_wexeclpe и список аргументов

_execv, _wexecv Выполняет новый процесс с массивом аргументов

_execve, Выполняет новый процесс с массивом аргументов и заданной средой


_wexecve

_execvp, Выполняет новый процесс, используя переменную PATH и массив


_wexecvp аргументов.

_execvpe, Выполняет новый процесс, используя переменную PATH , заданную среду


_wexecvpe и массив аргументов.

exit Вызывает функции, зарегистрированные с помощью atexit и _onexit ,


очищает все буферы, закрывает все открытые файлы и завершает
процесс.

_exit Завершает процесс немедленно без вызова atexit или _onexit либо
очистки буферов.

getenv, Получает значение переменной среды.


_wgetenv,
getenv_s,
_wgetenv_s

_getpid Получает идентификатор процесса.

longjmp Восстанавливает сохраненную среду стека и использует ее для


выполнения нелокальной команды goto .

_onexit Подпрограммы расписания, которые следует выполнять при завершении


программы. Используются для обеспечения совместимости с Microsoft
C/C++ версии 7.0 и более ранними версиями.

_pclose Ожидает новый обработчик команд и закрывает поток по связанному


каналу.

perror, _wperror Сообщение об ошибке печати.

_pipe Создает канал для чтения и записи.

_popen, Создает канал и выполняет команду.


_wpopen

_putenv, Получает или изменяет значения переменной среды.


_wputenv,
_putenv_s,
_wputenv_s
Подпрограмма Использование

raise Отправляет сигнал для вызывающего процесса.

setjmp Сохраняет среду стека. Используется для выполнения нелокальной


команды goto .

signal Обрабатывает сигнал прерывания.

_spawnl, Создает процесс и выполняет его с указанным списком аргументов.


_wspawnl

_spawnle, Создает процесс и выполняет его с указанным списком аргументов и


_wspawnle средой.

_spawnlp, Создает процесс и выполняет его, используя переменную PATH и


_wspawnlp указанный список аргументов.

_spawnlpe, Создает процесс и выполняет его, используя переменную PATH ,


_wspawnlpe указанную среду и список аргументов.

_spawnv, Создает процесс и выполняет его с указанным массивом аргументов.


_wspawnv

_spawnve, Создает процесс и выполняет его с указанной средой и массивом


_wspawnve аргументов.

_spawnvp, Создает процесс и выполняет его, используя переменную PATH и


_wspawnvp указанный массив аргументов.

_spawnvpe, Создает процесс и выполняет его, используя переменную PATH ,


_wspawnvpe указанную среду и массив аргументов.

system, Выполняет команду операционной системы.


_wsystem

В операционной системе Windows порожденный процесс эквивалентен процессу


создания. Любой процесс может использовать функцию _cwait для ожидания
любого другого процесса с известным идентификатором.

Разница между семействами _exec и _spawn заключается в том, что функция


_spawn может переключить управление из нового процесса к вызывающему. В

функции _spawn вызывающий и новый процесс находятся в памяти, если не


указано _P_OVERLAY . _exec В функции новый процесс накладывает вызывающий
процесс, поэтому управление не может вернуться в вызывающий процесс, если в
попытке начать выполнение нового процесса не возникнет ошибка.
Различия между функциями в _exec и _spawn семействах включают метод поиска
файла, выполняемого в качестве нового процесса, форму, в которой аргументы
передаются в новый процесс, и метод задания среды, как показано в следующей
таблице. Используйте функцию, передающую список аргументов, когда число
аргументов является постоянным или известно в момент компиляции. Используйте
функцию, передающую указатель в массив, содержащий аргументы, когда число
аргументов определяется во время выполнения. Сведения в следующей таблице
также применимы к аналогам функции _spawn и _exec с расширенными
символами.

_spawn семейства функций и _exec

Функции Использование PATH Соглашение Параметры среды


переменной для о передаче
поиска файла аргументов

_execl , Нет Список Унаследовано от вызывающего


_spawnl процесса

_execle , Нет Список Указатель на таблицу среды для нового


_spawnle процесса, переданного в качестве
последнего аргумента

_execlp , Да Список Унаследовано от вызывающего


_spawnlp процесса

_execvpe , Да Array Указатель на таблицу среды для нового


_spawnvpe процесса, переданного в качестве
последнего аргумента

_execlpe , Да Список Указатель на таблицу среды для нового


_spawnlpe процесса, переданного в качестве
последнего аргумента

_execv , Нет Array Унаследовано от вызывающего


_spawnv процесса

_execve , Нет Array Указатель на таблицу среды для нового


_spawnve процесса, переданного в качестве
последнего аргумента

_execvp , Да Array Унаследовано от вызывающего


_spawnvp процесса

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Устойчивость
Статья • 03.04.2023

Используйте следующие функции библиотеки времени выполнения языка C, чтобы


повысить надежность своей программы.

Функции надежности во время выполнения


Функция Использование

_set_new_handler Передает управление механизму обработки ошибок, если оператору new


не удается выделить память.

_set_se_translator Обрабатывает исключения Win32 (структурированные исключения C) как


типизированные исключения C++.

set_terminate Устанавливает собственную функцию завершения, которая будет


вызываться terminate.

set_unexpected Устанавливает собственную функцию завершения, которая будет


вызываться unexpected.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

SetUnhandledExceptionFilter
Проверка ошибок во время
выполнения
Статья • 03.04.2023

Библиотека среды выполнения C содержит функции, поддерживающие проверки


ошибок времени выполнения (RTC). Проверка ошибок во время выполнения
позволяет создавать программу таким образом, чтобы сообщались определенные
типы ошибок среды выполнения. Можно указать, каким образом происходит
уведомление об ошибках, а также типы этих ошибок. Дополнительные сведения см.
в разделе "Практическое руководство. Использование собственных проверок
среды выполнения".

Используйте следующие функции, чтобы настроить способ выполнения проверки


ошибок во время выполнения.

Функции проверки ошибок во время


выполнения
Функция Использование

_RTC_GetErrDesc Возвращает краткое описание типа проверки ошибок во время


выполнения.

_RTC_NumErrors Возвращает общее количество ошибок, которые могут быть


обнаружены при проверке ошибок среды выполнения.

_RTC_SetErrorFunc Указывает функцию в качестве обработчика для проверки ошибок


среды выполнения отчетов.

_RTC_SetErrorType Связывает ошибку, обнаруженную при проверке ошибок среды


выполнения с типом.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

/RTC (проверки ошибок среды выполнения)

runtime_checks

Подпрограммы отладки
Сортировка и поиск
Статья • 03.04.2023

Используйте следующие функции для поиска и сортировки.

Поиск и сортировка функций


Функция Поиск или сортировка

bsearch Двоичный поиск

bsearch_s Более безопасная версия bsearch

_lfind Линейный поиск заданного значения

_lfind_s Более безопасная версия _lfind

_lsearch Линейный поиск заданного значения, которое добавляется в массив, если оно
не найдено

_lsearch_s Более безопасная версия _lsearch

qsort Быстрая сортировка

qsort_s Более безопасная версия qsort

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Управление строками (CRT)
Статья • 03.04.2023

Эти подпрограммы работают с завершающимися нуль-символом строками из


однобайтовых, расширенных и многобайтовых символов. Для работы с массивами
символов, которые не заканчиваются символами, используйте подпрограммы для
манипуляции с буферами, описанными в разделе "Манипуляция с буфером NULL ".

Подпрограммы обработки строк


Подпрограмма Использование

strcoll, wcscoll, _mbscoll, _strcoll_l, _wcscoll_l, _mbscoll_l, Сравнивают две символьных строки
_stricoll, _wcsicoll, _mbsicoll, _stricoll_l, _wcsicoll_l, с использованием данных кодовой
_mbsicoll_l, _strncoll, _wcsncoll, _mbsncoll, _strncoll_l, страницы ( _mbsicoll и _mbsnicoll
_wcsncoll_l, _mbsncoll_l, _strnicoll, _wcsnicoll, _mbsnicoll, не учитывают регистр)
_strnicoll_l, _wcsnicoll_l, _mbsnicoll_l

_strdec, _wcsdec, _mbsdec, _mbsdec_l Перемещают указатель строки на


один символ назад

_strinc, _wcsinc, _mbsinc, _mbsinc_l Перемещают указатель строки на


один символ вперед

_mbsnbcat, _mbsnbcat_l, _mbsnbcat_s, _mbsnbcat_s_l Добавляют не более n первых байт


одной символьной строки в другую

_mbsnbcmp, _mbsnbcmp_l Сравнивают первые n байт двух


символьных строк

_strncnt, _wcsncnt, _mbsnbcnt, _mbsnbcnt_l, _mbsnccnt, Возвращают число байтов


_mbsnccnt_l символов в пределах указанного
числа символов

_mbsnbcpy, _mbsnbcpy_l, _mbsnbcpy_s, _mbsnbcpy_s_l Копируют n байт строки

_mbsnbicmp, _mbsnbicmp_l Сравнивают n байт двух


символьных строк без учета
регистра

_mbsnbset, _mbsnbset_l Устанавливают для первых n байт


символьной строки значение
указанного символа

_strncnt, _wcsncnt, _mbsnbcnt, _mbsnbcnt_l, _mbsnccnt, Возвращают количество символов в


_mbsnccnt_l указанном количестве байтов
Подпрограмма Использование

_strnextc, _wcsnextc, _mbsnextc, _mbsnextc_l Находят следующий символ в


строке

_strninc, _wcsninc, _mbsninc, _mbsninc_l Перемещают указатель строки на n


символов вперед

_strspnp, _wcsspnp, _mbsspnp, _mbsspnp_l Возврат указателя на первый


символ в заданной строке, которая
не указана в другой строке

_scprintf, _scprintf_l, _scwprintf, _scwprintf_l Возвращают количество символов в


отформатированной строке

_snscanf, _snscanf_l, _snwscanf, _snwscanf_l, _snscanf_s, Считывают форматированные


_snscanf_s_l, _snwscanf_s, _snwscanf_s_l данные указанной длины из
стандартного входного потока.

sscanf, _sscanf_l, swscanf, _swscanf_l, sscanf_s, _sscanf_s_l, Считывают форматированные


swscanf_s, _swscanf_s_l данные указанной длины из
стандартного входного потока.

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l, Записывают форматированных


sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l, _sprintf_p, данных в строку
_sprintf_p_l, _swprintf_p, _swprintf_p_l

strcat, wcscat, _mbscat, strcat_s, wcscat_s, _mbscat_s Добавляют одну строку к другой

strchr, wcschr, _mbschr, _mbschr_l Находят первое вхождение


указанного символа в строке

strcmp, wcscmp, _mbscmp Сравнивают две строки

strcoll, wcscoll, _mbscoll, _strcoll_l, _wcscoll_l, _mbscoll_l, Сравнивают две строки, используя
_stricoll, _wcsicoll, _mbsicoll, _stricoll_l, _wcsicoll_l, данные кодовой страницы текущего
_mbsicoll_l, _strncoll, _wcsncoll, _mbsncoll, _strncoll_l, языкового стандарта ( _stricoll ,
_wcsncoll_l, _mbsncoll_l, _strnicoll, _wcsnicoll, _mbsnicoll, _wcsicoll , _strnicoll и _wcsnicoll
_strnicoll_l, _wcsnicoll_l, _mbsnicoll_l не учитывают регистр)

strcpy, wcscpy, _mbscpy, strcpy_s, wcscpy_s, _mbscpy_s Копируют одну строку в другую

strcspn, wcscspn, _mbscspn, _mbscspn_l Находят в строке первое вхождение


символа из указанного набора
символов

_strdup, _wcsdup, _mbsdup, _strdup_dbg, _wcsdup_dbg Дублируют строку

strerror, _strerror, _wcserror, __wcserror, strerror_s, Сопоставляют номер ошибки


_strerror_s, _wcserror_s, __wcserror_s строке сообщения
Подпрограмма Использование

strftime, wcsftime, _strftime_l, _wcsftime_l Форматируют строку даты и


времени

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, Сравнить две строки без учета
_mbsicmp_l регистра

strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, Вычисляют длину строки


_mbstrlen_l, strnlen, strnlen_s, wcsnlen, wcsnlen_s,
_mbsnlen, _mbsnlen_l, _mbstrnlen, _mbstrnlen_l

_strlwr, _wcslwr, _mbslwr, _strlwr_l, _wcslwr_l, _mbslwr_l, Преобразуют строку в нижний


_strlwr_s, _strlwr_s_l, _mbslwr_s, _mbslwr_s_l, _wcslwr_s, регистр
_wcslwr_s_l

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, Добавляют символы строки


_mbsncat_l, strncat_s, _strncat_s_l, wcsncat_s,
_wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l Сравнить символы двух строк

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, Копируют символы одной строки в


_mbsncpy_l, strncpy_s, _strncpy_s_l, wcsncpy_s, другую
_wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, Сравнить символы двух строк без


_wcsnicmp_l, _mbsnicmp_l учета регистра

_strnset, _strnset_l, _wcsnset, _wcsnset_l, _mbsnset, Устанавливают для первых n


_mbsnset_l символов строки значение
указанного символа

strpbrk, wcspbrk, _mbspbrk, _mbspbrk_l Находят первое вхождение символа


из одной строки в другой строке

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l Находят последнее вхождение


указанного символа в строке

_strrev, _wcsrev, _mbsrev, _mbsrev_l Изменяют порядок символов в


строке на обратный

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l Устанавливают для всех символов
строки значение определенного
символа

strspn, wcsspn, _mbsspn, _mbsspn_l Находят в строке первое вхождение


символа, отсутствующего в другой
строке
Подпрограмма Использование

strstr, wcsstr, _mbsstr, _mbsstr_l Находят первое вхождение


указанной строки в другой строке

strtok, _strtok_l, wcstok, _wcstok_l, _mbstok, _mbstok_l, Находят следующий токен в строке
strtok_s, _strtok_s_l, wcstok_s, _wcstok_s_l, _mbstok_s,
_mbstok_s_l

_strupr, _strupr_l, _mbsupr, _mbsupr_l, _wcsupr_l, Преобразуют строку в верхний


_wcsupr, _strupr_s, _strupr_s_l, _mbsupr_s, _mbsupr_s_l, регистр
_wcsupr_s, _wcsupr_s_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l Преобразуют строку в


упорядоченную форму,
основываясь на данных языкового
стандарта

vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, __vswprintf_l, Записывают форматированные


vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l, выходные данные с помощью
_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l указателя на список аргументов

vsnprintf, _vsnprintf, _vsnprintf_l, _vsnwprintf, Записывают форматированные


_vsnwprintf_l, vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, выходные данные с помощью
_vsnwprintf_s, _vsnwprintf_s_l указателя на список аргументов

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Системные вызовы
Статья • 03.04.2023

Следующие функции являются вызовами операционной системы Windows.

Функции системного вызова


Функция Использование

_findclose Освобождение
ресурсов от
предыдущих операций
поиска

_findfirst, _findfirst32, _findfirst64, _findfirsti64, _findfirst32i64, Поиск файла с


_findfirst64i32, _wfindfirst, _wfindfirst32, _wfindfirst64, _wfindfirsti64, указанными атрибутами
_wfindfirst32i64, _wfindfirst64i32

_findnext, _findnext32, _findnext64, _findnexti64, _findnext32i64, Поиск следующего


_findnext64i32, _wfindnext, _wfindnext32, _wfindnexti64, файла с указанными
_wfindnext64, _wfindnexti64 атрибутами

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Обработка файлов

Управление каталогами

Низкоуровневый ввод-вывод
Управление временем
Статья • 03.04.2023

Эти функции следует использовать для получения текущего времени, его


преобразования, корректировки и хранения, как требуется. Текущее время
представляет собой системное время.

Подпрограммы _ftime и localtime используют переменную среды TZ . Если TZ


этот параметр не задан, библиотека времени выполнения пытается использовать
сведения о часовом поясе, указанные операционной системой. Если такие
сведения недоступны, эти функции используют значение по умолчанию PST8PDT.
Дополнительные сведения см TZ . в разделе , см. также в разделе _tzset_daylight,
timezoneа _tznameтакже .

Подпрограммы времени

Функция Использование

asctime, _wasctime, asctime_s, Преобразуют время из типа struct tm в символьную


_wasctime_s строку. Версии этих функций с суффиксом _s
являются более безопасными.

clock Возвращают реальное прошедшее время для


процесса.

ctime, _ctime32, _ctime64, _wctime, Преобразуют время из типа time_t , __time32_t или
_wctime32, _wctime64, _ctime_s, __time64_t в символьную строку. Версии этих функций
_ctime32_s, _ctime64_s, _wctime_s, с суффиксом _s являются более безопасными.
_wctime32_s, _wctime64_s

difftime, _difftime32, _difftime64 Вычисляют разницу между двумя значениями


времени.

_ftime, _ftime32, Хранение текущего системного времени в


_ftime64,_ftime_s_ftime32_s переменной типа struct _timeb или struct __timeb64
_ftime64_s Версии этих функций с суффиксом _s являются более
безопасными.

_futime, _futime32, _futime64 Задают время изменения открытого файла

gmtime, _gmtime32, _gmtime64, Преобразование времени из типа time_t в struct tm


gmtime_s, _gmtime32_s, тип или из типа __time64_t в struct tm . Версии этих
_gmtime64_s функций с суффиксом _s являются более
безопасными.
Функция Использование

localtime, _localtime32, _localtime64, Преобразуют время из типа time_t в struct tm или из


localtime_s, _localtime32_s, типа __time64_t в struct tm с поправкой на местное
_localtime64_s время. Версии этих функций с суффиксом _s являются
более безопасными.

_mkgmtime, _mkgmtime32, Преобразовывают время в календарное значение по


_mkgmtime64 времени GMT.

mktime, _mktime32, _mktime64 Преобразовывают время в календарное значение.

_strdate, _wstrdate, _strdate_s, Возвращают текущую дату системы в виде строки.


_wstrdate_s Версии этих функций с суффиксом _s являются более
безопасными.

strftime, wcsftime, _strftime_l, Форматируют строку даты и времени для


_wcsftime_l международного использования.

_strtime, _wstrtime, _strtime_s, Возвращают текущее системное время в виде строки.


_wstrtime_s Версии этих функций с суффиксом _s являются более
безопасными.

time, _time32, _time64 Получают текущее системное время как значение


типа time_t , __time32_t или __time64_t .

_tzset Задает значения внешних переменных времени но


основе значения переменной времени среды TZ .

_utime, _utime32, _utime64, _wutime, Задают время изменения указанного файла, используя
_wutime32, _wutime64 либо текущее время, либо значение времени,
хранящееся в структуре.

7 Примечание

Во всех версиях Microsoft C/C++, кроме версии Microsoft C/C++ 7.0, и во всех
версиях Visual C++ эта функция времени возвращает текущее время как
количество секунд, прошедших с полуночи 1-го января 1970 года. В версии
Microsoft C/C++ 7.0 функция time возвращает текущее время как количество
секунд, истекших с полуночи 31-го декабря 1899 года.

7 Примечание

В версиях Visual C++ и Microsoft C++ до Visual Studio 2005 time_t было long
int (32 бита) и, следовательно, не может использоваться для дат за последние
3:14:07 19 января 2038 г. в формате UTC. Теперь тип time_t по умолчанию
эквивалентен типу __time64_t , но при задании директивы _USE_32BIT_TIME_T
тип time_t изменяется на тип __time32_t and forces many time functions
изменяется на тип call versions that take the 32-bit time_t . Дополнительные
сведения см. в документации по отдельным функциям времени в стандартных
типах и комментариях.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
Функции CRT, которые не
поддерживаются средой выполнения
Windows
Статья • 03.04.2023

Многие API времени выполнения C (CRT) нельзя использовать в приложениях


универсальная платформа Windows (UWP), которые выполняются в среда
выполнения Windows. Для сборки таких приложений используется флаг
компилятора /ZW. Список неподдерживаемых функций CRT см. в статье CRT
functions not supported in Universal Windows Platform apps (Функции CRT, которые
не поддерживаются приложениями универсальной платформы Windows).

Все API CRT описаны в разделе справочника по алфавитной функции


документации.

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям

Алфавитный указатель функций


Внутренние глобальные переменные
и функции CRT
Статья • 03.04.2023

Библиотека времени выполнения языка C (CRT) содержит функции и глобальные


переменные, которые используются только для поддержки интерфейса общей
библиотеки. Некоторые из них предоставляются в общих заголовках как сведения
о реализации. Хотя эти функции и глобальные переменные доступны через
общедоступные экспорты, они не предназначены для использования в коде. Мы
рекомендуем изменить код, использующий эти функции и переменные, чтобы
использовать вместо них эквиваленты общей библиотеки. Эти функции могут
изменяться в разных версиях. Они перечислены здесь, чтобы помочь вам
определить их. Ссылки предоставляются, если существует другая документация, но
в целом эти сведения о реализации не документируются.

Внутренние глобальные значения CRT и


макросы значений
Следующие глобальные переменные и определения макросов используются для
реализации CRT.

Название

__badioinfo

_acmdln

_commode

_crtAssertBusy

_crtBreakAlloc

__initenv

__lconv

__mb_cur_max

__pioinfo

__unguarded_readlc_active
Название

_wcmdln

__winitenv

Внутренние функции И макросы функций


CRT
Следующие функции и макросы функций используются для реализации CRT и
стандартной библиотеки C++.

Название

__acrt_iob_func

__AdjustPointer

__BuildCatchObject

__BuildCatchObjectHelper

__C_specific_handler

_calloc_base

_chkesp

__chkstk

_chkstk

_chvalidator

_chvalidator_l

_CIacos

_CIasin

_CIatan

_CIatan2

_CIcos

_CIcosh

_CIexp
Название

_CIfmod

_CIlog

_CIlog10

_CIpow

_CIsin

_CIsinh

_CIsqrt

_CItan

_CItanh

__clean_type_info_names_internal

_configure_narrow_argv

_configure_wide_argv

__conio_common_vcprintf

__conio_common_vcprintf_p

__conio_common_vcprintf_s

__conio_common_vcscanf

__conio_common_vcwprintf

__conio_common_vcwprintf_p

__conio_common_vcwprintf_s

__conio_common_vcwscanf

__CppXcptFilter

__create_locale

_crt_atexit

_crt_at_quick_exit

__crtCompareStringA

__crtCompareStringEx
Название

__crtCompareStringW

__crtCreateEventExW

__crtCreateSemaphoreExW

__crtCreateSymbolicLinkW

_crt_debugger_hook

__crtEnumSystemLocalesEx

__crtFlsAlloc

__crtFlsFree

__crtFlsGetValue

__crtFlsSetValue

_CrtGetCheckCount

__crtGetDateFormatEx

__crtGetFileInformationByHandleEx

__crtGetLocaleInfoEx

__crtGetShowWindowMode

__crtGetTickCount64

__crtGetTimeFormatEx

__crtGetUserDefaultLocaleName

__crtInitializeCriticalSectionEx

__crtIsPackagedApp

__crtIsValidLocaleName

__crtLCMapStringA

__crtLCMapStringEx

__crtLCMapStringW

_CrtSetCheckCount
Название

_CrtSetDbgBlockType

__crtSetFileInformationByHandle

__crtSetThreadStackGuarantee

__crtSetUnhandledExceptionFilter

__crtSleep

__crtTerminateProcess

__crtUnhandledException

__CxxDetectRethrow

__CxxExceptionFilter

__CxxFrameHandler

__CxxFrameHandler2

__CxxFrameHandler3

__CxxLongjmpUnwind

__CxxQueryExceptionSize

__CxxRegisterExceptionObject

_CxxThrowException

__CxxUnregisterExceptionObject

_dclass

__DestructExceptionObject

__dllonexit

__doserrno

_dosmaperr

_dpcomp

_dsign

__dstbias

_dtest
Название

_EH_prolog

_errno

_except_handler

_except_handler2

_except_handler3

_except_handler4_common

_except1

_execute_onexit_table

_fdclass

_fdpcomp

_fdsign

_fdtest

_filbuf

_FindAndUnlinkFrame

_flsbuf

__fpe_flt_rounds

_FPE_Raise

__fpecode

__FrameUnwindFilter

_fread_nolock_s

_free_base

__free_locale

_freea_s

_freefls

_ftol

__get_current_locale
Название

__get_flsindex

_get_initial_narrow_environment

_get_initial_wide_environment

_get_narrow_winmain_command_line

_get_stream_buffer_pointers

__get_tlsindex

_get_wide_winmain_command_line

_Getdays

__getmainargs

_Getmonths

__GetPlatformExceptionInfo

_getptd

_Gettnames

_global_unwind2

_inconsistency

_initialize_lconv_for_unsigned_char

_initialize_narrow_environment

_initialize_onexit_table

_initialize_wide_environment

_initptd

_invalid_parameter

_invoke_watson

__iob_func

_IsExceptionObjectToBeDestroyed

___lc_codepage_func

___lc_collate_cp_func
Название

___lc_locale_name_func

__lconv_init

_ldclass

_ldpcomp

_ldsign

_ldtest

__libm_sse2_acos

_libm_sse2_acos_precise

__libm_sse2_acosf

__libm_sse2_asin

_libm_sse2_asin_precise

__libm_sse2_asinf

__libm_sse2_atan

_libm_sse2_atan_precise

__libm_sse2_atan2

__libm_sse2_atanf

__libm_sse2_cos

_libm_sse2_cos_precise

__libm_sse2_cosf

__libm_sse2_exp

_libm_sse2_exp_precise

__libm_sse2_expf

__libm_sse2_log

_libm_sse2_log_precise

__libm_sse2_log10

_libm_sse2_log10_precise
Название

__libm_sse2_log10f

__libm_sse2_logf

__libm_sse2_pow

_libm_sse2_pow_precise

__libm_sse2_powf

__libm_sse2_sin

_libm_sse2_sin_precise

__libm_sse2_sinf

_libm_sse2_sqrt_precise

__libm_sse2_tan

_libm_sse2_tan_precise

__libm_sse2_tanf

_local_unwind2

_local_unwind4

_lock_locales

_longjmpex

_malloc_base

___mb_cur_max_func

___mb_cur_max_l_func

_mbctype

_NLG_Dispatch2

_NLG_Return

_NLG_Return2

__p___argc

__p___argv
Название

__p___initenv

__p___mb_cur_max

__p___wargv

__p___winitenv

__p__acmdln

__p__commode

__p__crtAssertBusy

__p__crtBreakAlloc

__p__crtDbgFlag

__p__daylight

__p__dstbias

__p__environ

__p__fmode

__p__iob

__p__mbcasemap

__p__mbctype

__p__pctype

__p__pgmptr

__p__pwctype

__p__timezone

__p__tzname

__p__wcmdln

__p__wenviron

__p__wpgmptr

_pctype

__pctype_func
Название

_pwctype

__pwctype_func

__pxcptinfoptrs

_query_app_type

_realloc_base

_register_onexit_function

_register_thread_local_exe_atexit_callback

__report_gsfailure

__RTCastToVoid

__RTDynamicCast

__RTtypeid

_seh_filter_dll

_seh_filter_exe

_seh_longjmp_unwind

_seh_longjmp_unwind4

__set_app_type

_set_malloc_crt_max_wait

_setjmp3

__setlc_active

___setlc_active_func

__setusermatherr

_SetWinRTOutOfMemoryExceptionCallback

_sopen_dispatch

__std_exception_copy

__std_exception_destroy

__std_type_info_destroy_list
Название

__std_type_info_name

__stdio_common_vfprintf

__stdio_common_vfprintf_p

__stdio_common_vfprintf_s

__stdio_common_vfscanf

__stdio_common_vfwprintf

__stdio_common_vfwprintf_p

__stdio_common_vfwprintf_s

__stdio_common_vfwscanf

__stdio_common_vsnprintf_s

__stdio_common_vsnwprintf_s

__stdio_common_vsprintf

__stdio_common_vsprintf_p

__stdio_common_vsprintf_s

__stdio_common_vsscanf

__stdio_common_vswprintf

__stdio_common_vswprintf_p

__stdio_common_vswprintf_s

__stdio_common_vswscanf

_Strftime

__STRINGTOLD

__STRINGTOLD_L

__strncnt

__sys_errlist

__sys_nerr
Название

__threadhandle

__threadid

__timezone

__TypeMatch

__tzname

__unDName

__unDNameEx

__unDNameHelper

__unguarded_readlc_active

___unguarded_readlc_active_add_func

_unloaddll

_unlock_locales

_vacopy

_ValidateExecute

_ValidateRead

_ValidateWrite

_VCrtDbgReportA

_VCrtDbgReportW

_W_Getdays

_W_Getmonths

_W_Getnames

_W_Gettnames

_Wcsftime

__wcsncnt

__wgetmainargs
Название

_wsopen_dispatch

_Xbad_alloc

_Xlength_error

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
_abnormal_termination
Статья • 03.04.2023

Указывает, выполнен ли вход в блок __finally оператора try-finally, когда система


выполняет внутренний список обработчиков завершения.

Синтаксис
C++

int _abnormal_termination(

);

Возвращаемое значение
Значение true , если система очищает стек; в противном случае — значение false .

Комментарии
_abnormal_termination — это внутренняя функция, используемая для управления

исключениями очистки и не предназначенная для вызова из пользовательского


кода.

Требования
Подпрограмма Обязательный заголовок

_abnormal_termination <excpt.h>

См. также раздел


Оператор try-finally
_acmdln , _tcmdln , _wcmdln
Статья • 03.04.2023

Внутренняя глобальная переменная CRT. Командная строка.

Синтаксис
C

char * _acmdln;

wchar_t * _wcmdln;

#ifdef WPRFLAG

#define _tcmdln _wcmdln

#else

#define _tcmdln _acmdln

Remarks
Эти внутренние переменные CRT хранят полную командную строку. Они
представлены в экспортированных символах для CRT, но не предназначены для
использования в коде. _acmdln хранит данные как строку символов. _wcmdln хранит
данные как строку расширенных символов. _tcmdln может быть определена как
_acmdln или _wcmdln в зависимости от обстоятельств.

См. также раздел


Глобальные переменные
_CIatan
Статья • 03.04.2023

Вычисляет тангенс верхнего значения в стеке.

Синтаксис
C++

void __cdecl _CIatan();

Remarks
Эта версия функции atan включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

atan, atanf, atanl, atan2, atan2f, atan2l


_CIatan2
Статья • 03.04.2023

Вычисляет арктангенс расположения x x / y и y значения в верхней части стека.

Синтаксис
C++

void __cdecl _CIatan2();

Remarks
Эта версия функции atan2 включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

atan, atanf, atanl, atan2, atan2f, atan2l


_CIcos
Статья • 03.04.2023

Вычисляет косинус верхнего значения в стеке с плавающей запятой.

Синтаксис
C

void __cdecl _CIcos();

Remarks
Эта версия функции cos включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека с плавающей запятой.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

cos, cosf, cosl


_CIexp
Статья • 03.04.2023

Вычисляет экспоненту верхнего значения в стеке.

Синтаксис
C++

void __cdecl _CIexp();

Remarks
Эта версия функции exp включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

exp, expf, expl


_CIfmod
Статья • 03.04.2023

Вычисляет остаток с плавающей запятой от двух верхних значений в стеке.

Синтаксис
C++

void __cdecl _CIfmod();

Remarks
Эта версия функции fmod включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

fmod, fmodf
_CIlog
Статья • 03.04.2023

Вычисляет натуральный логарифм верхнего значения в стеке.

Синтаксис
C++

void __cdecl _CIlog();

Remarks
Эта версия функции log включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

log, logf, log10, log10f


_CIlog10
Статья • 03.04.2023

Выполняет операцию log10 с верхним значением в стеке.

Синтаксис
C++

void __cdecl _CIlog10();

Remarks
Эта версия функции log10 включает специальные соглашения о вызовах,
распознаваемые компилятором. Она ускоряет выполнение, так как исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

log, logf, log10, log10f


_CIpow
Статья • 03.04.2023

Вычисляет x питание на y основе верхних значений в стеке.

Синтаксис
C++

void __cdecl _CIpow();

Remarks
Эта версия функции pow включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

pow, powf, powl


_CIsin
Статья • 03.04.2023

Вычисляет синус верхнего значения в стеке с плавающей запятой.

Синтаксис
C

void __cdecl _CIsin();

Remarks
Эта встроенная версия sin функции имеет специализированное соглашение о
вызовах, которое понимает компилятор. Это ускоряет выполнение, поскольку
исключает создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека с плавающей запятой.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

sin, sinf, sinl


_CIsqrt
Статья • 03.04.2023

Вычисляет квадратный корень верхнего значения в стеке.

Синтаксис
C++

void __cdecl _CIsqrt();

Remarks
Эта версия функции sqrt включает специальные соглашения о вызовах,
распознаваемые компилятором. Это ускоряет выполнение, поскольку исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

sqrt, sqrtf, sqrtl


_CItan
Статья • 03.04.2023

Вычисляет тангенс верхнего значения в стеке с плавающей запятой.

Синтаксис
C

void __cdecl _CItan();

Remarks
Эта версия функции tan включает специальные соглашения о вызовах,
распознаваемые компилятором. Она ускоряет выполнение, так как исключает
создание копий и помогает распределять регистры.

Полученное значение помещается в верхнюю часть стека с плавающей запятой.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Платформа: x86

См. также раздел


Алфавитный указатель функций

tan, tanf, tanl


__crtLCMapStringW
Статья • 03.04.2023

Сопоставляет одну строку символов другой, выполняя указанное преобразование,


зависящее от языкового стандарта. Эту функцию можно также использовать для
создания ключа сортировки для входной строки.

Синтаксис
C++

int __crtLCMapStringW(

LCID Locale,

DWORD dwMapFlags,

LPCWSTR lpSrcStr,

int cchSrc,

LPWSTR lpDestStr,

int cchDest)

Параметры

Locale

Код локали. Языковой стандарт предоставляет контекст для сопоставления строк


или создания ключа сортировки. Приложение может использовать макрос
MAKELCID для создания идентификатора языкового стандарта.

dwMapFlags

Тип преобразования, который будет использоваться при сопоставлении строк или


создании ключа сортировки.

lpSrcStr

Указатель на исходную строку, которая используется функцией для сопоставления


или создания ключа сортировки. Предполагается, что этот параметр будет строкой
в Юникоде.

cchSrc

Размер (в символах) строки, на которую указывает параметр lpSrcStr . Это число


может содержать или не содержать символ конца строки NULL.

Значение cchSrc , равное –1, означает, что строка, на которую указывает параметр
lpSrcStr , оканчивается нуль-символом. Если это так, и эта функция используется в
режиме сопоставления строк, функция вычисляет саму длину строки и завершает
сопоставленную строку, хранящуюся в *lpDestStr .

lpDestStr

Длинный указатель на буфер, в котором функция хранит сопоставленную строку


или ключ сортировки.

cchDest

Размер, в символах, буфера, на который указывает параметр lpDestStr .

Возвращаемое значение
Если значение cchDest отлично от нуля, число символов (или байтов, если указан
LCMAP_SORTKEY ), записанных в буфер, указывает на успех. Это число включает место

для символа конца строки NULL.

Если значение cchDest равно нулю, то размер буфера в символах (или байтах, если
указан LCMAP_SORTKEY ), требуемый для получения преобразованной строки или
ключа сортировки, указывает на успех. Этот размер включает место для символа
конца строки NULL.

Нулевое значение означает сбой. Чтобы получить расширенные сведения об


ошибке, следует вызвать функцию GetLastError .

Комментарии
Если значение cchSrc больше нуля и параметр lpSrcStr представляет собой
строку, завершающуюся нуль-символом, то функция __crtLCMapStringW
устанавливает для параметра cchSrc значение, равное длине строки. Затем
функция __crtLCMapStringW вызывает версию для расширенных символов (Юникод)
функции LCMapString с указанными параметрами. Дополнительные сведения о
параметрах и возвращаемом значении этой функции см. в LCMapStringразделе .

Требования
Подпрограмма Обязательный заголовок

__crtLCMapStringW <awint.h>
__CxxFrameHandler
Статья • 03.04.2023

Внутренняя функция CRT. Используется CRT для обработки кадров


структурированной обработки исключений.

Синтаксис
C++

EXCEPTION_DISPOSITION __CxxFrameHandler(

EHExceptionRecord *pExcept,

EHRegistrationNode *pRN,

void *pContext,

DispatcherContext *pDC

);

Параметры
pExcept

Запись исключения, передаваемая в возможные операторы catch .

pRN

Динамические сведения о кадре стека, который используется для обработки


исключения. Дополнительные сведения см. в описании ehdata.h.

pContext

Контекст. (Не используется для процессоров Intel.)

pDC

Дополнительные сведения о входе в функцию и кадре стека.

Возвращаемое значение
Одно из значений выражения фильтра, используемое в операторе try-except.

Remarks

Требования
Подпрограмма Обязательный заголовок

__CxxFrameHandler <excpt.h> , <ehdata.h>


__dllonexit
Статья • 03.04.2023

Регистрирует подпрограмму, вызываемую во время выхода.

Синтаксис
C

_onexit_t __dllonexit(

_onexit_t func,

_PVFV ** pbegin,

_PVFV ** pend

);

Параметры

func

Указатель на функцию, которая должна выполняться при выходе.

pbegin

Указатель на переменную, указывающую на начало списка функций, которые


должны выполняться при отключении.

pend

Указатель на переменную, указывающую на конец списка функций, которые


должны выполняться при отключении.

Возвращаемое значение
В случае успешного выполнения — указатель на функцию пользователя. В
противном случае — NULL указатель.

Комментарии
Функция аналогична __dllonexit функции, _onexit за исключением того, что
глобальные переменные, используемые этой функцией, не видны этой
подпрограмме. Вместо глобальных переменных в этой функции применяются
параметры pbegin и pend .
Функции _onexit и atexit в библиотеке DLL, связанной с файлом MSVCRT.LIB,
должны содержать собственный список atexit/_onexit. Эта подпрограмма
представляет собой рабочий процесс, который вызывают такие библиотеки DLL.

Тип _PVFV определяется как typedef void (__cdecl *_PVFV)(void) .

Требования
Подпрограмма Обязательный файл

__dllonexit onexit.c

См. также раздел


_onexit, _onexit_m
_except_handler3
Статья • 03.04.2023

Внутренняя функция CRT. Используется платформой для поиска подходящего


обработчика исключений для обработки текущего исключения.

Синтаксис
C

int _except_handler3(

PEXCEPTION_RECORD exception_record,

PEXCEPTION_REGISTRATION registration,

PCONTEXT context,

PEXCEPTION_REGISTRATION dispatcher

);

Параметры
exception_record

[in] Сведения о конкретном исключении.

registration

[in] Запись, которая указывает, какую таблицу области видимости следует


использовать для поиска обработчика исключений.

context

[in] Зарезервировано.

dispatcher

[in] Зарезервировано.

Возвращаемое значение
Если исключение должно быть отброшено, возвращает значение
DISPOSITION_DISMISS . Если исключение должно быть передано на уровень вверх в
инкапсулируемые обработчики исключений, возвращает значение
DISPOSITION_CONTINUE_SEARCH .

Комментарии
Если этот метод находит подходящий обработчик исключений, он передает
исключение в обработчик. В этом случае этот метод не возвращается к коду,
который его вызвал, и возвращаемое значение не имеет значения.

См. также раздел


Алфавитный указатель функций
_execute_onexit_table ,
_initialize_onexit_table ,
_register_onexit_function
Статья • 03.04.2023

Управляет подпрограммами, которые должны вызываться во время выхода.

Синтаксис
C

int _initialize_onexit_table(

_onexit_table_t* table

);

int _register_onexit_function(

_onexit_table_t* table,

_onexit_t function

);

int _execute_onexit_table(

_onexit_table_t* table

);

Параметры
table

[вход, выход] Указатель на таблицу onexit функций.

function

[in] Указатель на функцию, добавляемую в таблицу onexit функций.

Возвращаемое значение
В случае успешного выполнения функция возвращает значение 0. В противном
случае возвращается отрицательное значение.

Комментарии
Эти функции представляют собой сведения о реализации инфраструктуры,
используемые для поддержки среды выполнения C, и их не следует вызывать
непосредственно из кода. Среда выполнения C использует таблицу onexit функций
для представления последовательности функций, зарегистрированных вызовами
atexit , at_quick_exit и _onexit . Структура onexit данных таблицы функций

представляет собой непрозрачные сведения о реализации среды выполнения C.


Порядок и значение ее членов данных могут измениться. Они не должны
проверяться внешним кодом.

Функция _initialize_onexit_table инициализирует таблицу onexit функций ее


начальным значением. Эту функцию необходимо вызвать перед передачей onexit
таблицы функций в _register_onexit_function или _execute_onexit_table .

Функция _register_onexit_function добавляет функцию в конец onexit таблицы


функций.

Функция _execute_onexit_table выполняет все функции в onexit таблице функций,


очищает таблицу, а затем возвращает . После вызова _execute_onexit_table таблица
находится в недопустимом состоянии. Перед повторным использованием она
должна быть инициализирована вызовом _initialize_onexit_table .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный
заголовок

_initialize_onexit_table , _register_onexit_function , C, C++: <process.h>


_execute_onexit_table

Функции _initialize_onexit_table , _register_onexit_function и


_execute_onexit_table относятся к корпорации Майкрософт. Сведения о

совместимости см. в разделе Совместимость.

См. также
atexit

exit, _Exit, _exit

_onexit, _onexit_m
__getmainargs , __wgetmainargs
Статья • 03.04.2023

Вызывает синтаксический анализ командной строки и снова копирует аргументы в


main() через переданные указатели.

Синтаксис
C++

int __getmainargs(

int * argc,

char *** argv,

char *** env,

int doWildCard,

_startupinfo * startInfo);

int __wgetmainargs (

int *argc,

wchar_t ***argv,

wchar_t ***env,

int doWildCard,

_startupinfo * startInfo)

Параметры
argc

Целое число, которое содержит число аргументов, передаваемых в argv . Параметр


argc всегда больше или равен 1.

argv

Массив завершающихся null строк, представляющих введенные пользователем


программы аргументы командной строки. По соглашению — это команда, argv[0]
с помощью которой вызывается программа, argv[1] является первым аргументом
командной строки и т. д. до argv[argc], который всегда NULL имеет значение .
Первый аргумент командной строки — всегда argv[1] , а последний — argv[argc -
1] .

env

Массив строк, которые представляют переменные, заданные в среде пользователя.


Этот массив завершается записью NULL .
doWildCard

Целое число, которое, если имеет значение 1, разворачивает подстановочные


знаки в аргументах командной строки, а если имеет значение 0, не выполняет
никаких действий.

startInfo

Другие сведения, передаваемые в DLL CRT.

Возвращаемое значение
0 в случае успешного выполнения; отрицательное значение, если операция
завершилась неудачей.

Комментарии
Используйте __getmainargs на платформах без расширенных символов и
__wgetmainargs на платформах расширенных символов (Unicode).

Требования
Подпрограмма Обязательный заголовок

__getmainargs internal.h

__wgetmainargs internal.h
___lc_codepage_func
Статья • 03.04.2023

Внутренняя функция CRT. Получает текущую кодовую страницу потока.

Синтаксис
C++

UINT ___lc_codepage_func(void);

Возвращаемое значение
Текущая кодовая страница потока.

Комментарии
___lc_codepage_func — это внутренняя функция CRT, которая используется другими
функциями CRT для получения текущей кодовой страницы из локального
хранилища потока для данных CRT. Эти сведения также доступны с помощью
_get_current_locale функции .

Кодовая страница представляет собой сопоставление однобайтовых или


двухбайтовых кодов с конкретными символами. Разные кодовые страницы
включают разные специальные символы, как правило, настроенные для языка или
группы языков. Дополнительные сведения о кодовой странице см. в разделе
Кодовая страница.

Внутренние функции CRT связаны с конкретной реализацией и подлежат


изменению в каждом выпуске. Мы не рекомендуем использовать их в коде.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

___lc_codepage_func crt\src\setlocal.h
См. также раздел
_get_current_locale

setlocale, _wsetlocale

_create_locale, _wcreate_locale

_free_locale
___lc_collate_cp_func
Статья • 03.04.2023

Внутренняя функция CRT. Получает текущую кодовую страницу сортировки потока.

Синтаксис
C++

UINT ___lc_codepage_func(void);

Возвращаемое значение
Текущая кодовая страница сортировки потока.

Комментарии
___lc_collate_cp_func — это внутренняя функция CRT, которая используется
другими функциями CRT для получения текущей кодовой страницы сортировки из
локального хранилища потока для данных CRT. Эти сведения также доступны с
помощью _get_current_locale функции .

Внутренние функции CRT связаны с конкретной реализацией и подлежат


изменению в каждом выпуске. Мы не рекомендуем использовать их в коде.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

___lc_collate_cp_func crt\src\setlocal.h

См. также раздел


_get_current_locale

setlocale, _wsetlocale

_create_locale, _wcreate_locale

_free_locale
___lc_locale_name_func
Статья • 03.04.2023

Внутренняя функция CRT. Получает имя текущего языкового стандарта потока.

Синтаксис
C++

wchar_t** ___lc_locale_name_func(void);

Возвращаемое значение
Указатель на строку, которая содержит имя текущего языкового стандарта потока.

Комментарии
___lc_locale_name_func — это внутренняя функция CRT, которая используется
другими функциями CRT для получения текущего языкового стандарта из
локального хранилища потока для данных CRT. Эти сведения также доступны с
помощью _get_current_locale функции или setlocaleфункций . _wsetlocale

Внутренние функции CRT связаны с конкретной реализацией и подлежат


изменению в каждом выпуске. Мы не рекомендуем использовать их в коде.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

___lc_locale_name_func crt\src\setlocal.h

См. также раздел


_get_current_locale

setlocale, _wsetlocale

_create_locale, _wcreate_locale

_free_locale
_local_unwind2
Статья • 03.04.2023

Внутренняя функция CRT. Выполняет все обработчики завершения, перечисленные


в указанной таблице области.

Синтаксис
C++

void _local_unwind2(

PEXCEPTION_REGISTRATION xr,

int stop

);

Параметры
xr

[in] Запись регистрации, которая связана с одной таблицей области видимости.

stop

[in] Лексический уровень, который указывает, где должна остановиться функция


_local_unwind2 .

Комментарии
Этот метод используется только средой выполнения. Не вызывайте метод в коде.

Когда этот метод выполняет обработчики завершения, он начинается с текущего


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

См. также раздел


Алфавитный указатель функций
___mb_cur_max_func ,
___mb_cur_max_l_func , __p___mb_cur_max ,
__mb_cur_max
Статья • 03.04.2023

Внутренняя функция CRT. Получает максимальное число байт в многобайтовом


символе для текущего или указанного языкового стандарта.

Синтаксис
C++

int ___mb_cur_max_func(void);

int ___mb_cur_max_l_func(_locale_t locale);

int * __p___mb_cur_max(void);

#define __mb_cur_max (___mb_cur_max_func())

Параметры
locale

Структура языкового стандарта, из которой предполагается получать результаты.


Если значение этого параметра — NULL, используется языковой стандарт текущего
потока.

Возвращаемое значение
Максимальное число байт в многобайтовом символе для текущего языкового
стандарта потока или указанного языкового стандарта.

Комментарии
___mb_cur_max_func — это внутренняя функция, которую CRT использует для
получения текущего значения макроса из локального MB_CUR_MAX хранилища
потока. Рекомендуется использовать макрос MB_CUR_MAX для обеспечения
переносимости кода.
Макрос __mb_cur_max — это удобный способ вызова функции ___mb_cur_max_func .
Функция __p___mb_cur_max определяется для совместимости с Visual C++ 5.0 и
более ранних версий.

Внутренние функции CRT связаны с конкретной реализацией и подлежат


изменению в каждом выпуске. Мы не рекомендуем использовать их в коде.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

___mb_cur_max_func , ___mb_cur_max_l_func , __p___mb_cur_max <ctype.h>, <stdlib.h>

См. также раздел


MB_CUR_MAX
__p__commode
Статья • 03.04.2023

Указывает на глобальную переменную _commode , которая определяет значение


режима фиксации файлов по умолчанию для операций ввода-вывода файлов.

Синтаксис
C++

int * __p__commode(

);

Возвращаемое значение
Указатель на глобальную переменную _commode .

Комментарии
Функция __p__commode предназначена только для внутреннего использования и не
должна вызываться из пользовательского кода.

Режим фиксации файлов указывает, когда на диск записываются критические


данные. Для получения дополнительной информации см. fflush.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

__p__commode internal.h
__p__fmode
Статья • 03.04.2023

Указывает на глобальную переменную _fmode , которая определяет значение


режима трансляции файлов по умолчанию для операций ввода-вывода файлов.

Синтаксис
C++

int* __p__fmode(

);

Возвращаемое значение
Указатель на глобальную переменную _fmode .

Комментарии
Функция __p__fmode предназначена только для внутреннего использования и не
должна вызываться из пользовательского кода.

Режим преобразования файлов указывает binary или преобразование для _open


операций ввода-вывода и _pipe text . Для получения дополнительной информации
см. _fmode.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

__p__fmode <stdlib.h>
__pctype_func
Статья • 03.04.2023

Извлекает указатель на массив данных о классификации символов.

Синтаксис
C++

const unsigned short *__pctype_func(

Возвращаемое значение
Указатель на массив данных о классификации символов.

Комментарии
Сведения в таблице классификации символов предназначены только для
внутреннего пользования и используются различными функциями, которые
классифицируют символы типа char . Дополнительные сведения см. в Remarks
разделе _pctype, _pwctype, _wctype, _mbctype, . _mbcasemap

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

__pctype_func <ctype.h>

См. также раздел


_pctype, _pwctype, _wctype, _mbctype, _mbcasemap
__RTDynamicCast
Статья • 03.04.2023

Реализация оператора в dynamic_cast среде выполнения.

Синтаксис
C++

PVOID __RTDynamicCast (

PVOID inptr,

LONG VfDelta,

PVOID SrcType,

PVOID TargetType,

BOOL isReference

) throw(...)

Параметры

inptr

Указатель на полиморфный объект.

VfDelta

Смещение указателя на виртуальную функцию в объекте.

SrcType

Статический тип объекта, на который указывает параметр inptr .

TargetType

Планируемый результат преобразования.

isReference

Значение true , если аргумент является ссылкой; значение false , если аргумент
является указателем.

Возвращаемое значение
Указатель на соответствующий подобъект в случае успешного выполнения; в
противном случае — NULL .
Исключения
bad_cast() , если входное значение dynamic_cast<> является ссылкой и приведение

завершается неудачей.

Комментарии
Преобразует inptr в объект типа TargetType . Тип операнда inptr должен быть
указателем, если TargetType является указателем, или l-значением, если TargetType
является ссылкой. Параметр TargetType должен быть указателем или ссылкой на
ранее определенный тип класса или указателем на void.

Требования
Подпрограмма Обязательный заголовок

__RTDynamicCast <rtti.h>
__set_app_type
Статья • 03.04.2023

Задает тип текущего приложения. Эта внутренняя функция устарела.

Синтаксис
C++

void __set_app_type (

int at

Параметры
at

Значение, указывающее на тип приложения. Вы можете выбрать

Значение Описание

_UNKNOWN_APP Неизвестный тип приложения.

_CONSOLE_APP Приложение консоли (командной строки).

_GUI_APP Приложение с графическим интерфейсом (Windows).

Remarks

Требования
Подпрограмма Обязательный заголовок

__set_app_type internal.h
_set_app_type
Статья • 03.04.2023

Внутренняя функция используется при запуске для того, чтобы сообщить CRT,
является ли приложение консольным приложением или приложением с
графическим интерфейсом.

Синтаксис
C++

typedef enum _crt_app_type

_crt_unknown_app,

_crt_console_app,

_crt_gui_app

} _crt_app_type;

void __cdecl _set_app_type(

_crt_app_type appType

);

Параметры
appType

Значение, указывающее на тип приложения. Вы можете выбрать

Значение Описание

_crt_unknown_app Неизвестный тип приложения.

_crt_console_app Приложение консоли (командной строки).

_crt_gui_app Приложение с графическим интерфейсом (Windows).

Комментарии
Как правило, вызывать эту функцию не требуется. Это часть кода запуска среды
выполнения C, который выполняется до main вызова в вашем приложении.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма Обязательный заголовок

_set_app_type <process.h>
_setjmp3
Статья • 03.04.2023

Внутренняя функция CRT. Новая реализация функции setjmp .

Синтаксис
C

int _setjmp3(

OUT jmp_buf env,

int count,

(optional parameters)

);

Параметры

env

[out] Адрес буфера для хранения сведений о состоянии.

count

[in] Количество сведений DWORD , хранящихся в . optional parameters

optional parameters

[in] Дополнительные данные, отложенные встроенным элементом setjmp . Первое


DWORD — это указатель функции, которая используется для очистки лишних данных

и возврата к состоянию неизменяемого регистра. Второе DWORD — уровень


повторной попытки, который необходимо восстановить. Все дальнейшие данные
сохраняются в массиве универсальных данных в jmp_buf .

Возвращаемое значение
Всегда возвращает 0.

Комментарии
Не используйте эту функцию в программе C++. Это встроенная функция, которая
не поддерживает C++. Дополнительные сведения об использовании setjmp см. в
статье Using setjmp/longjmp (Использование setjmp и longjmp).
Требования

См. также раздел


Алфавитный указатель функций

setjmp
___setlc_active_func ,
___unguarded_readlc_active_add_func
Статья • 03.04.2023

УСТАРЕВШИЕ. Среда CRT экспортирует эти внутренние функции только для


поддержания совместимости с двоичными данными.

Синтаксис
C++

int ___setlc_active_func(void);

int * ___unguarded_readlc_active_add_func(void);

Возвращаемое значение
Возвращаемое значение не является значимым.

Комментарии
Хотя внутренние функции ___setlc_active_func CRT и
___unguarded_readlc_active_add_func устарели и больше не используются, они

экспортируются библиотекой CRT для сохранения совместимости с двоичными


файлами. Изначальной целью функции ___setlc_active_func был возврат числа
текущих активных вызовов функции setlocale . Изначальной целью функции
___unguarded_readlc_active_add_func был возврат числа функций, которые
ссылаются на языковой стандарт, не блокируя его.

Требования
Подпрограмма Обязательный заголовок

___setlc_active_func , ___unguarded_readlc_active_add_func нет

См. также раздел


setlocale, _wsetlocale
__setusermatherr
Статья • 03.04.2023

Задает предоставленную пользователем подпрограмму для обработки


математических ошибок, а не подпрограмму _matherr .

Синтаксис
C++

void __setusermatherr(

_HANDLE_MATH_ERROR pf

Параметры
pf

Указатель на реализацию _matherr , предоставляемую пользователем.

Тип параметра pf объявляется как typedef int (__cdecl * _HANDLE_MATH_ERROR)


(struct _exception *) .

Remarks

Требования
Подпрограмма Обязательный заголовок

__setusermatherr matherr.c
Глобальные переменные и
стандартные типы
Статья • 03.04.2023

Библиотека времени выполнения Microsoft содержит определения глобальных


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

См. также раздел


Справочник по библиотеке времени выполнения C

Глобальные константы
Глобальные переменные
Статья • 03.04.2023

Библиотека времени выполнения языка C (Майкрософт) обеспечивает следующие


глобальные переменные или макросы. Многие из этих глобальных переменных или
макросов были признаны нерекомендуемыми и заменены более надежными и
безопасными функциональными версиями, которые мы рекомендуем
использовать вместо них.

Переменная Описание

__argc, __argv, Содержит аргументы командной строки.


__wargv

_daylight, Не рекомендуется. Используйте _get_daylight , _get_dstbias , _get_timezone


_dstbias, и _get_tzname .

_timezoneи
_tzname Вносит корректировку для локального времени; используется в некоторых
функциях даты и времени.

errno, Не рекомендуется. Используйте _get_errno , _set_errno , _get_doserrno ,


_doserrno, _set_doserrno , perror и strerror .

_sys_errlistи
_sys_nerr Хранит коды ошибок и связанные сведения.

_environ, Не рекомендуется. Используйте getenv_s , _wgetenv_s , _dupenv_s , _wdupenv_s ,


_wenviron _putenv_s и _wputenv_s .

Указывает на массив указателей на строки среды процесса; инициализация


при запуске.

_fmode Не рекомендуется. Используйте _get_fmode или _set_fmode .

Задает режим преобразования файлов по умолчанию.

_iob Массив структур управления вводом-выводом для консоли, файлов и


устройств.

_pctype, Содержит сведения, используемые функциями классификации символов.


_pwctype,
_wctype,
_mbctype,
_mbcasemap
Переменная Описание

_pgmptr, Не рекомендуется. Используйте _get_pgmptr или _get_wpgmptr .

_wpgmptr
В зависимости от способа вызова программы среда выполнения
инициализирует эти значения при запуске программы: на полный или
относительный путь к программе, полное имя программы или имя
программы без расширения имени файла.

См. также раздел


Справочник по библиотеке времени выполнения C

Глобальные константы

__argc, __argv, __wargv

_get_daylight

_get_dstbias

_get_timezone

_get_tzname

perror

strerror

_get_doserrno
_set_doserrno

_get_errno

_set_errno

_dupenv_s, _wdupenv_s

getenv, _wgetenv

getenv_s, _wgetenv_s

_putenv, _wputenv

_putenv_s, _wputenv_s

_get_fmode

_set_fmode
__argc , __argv , __wargv
Статья • 03.04.2023

Глобальная переменная __argc — это счетчик числа аргументов командной


строки, переданных программе. __argv — указатель на массив одно- или
многобайтовых строк, который содержит аргументы программы, а __wargv —
указатель на массив строк расширенных символов, который содержит аргументы
программы. Эти глобальные переменные обеспечивают аргументы для main или
wmain .

Синтаксис
C

extern int __argc;

extern char ** __argv;

extern wchar_t ** __wargv;

Remarks
В программе, которая использует функцию main , __argc и __argv
инициализируются при запуске программы с помощью командной строки,
используемой для запуска программы. Командная строка разбирается на
отдельные аргументы, а подстановочные знаки разворачиваются. Число
аргументов назначается функции __argc , строки аргументов выделяются в куче, а
указатель на массив аргументов назначается __argv . В программе, которая
скомпилирована для использования расширенных символов и функции wmain ,
аргументы анализируются и подстановочные знаки разворачиваются как строки
расширенных символов, а указатель на массив строк аргументов назначается
__wargv .

Для создания переносимого кода рекомендуется использовать аргументы,


переданные в main , чтобы получить аргументы командной строки в программе.

Сопоставления подпрограмм с универсальным


текстом

Процедура Tchar.h _UNICODE не определено _UNICODE Определенные


Процедура Tchar.h _UNICODE не определено _UNICODE Определенные

__targv __argv __wargv

Требования
Глобальная переменная Обязательный заголовок

__argc , __argv , __wargv <stdlib.h>, <cstdlib> (C++)

__argc , __argv и __wargv являются расширениями Майкрософт. Сведения о

совместимости см. в разделе Совместимость.

См. также раздел


Глобальные переменные

main аргументы функции и командной строки (C++)

Использование wmain вместо main


_daylight , _dstbias , _timezone и
_tzname
Статья • 03.04.2023

_daylight , _dstbias , _timezone и _tzname используются в некоторых процедурах


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

Глобальная переменная Функциональный эквивалент

_daylight _get_daylight

_dstbias _get_dstbias

_timezone _get_timezone

_tzname _get_tzname

Они объявляются в Time.h следующим образом.

Синтаксис
C

extern int _daylight;

extern int _dstbias;

extern long _timezone;

extern char *_tzname[2];

Remarks
При вызове _ftime , localtime или _tzset значения _daylight , _dstbias , _timezone
и _tzname определяются, исходя из значения переменной среды TZ . Если вы явно
не задали TZ значение , _tzname[0] и _tzname[1] содержат параметры по
умолчанию "PST" и "PDT" соответственно. Функции обработки времени (_tzset,
_ftimeи localtime) пытаются задать значения _daylight , _dstbias и _timezone путем
запроса операционной системы значения по умолчанию для каждой переменной.
Значения глобальных переменных часовых поясов перечислены в следующей
таблице.

Переменная Значение

_daylight Ненулевое, если переход на летнее время (DST) указан в TZ или


определяется операционной системой; в противном случае — 0. Значение
по умолчанию — 1.

_dstbias Смещение при переходе на летнее время.

_timezone Разница в секундах между временем в формате UTC и местным временем.


Значение по умолчанию — 28 000.

_tzname[0] Имя часового пояса, исходя из переменной среды TZ . Значение по


умолчанию — PST.

_tzname[1] Имя пояса DST, исходя из переменной среды TZ . Значение по умолчанию —


PDT (тихоокеанское летнее время).

См. также раздел


Глобальные переменные

_get_daylight

_get_dstbias

_get_timezone

_get_tzname
errno , _doserrno , _sys_errlist и
_sys_nerr
Статья • 03.04.2023

Глобальные макросы, которые содержат коды ошибок, задаваемые во время


выполнения программы, и строковые эквиваленты кодов ошибок для отображения
на экране.

Синтаксис
C

#define errno (*_errno())

#define _doserrno (*__doserrno())

#define _sys_errlist (__sys_errlist())

#define _sys_nerr (*__sys_nerr())

Remarks
Как для errno , так и для _doserrno средой выполнения во время запуска
программы задается значение 0. errno возникает при ошибке в вызове системного
уровня. Поскольку errno хранит значение для последнего вызова, задавшего его,
это значение может быть изменено успешными вызовами. Вызовы библиотеки
времени выполнения, которые задаются errno при ошибке, не очищают errno
успешность. Всегда сбрасывайте errno путем вызова функции _set_errno(0) сразу
после вызова, который мог задать значение этой переменной, и проверяйте его
сразу после вызова.

При ошибке не обязательно устанавливается то же значение, что и код ошибки,


errno возвращенный системным вызовом. Для операций ввода-вывода _doserrno
хранит коды ошибок операционной системы, эквивалентные кодам errno . Для
большинства операций, не относящихся к операциям ввода-вывода, значение не
задано _doserrno .

Каждое errno значение связано с сообщением об ошибке в , _sys_errlist которое


можно распечатать с помощью одной из perror функций или сохранить в строке с
помощью одной из strerror функций или strerror_s . perror и strerror используют
массив _sys_errlist и _sys_nerr (количество элементов в _sys_errlist ) для
обработки сведений об ошибке. Прямой доступ к _sys_errlist и _sys_nerr
является нерекомендуемым по причинам безопасности кода. Рекомендуется
использовать более безопасные функциональные версии вместо глобальных
макросов, как показано ниже.

Глобальный макрос Функциональные эквиваленты

_doserrno _get_doserrno, _set_doserrno

errno _get_errno, _set_errno

_sys_errlist , _sys_nerr strerror_s, _strerror_s, _wcserror_s, __wcserror_s

Математические процедуры библиотеки задаются errno путем вызова _matherr.


Для обработки математических ошибок иным образом напишите собственную
процедуру в соответствии с базовым описанием _matherr и назовите ее _matherr .

Все errno значения являются предопределенными константами в <errno.h> и


совместимы с UNIX. Только ERANGE , EILSEQ и EDOM определены в стандарте ISO C99.
Полный список см. в разделе errno Константы.

Требования
Глобальный макрос Обязательный заголовок Необязательный
заголовок

errno <errno.h> или <stdlib.h> , <cerrno> или


<cstdlib> (C++)

_doserrno , _sys_errlist , <stdlib.h> , <cstdlib> (C++) <errno.h> , <cerrno>


_sys_nerr (C++)

Макросы _doserrno , _sys_errlist и _sys_nerr являются расширениями


Майкрософт. Дополнительные сведения о совместимости см. в разделе
Compatibility.

См. также раздел


Глобальные переменные

errno Константы

perror, _wperror

strerror, _strerror, _wcserror, __wcserror

strerror_s, _strerror_s, _wcserror_s, __wcserror_s

_get_doserrno
_set_doserrno

_get_errno

_set_errno
_environ , _wenviron
Статья • 03.04.2023

Переменная _environ является указателем на массив указателей на строки


многобайтовых символов, которые составляют среду процесса. Эта глобальная
переменная устарела для более безопасных функциональныхgetenv_s_wgetenv_s
версий и _putenv_s, _wputenv_sкоторая должна использоваться вместо глобальной
переменной. _environ объявлена в файле Stdlib.h.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

extern char **_environ;

Remarks
В программе, которая использует функцию main , переменная _environ
инициализируется при запуске программы в соответствии с настройками,
полученными из среды операционной системы. Среда состоит из одной или
нескольких записей следующего вида:

ENVVARNAME =string

Функции getenv_s и putenv_s используют переменную _environ для получения


доступа к таблице среды и ее изменения. При вызове функции _putenv для
добавления или удаления параметров среды размер таблица среды изменяется. Ее
расположение в памяти также может изменяться, это зависит от требований к
памяти программы. Значение переменной _environ автоматически изменяется
соответствующим образом.

Переменная _wenviron , объявленная в файле Stdlib.h как:


C

extern wchar_t **_wenviron;

представляет собой версию переменной _environ для расширенных символов. В


программе, которая использует функцию wmain , переменная _wenviron
инициализируется при запуске программы в соответствии с настройками,
полученными из среды операционной системы.

В программе, которая использует main , переменная _wenviron изначально имеет


значение NULL , поскольку среда состоит из строк многобайтовых символов. При
первом вызове функции _wgetenv или _wputenv создается соответствующая строка
среды из расширенных символов, на которую указывает переменная _wenviron .

Аналогично, в программе, которая использует wmain , переменная _environ


изначально имеет значение NULL , поскольку среда состоит из строк расширенных
символов. При первом вызове функции _getenv или _putenv создается
соответствующая строка среды из многобайтовых символов, на которую указывает
переменная _environ .

Если в программе одновременно существуют две копии среды (многобайтовой


кодировки и Юникода), система времени выполнения должна поддерживать обе
копии, что отрицательно сказывается на скорости выполнения программы.
Например, при вызове функции _putenv также автоматически производится вызов
функции _wputenv , чтобы строки в двух средах совпадали.

U Внимание!

В редких случаях, когда система времени выполнения поддерживает и версию


Юникода, и многобайтовую версию, эти две версии среды могут не полностью
соответствовать друг другу. Это происходит потому, что хотя любая
уникальная расширенная строка сопоставляется уникальной строке Юникода,
сопоставление уникальной строки Юникода со строкой многобайтовой
кодировки не обязательно будет уникальными. Поэтому две различных строки
Юникода могут сопоставляться одной и той же многобайтовой строке.

Запрос переменной _environ в контексте Юникода не имеет смысла, если


используется компоновка /MD или /MDd . Библиотеке DLL CRT неизвестен тип
(расширенная или многобайтовая) программы. Создается только многобайтовый
тип, поскольку это наиболее вероятный сценарий.
Следующий псевдокод иллюстрирует, как это может произойти.

int i, j;

i = _wputenv( "env_var_x=string1" ); // results in the implicit call:

// putenv ("env_var_z=string1")

j = _wputenv( "env_var_y=string2" ); // also results in implicit call:

// putenv("env_var_z=string2")

В нотации, используемой в этом примере, символьные строки не являются


строковыми литералами C; вместо этого они являются заполнителями, которые
представляют строковые литералы среды Юникода в _wputenv строках среды
вызова и многобайтовой среды в вызове putenv . Заполнители символов " x " и " y "
в двух разных строках среды Юникода не сопоставляют символы в текущем MBCS.
Вместо этого они сопоставляются определенному символу многобайтовой
кодировки " z ", который является результатом по умолчанию для попытки
преобразовать строки.

Поэтому в многобайтовых средах значение " env_var_z " после первого неявного
вызова функции putenv будет равно " string1 ", но это значение будет
перезаписано при втором неявном вызове функции putenv , если для " env_var_z "
будет установлено значение " string2 ". Поэтому после такой последовательности
вызовов среда Юникода (в _wenviron ) и многобайтовая среда (в _environ ) будут
отличаться.

См. также раздел


Глобальные переменные

getenv, _wgetenv

getenv_s, _wgetenv_s

_putenv, _wputenv

_putenv_s, _wputenv_s
_fmode
Статья • 03.04.2023

Переменная _fmode устанавливает режим преобразования файлов по


умолчанию — преобразование текстовых значений в двоичные и наоборот. Эта
глобальная переменная устарела для более безопасных функциональных
_get_fmode версий и _set_fmodeдолжна использоваться вместо глобальной
переменной. Он объявлен в Stdlib.h следующим образом.

Синтаксис
C

extern int _fmode;

Remarks
По умолчанию параметр _fmode для преобразования в текстовом режиме имеет
значение _O_TEXT . Для двоичного режима используется параметр _O_BINARY .

Значение _fmode можно изменить тремя указанными ниже способами.

Связывание с Binmode.obj. Этот объектный файл изменяет начальное


значение _fmode , что приводит к тому, что _O_BINARY все файлы, кроме stdin ,
stdout и stderr открываться в двоичном режиме.

Вызовите _get_fmode или _set_fmode , чтобы соответственно получить или


задать глобальную переменную _fmode .

Измените значение _fmode напрямую, задав его в своей программе.

См. также раздел


Глобальные переменные

_get_fmode

_set_fmode
_iob
Статья • 03.04.2023

Массив stdio структур управления.

Синтаксис
C

FILE _iob[_IOB_ENTRIES];

Remarks
_IOB_ENTRIES определяется как 3 в stdio.h .

См. также раздел


Глобальные переменные
_pctype , _pwctype , _wctype , _mbctype ,
_mbcasemap
Статья • 03.04.2023

Эти глобальные переменные содержат сведения, используемые функциями


классификации символов. Они предназначены только для внутреннего
использования.

Синтаксис
C

extern const unsigned short *_pctype;

extern const wctype_t *_pwctype;

extern const unsigned short _wctype[];

extern unsigned char _mbctype[];

extern unsigned char _mbcasemap[];

Remarks
Сведения в _pctype , и используются
внутри,toupper_toupper_toupper_ltowupper_towupper_lisxdigit_isxdigit_liswxdigit_iswx
digit_lisdigit_isdigit_liswdigit_iswdigit_lisspace_isspace_liswspace_iswspace_lislower_islow
er_liswlower_iswlower_lisalnum_isalnum_liswalnum_iswalnum_lisupperiswupper_isupper_
l_iswupper_lispunct_iswpunct_liswpunct_ispunct_liscntrliswcntrl_iscntrl_l_iswcntrl_lisgrap
hiswgraph_isgraph_l_iswgraph_l _wctype _pwctype tolower, , towlower_tolower,
_tolower_lи _towlower_l функции. Вместо обращения к этим глобальным
переменным следует использовать эти функции.

Сведения внутри и используются


внутри_ismbbtrail_ismbbtrail_l_ismbbkpunct_ismbbkpunct_l_ismbbkana_ismbbkana_l_is
mbbkalnum_ismbbkalnum_l_ismbblead_ismbblead_l_ismbbkprint_ismbbkprint_l_ismbbp
rint_ismbbprint_l_ismbbpunct_ismbbpunct_l_ismbbalnum_ismbbalnum_l_ismbslead_ism
bslead_l_ismbstrail_ismbstrail_l_ismbbgraph_ismbbgraph_l_ismbbalpha_ismbslead_ismbs
trail_ismbslead_l_ismbstrail_l, и . _mbcasemap _mbctype Используйте эти функции вместо
обращения к глобальным переменным.

Требования
Не для свободного использования.

См. также раздел


is, isw подпрограммы

__pctype_func
_pgmptr , _wpgmptr
Статья • 03.04.2023

Путь к исполняемому файлу. Устаревшие; используйте _get_pgmptr и _get_wpgmptr.

Синтаксис
C

extern char *_pgmptr;

extern wchar_t *_wpgmptr;

Remarks
Когда программа выполняется из интерпретатора команд (Cmd.exe), _pgmptr
автоматически инициализируется полным путем к исполняемому файлу. Например,
если Hello.exe находится в папке C:\BIN, а C:\BIN находится в пути, _pgmptr при
выполнении задается значение C:\BIN\Hello.exe :

Командная строка Windows

C> hello

Если программа не запускается из командной строки, _pgmptr она может быть


инициализирована именем программы (базовое имя файла без расширения) или
именем файла, относительным путем или полным путем.

Переменная _wpgmptr представляет собой эквивалент переменной _pgmptr для


работы с программами, которые используют wmain .

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tpgmptr _pgmptr _pgmptr _wpgmptr


Требования
Переменная Обязательный заголовок

_pgmptr , _wpgmptr <stdlib.h>

Пример
В следующей программе показано использование переменной _pgmptr .

// crt_pgmptr.c

// compile with: /W3

// The following program demonstrates the use of _pgmptr.

//

#include <stdio.h>

#include <stdlib.h>

int main( void )

printf("The full path of the executing program is : %Fs\n",

_pgmptr); // C4996

// Note: _pgmptr is deprecated; use _get_pgmptr instead

Можно использовать переменную _wpgmptr , изменив %Fs на %S и main на wmain .

См. также раздел


Глобальные переменные
Флаги управления
Статья • 03.04.2023

Отладочная версия библиотеки времени выполнения Microsoft C использует


следующие флаги для управления выделением памяти в куче и процессом
создания отчетов. Дополнительные сведения см. в разделе Методы отладки CRT.

Flag Описание

_CRTDBG_MAP_ALLOC Сопоставляет основные функции кучи и их отладочные версии

_DEBUG Позволяет использовать отладочные версий функций среды


выполнения

_crtDbgFlag Контролирует способ отслеживания выделения памяти отладочным


диспетчером кучи

Эти флаги можно определить с помощью параметра командной строки /D или с


помощью директивы #define . Если флаг определен с #define помощью , директива
должна отображаться перед директивой файла #include заголовка для объявлений
подпрограмм.

См. также раздел


Глобальные переменные и стандартные типы
_CRTDBG_MAP_ALLOC
Статья • 03.04.2023

_CRTDBG_MAP_ALLOC Если флаг определен в отладочной версии приложения, базовые

версии функций кучи напрямую сопоставляются с их отладочными версиями. Этот


флаг используется в файле Crtdbg.h для выполнения сопоставления. Этот флаг
доступен только в том случае, _DEBUG если он определен в приложении.

Дополнительные сведения об использовании отладочной версии и базовой версии


функции кучи см. в разделе Отладка версий функций выделения кучи.

См. также раздел


Флаги управления
_DEBUG
Статья • 03.04.2023

Компилятор определяет _DEBUG при указании параметра/MTd или/MDd. Эти


параметры указывают версии отладки библиотеки времени выполнения C.

Дополнительные сведения см. в разделе Методы отладки CRT.

См. также раздел


Флаги управления
_crtDbgFlag
Статья • 03.04.2023

Флаг _crtDbgFlag состоит из пяти битовых полей, которые управляют


отслеживанием, проверкой, отчетом и дампом выделений памяти в отладочной
версии кучи. Битовые поля флага задаются с помощью _CrtSetDbgFlag функции .
Этот флаг и его битовые поля объявляются в Crtdbg.h. Этот флаг доступен только в
том случае, _DEBUG если он определен в приложении.

Дополнительные сведения об использовании этого флага вместе с другими


функциями отладки см. в разделе Функции отчетов о состоянии кучи.

См. также раздел


Флаги управления
Стандартные типы
Статья • 03.04.2023

Библиотека времени выполнения Microsoft определяет следующие стандартные


типы и определения типов.

Целочисленные типы фиксированной ширины


( stdint.h )

Имя Эквивалентный встроенный тип

int8_t , uint8_t signed char , unsigned char

int16_t , uint16_t short , unsigned short

int32_t , uint32_t int , unsigned int

int64_t , uint64_t long long , unsigned long long

int_least8_t , uint_least8_t signed char , unsigned char

int_least16_t , uint_least16_t short , unsigned short

int_least32_t , uint_least32_t int , unsigned int

int_least64_t , uint_least64_t long long , unsigned long long

int_fast8_t , uint_fast8_t signed char , unsigned char

int_fast16_t , uint_fast16_t int , unsigned int

int_fast32_t , uint_fast32_t int , unsigned int

int_fast64_t , uint_fast64_t long long , unsigned long long

intmax_t , uintmax_t long long , unsigned long long

Тип Описание Объявляется


в

clock_t (long) Хранит значения времени; используется clock. TIME.H

Структура _complex Хранит реальные и мнимые части комплексных чисел; MATH.H


используется _cabs.

_CRT_ALLOC_HOOK Определение типа для определяемой пользователем CRTDBG.H


функции-перехватчика. Используется в _CrtSetAllocHook.
Тип Описание Объявляется
в

_CRT_DUMP_CLIENT ,
Определение типа для функции обратного вызова, CRTDBG.H
которая будет вызываться в
_CRT_DUMP_CLIENT_M _CrtMemDumpAllObjectsSince.

Структура _CrtMemState Содержит сведения о текущем состоянии отладочной CRTDBG.H


кучи времени выполнения C.

_CRT_REPORT_HOOK ,
Определение типа для функции обратного вызова, CRTDBG.H
которая будет вызываться в _CrtDbgReport.

_CRT_REPORT_HOOKW ,

Параметры для данной функции: тип отчета, выходное


_CRT_REPORT_HOOKW_M сообщение и возвращаемое значение функции
обратного вызова.

dev_t , _dev_t короткое Представляет дескрипторы устройства. SYS\TYPES.H


целое или целое без
знака

Структура _diskfree_t Содержит сведения о диске. Используется _getdiskfree. DOS.H и


DIRECT.H

Структуры div_t , Храните значения, возвращаемые div, ldivи STDLIB.H


ldiv_t и lldiv_t lldivсоответственно.

Целое число errno_t Используется для параметра или типа возвращаемого STDDEF.H ,

функцией значения, который относится к кодам ошибок


errno . CRTDEFS.H

Структура _exception Хранит сведения об ошибке для _matherr. MATH.H

_EXCEPTION_POINTERS Содержит запись исключения. Для получения FPIEEE.H


дополнительной информации см. EXCEPTION_POINTERS.

Структура FILE Хранит сведения о текущем состоянии потока; STDIO.H


используется во всех потоковых операциях ввода-
вывода.
Тип Описание Объявляется
в

Структуры _finddata_t , Храните сведения об атрибутах файла, возвращаемые IO.H , WCHAR.H


_wfinddata_t , связанными функциями_findfirst , _wfindfirstи, _wfindnext
_finddata32_t , а_findnext также связанными функциями. Сведения об
_wfinddata32_t , элементах структуры см. в разделе Функции поиска
_finddatai64_t , имени файла.
_wfinddatai64_t ,
__finddata64_t ,
_wfinddata64_t ,
__finddata32i64_t ,
__wfinddata32i64_t ,
__finddata64i32_t ,
__wfinddata64i32_t

Структура Содержит сведения, относящиеся к исключению IEEE с FPIEEE.H


_FPIEEE_RECORD плавающей запятой; передается в определяемый
пользователем обработчик ловушки с помощью
_fpieee_flt.

fpos_t ( long fgetpos Используется и fsetpos для записи сведений для STDIO.H
integer структура уникального указания каждой позиции в файле.
__int64 , или в
зависимости от
целевой платформы)

_fsize_t ( unsigned long Используется для представления размера файла. IO.H ,

integer )
WCHAR.H

Структура _HEAPINFO Содержит сведения о следующей записи кучи для MALLOC.H


_heapwalk.

_HFILE (void *) Дескриптор файла операционной системы. CRTDBG.H

imaxdiv_t Тип значения, возвращаемого функцией imaxdiv , inttypes.h


содержащей как частное, так и оставшееся значение.

ino_t , _ino_t ( unsigned Для возвращения информации о состоянии. WCHAR.H


short )

intmax_t Тип целого числа со знаком, способный представлять stdint.h


любое значение любого типа целого числа со знаком.

intptr_t ( long integer Хранит указатель (или HANDLE ) на платформах Win32 и STDDEF.H и
или __int64 , в Win64. другие
зависимости от включаемые
целевой платформы) файлы
Тип Описание Объявляется
в

Массив jmp_buf Используется setjmp и longjmp для сохранения и SETJMP.H


восстановления программной среды.

Структура lconv Содержит правила форматирования для числовых LOCALE.H


значений в разных странах и регионах. Используется
localeconv.

_LDOUBLE ,
Используются для представления значения long double. STDLIB.H

_LONGDOUBLE ,

_LDBL12 (длинное
double или массив char
без знака)

Структура _locale_t Сохраняет текущие значения языкового стандарта; CRTDEFS.H


используется во всех библиотеках времени выполнения
C, привязанных к языковому стандарту.

mbstate_t Отслеживает состояние преобразования WCHAR.H


многобайтового символа.

off_t , _off_t long Представляет значение смещения файла. WCHAR.H ,


integer SYS\TYPES.H

_onexit_t ,
Возвращается ,_onexit_onexit_m . STDLIB.H

Указатель _onexit_m_t

Указатель на функцию Тип аргумента для _set_new_handler. NEW.H


_PNH

ptrdiff_t (длинное Результат вычитания двух указателей. CRTDEFS.H


целое или __int64 , в
зависимости от
целевой платформы)

_purecall_handler ,
Определение типа для функции обратного вызова, STDLIB.H
вызываемой при вызове чисто виртуальной функции.
_purecall_handler_m Используется _get_purecall_handlerв ,
_set_purecall_handler. Функция _purecall_handler должна
иметь тип возвращаемого значения "void".

_RTC_error_fn Определение типа для функции, которая будет RTCAPI.H


определение типа обрабатывать проверки ошибок во время выполнения.
Используется в _RTC_SetErrorFunc.
Тип Описание Объявляется
в

_RTC_error_fnW Определение типа для функции, которая будет RTCAPI.H


определение типа обрабатывать проверки ошибок во время выполнения.
Используется в _RTC_SetErrorFuncW.

Перечисление Определяет условия ошибок для _RTC_GetErrDesc и RTCAPI.H


_RTC_ErrorNumber _RTC_SetErrorType.

_se_translator_function Определение типа для функции обратного вызова, EH.H


которая преобразует исключение. Первый параметр
является кодом исключения, а второй параметр —
записью исключения. Используется _set_se_translator.

Целое число Тип объекта, который можно изменить как атомарную SIGNAL.H
sig_atomic_t сущность, даже при наличии асинхронных прерываний;
используется с signal.

size_t ( unsigned Результат выполнения оператора sizeof . CRTDEFS.H и


__int64 или unsigned другие
integer , в зависимости включаемые
от целевой платформы) файлы

Структура _stat Содержит сведения о состоянии файла, возвращаемые SYS\STAT.H


_stat и _fstat.

Структура __stat64 Содержит сведения о состоянии файла, возвращаемые SYS\STAT.H


_fstat64 и _stat64, и _wstat64.

Структура _stati64 Содержит сведения о состоянии файла, возвращаемые SYS\STAT.H


_fstati64, _stati64и _wstati64.

terminate_function Определение типа для функции обратного вызова, EH.H


определение типа вызываемой при terminate вызове . Используется
set_terminate.

time_t ( __int64 или Представляет значения времени в mktime, time, TIME.H ,

long integer ) ,ctime_ctime32 , _ctime64, _wctime, _wctime32,


_wctime64ctime_s_ctime64_s_ctime32_s, _wctime_s, SYS\STAT.H ,

_wctime32_s, _wctime64_s, ctime, _ctime32, _ctime64,


_wctime64_wctime_wctime32 , и gmtime. SYS\TIMEB.H
_gmtime32_gmtime64 Количество секунд, прошедших с
0:00 по UTC 1-го января 1970 года. Если
_USE_32BIT_TIME_T задано значение , time_t является
длинным целым числом. Если он не определен, это 64-
разрядное целое число.
Тип Описание Объявляется
в

__time32_t ( long Представляет значения времени в mktime, _mktime32, , CRTDEFS.H ,


integer ) _mktime64,ctime_ctime32 , _ctime64, SYS\STAT.H ,

_wctime64_wctime_wctime32ctime_s, _ctime32_s, ,
_ctime64_s, _wctime_s, , _wctime32_s, _wctime64_s,gmtime , SYS\TIMEB.H
_gmtime32и _gmtime64localtime, _localtime32, .
_localtime64

__time64_t ( __int64 ) Представляет значения времени в mktime, _mktime32, , TIME.H ,

_mktime64_ctime64, _wctime64,ctime_s , _ctime32_s, ,


_ctime64_s, _wctime_s, _wctime32_s, _wctime64_s, SYS\STAT.H ,

_gmtime64и _localtime64_time64.
SYS\TIMEB.H

Структура _timeb Функции _ftime и _ftime_s, _ftime32_sиспользуют SYS\TIMEB.H


_ftime64_s его для хранения текущего системного
времени.

Структура __timeb32 Функции _ftime, _ftime32и _ftime64_ftime_s, SYS\TIMEB.H


_ftime32_s_ftime64_s используют его для хранения
текущего системного времени.

Структура __timeb64 Функции _ftime64 и _ftime_s, _ftime32_sиспользуют SYS\TIMEB.H


_ftime64_s его для хранения текущего системного
времени.

Структура tm Функции asctime, _wasctime, asctime_s, _wasctime_s, TIME.H


gmtime, _gmtime32, _gmtime64gmtime_s, _gmtime32_s,
_gmtime64_s,
,localtime_localtime32_localtime64localtime_s_localtime32_s,
_localtime64_s, mktime, , _mktime32, , _mktime64 и strftime,
wcsftime_strftime_l, _wcsftime_l используют его для
хранения и извлечения сведений о времени.

uintmax_t Тип unsigned integer , способный представлять любое stdint.h


значение любого unsigned integer типа.

uintptr_t ( long integer Версия unsigned integer или unsigned __int64 intptr_t . STDDEF.H и
или __int64 , в другие
зависимости от включаемые
целевой платформы) файлы

unexpected_function Определение типа для функции обратного вызова, EH.H


вызываемой при unexpected вызове . Используется
set_unexpected.
Тип Описание Объявляется
в

Структура _utimbuf Хранит время доступа к файлам и времени изменения, SYS\UTIME.H


используемое _utime, _wutime и _futime,
_futime32_futime64 для изменения дат изменения файла.

Структура _utimbuf32 Хранит время доступа к файлам _utimeи время SYS\UTIME.H


изменения, используемое , _utime32_utime64, _wutime,
_wutime32и _wutime64_futime, _futime32_futime64 для
изменения дат изменения файла.

Структура __utimbuf64 Функции _utime64, _wutime64 и _futime64 используют его SYS\UTIME.H


для хранения текущего времени.

Структура va_list Используется для хранения сведений, необходимых STDARG.H ,

макросам va_arg и va_end . Вызываемая функция


объявляет переменную типа va_list , которую можно CRTDEFS.H
передать в качестве аргумента другой функции.

Расширенный символ Полезен для создания переносимых программ для STDDEF.H ,


wchar_t международных рынков. STDLIB.H ,

CRTDEFS.H ,

SYS\STAT.H

Целое число wctrans_t Представляет сопоставления символов, привязанные к WCTYPE.H


языковому стандарту.

Целое число wctype_t Может представлять все символы любой кодировки WCHAR.H ,

языка.
CRTDEFS.H

Целое число wint_t Тип объекта данных, который может содержать любой WCHAR.H ,

расширенный символ или расширенное значение конца


файла. CRTDEFS.H

См. также раздел


Справочник по библиотеке времени выполнения C
Глобальные константы
Статья • 03.04.2023

Библиотека времени выполнения Microsoft содержит определения глобальных


констант, используемых библиотечными подпрограммами. Чтобы использовать эти
константы, включите необходимые файлы заголовка, как обозначено в описании
каждой константы. Статьи о глобальных константах, приведенные в этом разделе.

Статьи о глобальных константах


32-разрядные форматы времени и даты Windows

BUFSIZ

CLOCKS_PER_SEC, CLK_TCK

Константы фиксации на диске

_CRT_DISABLE_PERFCRIT_LOCKS

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

Константы среды

EOF, WEOF

errno Константы

Константы обработки исключений

EXIT_SUCCESS, EXIT_FAILURE

Константы атрибутов файлов

Константы файлов

Константы разрешений файлов

Константы доступа к файлам для чтения и записи

Константы трансляции файлов


FILENAME_MAX

FOPEN_MAX, _SYS_OPEN

_FREEENTRY, _USEDENTRY

fseek, _lseek константы

Константы кучи

_HEAP_MAXREQ

HUGE_VAL, _HUGE

Категории языковых стандартов

_locking Константы

Математические константы

Константы математических ошибок

_MAX_ENV

MB_CUR_MAX

NULL

Пределы поля "Путь"

RAND_MAX

setvbuf Константы

Совместное использование констант

signal Константы

signal константы действий

spawn Константы

_statКонстанты полей структуры st_mode

stdin, stdout, stderr

TMP_MAX, L_tmpnam

Константы режима трансляции

_TRUNCATE

TZNAME_MAX

_WAIT_CHILD, _WAIT_GRANDCHILD

WCHAR_MAX

WCHAR_MIN

См. также раздел


Справочник по библиотеке времени выполнения C

Глобальные переменные

Рекомендации по написанию кода пролога или эпилога


32-разрядные форматы времени и
даты Windows
Статья • 03.04.2023

Дата и время изменения файла хранятся отдельно в виде битовых полей с


использованием целых чисел без знака. Дата и время изменения файла
упаковываются следующим образом:

Time

Позиция разряда: 01234 56789А BCDEF

Длина: 5 6 5

Содержимое: часы minutes С шагом 2 секунды

Диапазон значений: 0-23 0-59 0–29 с шагом 2 секунды

Дата

Позиция разряда: 0123456 789А BCDEF

Длина: 7 4 5

Содержимое: year month day

Диапазон значений: 0–119 1–12 1–31

(относительно 1980)

См. также раздел


Глобальные константы
BUFSIZ
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
BUFSIZ — обязательный буфер, выделенный пользователем для подпрограммы

setvbuf .

См. также раздел


Потоковый ввод-вывод

Глобальные константы
CLOCKS_PER_SEC , CLK_TCK
Статья • 03.04.2023

Синтаксис
C

#include <time.h>

Remarks
Время в секундах — значение, возвращаемое функцией clock , разделенное на
CLOCKS_PER_SEC . CLK_TCK эквивалентно, но считается устаревшим.

См. также раздел


clock

Глобальные константы
Константы фиксации на диске
Статья • 03.04.2023

Блок, относящийся только к системам Microsoft

Синтаксис
C

#include <stdio.h>

Remarks
Эти константы, используемые корпорацией Майкрософт, определяют, куда
сохраняется связанный с открытым файлом буфер: в буферы операционной
системы или на диск. Режим содержится в строке, указывающей тип доступа на
чтение или запись ("r", "w", "a", "r+", "w+", "a+").

Существуют следующие режимы фиксации на диске:

Записывает на диск несохраненное содержимое указанного буфера. Эта


функция фиксации на диске выполняется только при явных вызовах fflush
функции или _flushall функции. Этот режим полезен при работе с
конфиденциальными данными. Например, если программа завершит работу
после вызова fflush или _flushall , данные гарантированно достигнут
буферов операционной системы. Но если при открытии файла не
использовался параметр c, данные могут не сохраниться на диск, если работа
операционной системы завершится.

Записывает в буферы операционной системы несохраненное содержимое


указанного буфера. Операционная система может кэшировать данные и
самостоятельно выбирать оптимальное время для записи на диск. Во многих
случаях это повышает эффективность работы программы. Но если
сохранность данных имеет для вас критическую важность (например, если это
данные банковских транзакций или билетов авиакомпании), мы рекомендуем
использовать параметр c. По умолчанию применяется режим n.
7 Примечание

Параметры c и n не входят в стандарт ANSI для fopen , а представляют собой


расширения корпорации Майкрософт, и их не следует использовать, если
требуется обеспечить переносимость ANSI.

Использование функции фиксации на диск с


существующим кодом
По умолчанию вызовы fflush функций библиотеки _flushall записывают данные в
буферы, поддерживаемые операционной системой. Операционная система
самостоятельно определяет оптимальное время для фактической записи данных на
диск. Функция фиксации на диск, реализованная в библиотеке среды выполнения,
позволяет выполнять запись критически важных данных непосредственно на диск,
а не в буферы операционной системы. Эту возможность для существующей
программы можно предоставить, не переписывая код программы. Для этого
свяжите ее объектные файлы с файлом COMMODE.OBJ.

После этого в исполняемом файле все вызовы функции fflush сохраняют


содержимое буфера непосредственно на диск, а вызовы функции _flushall
сохраняют на диск содержимое всех буферов. COMMODE.OBJ влияет только на
работу этих двух функций.

Завершение блока, относящегося только к системам Майкрософт

См. также
Потоковый ввод-вывод

_fdopen, _wfdopen

fopen, _wfopen

Глобальные константы
_CRT_DISABLE_PERFCRIT_LOCKS
Статья • 03.04.2023

Отключает критическую с точки зрения производительности блокировку в


операциях ввода-вывода.

Синтаксис
C

#define _CRT_DISABLE_PERFCRIT_LOCKS

Remarks
Определение этого символа может улучшить производительность в однопоточных
привязанных к вводу-выводу программах путем принудительного использования
однопоточной модели ввода-вывода во всех операциях ввода-вывода.
Дополнительные сведения см. в статье о производительности многопоточных
библиотек.

См. также раздел


Глобальные константы
Константы типа данных
Статья • 03.04.2023

Константы типа данных — это зависящие от реализации диапазоны значений,


допустимые для целочисленных типов данных и типов данных с плавающей
запятой.

Константы целочисленных типов


Эти константы предоставляют диапазоны значений для целочисленных типов
данных. Чтобы использовать их, включите заголовок limits.h в исходный файл.

#include <limits.h>

7 Примечание

Параметр /J компилятора изменяет тип по умолчанию char с signed char


. unsigned char

Константа Значение Описание

CHAR_BIT 8 Число бит для char

SCHAR_MIN (–128) Минимальное


значение для signed
char

SCHAR_MAX 127 Максимальное


значение для signed
char

UCHAR_MAX 255 (0xff) Максимальное


значение для
unsigned char

CHAR_MIN (-128) (0, если /J используется параметр) Минимальное


значение для char

CHAR_MAX 127 (255, если /J используется параметр) Максимальное


значение для char
Константа Значение Описание

MB_LEN_MAX 5 Максимальное
число байтов для
многобайтового
char

SHRT_MIN -32768 Минимальное


значение для signed
short

SHRT_MAX 32767 Максимальное


значение для signed
short

USHRT_MAX 65 535 (0xffff) Максимальное


значение для
unsigned short

INT_MIN (–2 147 483 647 – 1) Минимальное


значение для signed
int

INT_MAX 2147483647 Максимальное


значение для signed
int

UINT_MAX 4 294 967 295 (0xffffffff) Максимальное


значение для
unsigned int

LONG_MIN (–2 147 483 647L – 1) Минимальное


значение для signed
long

LONG_MAX 2 147 483 647L Максимальное


значение для signed
long

ULONG_MAX 4 294 967 295UL (0xfffffffful) Максимальное


значение для
unsigned long

LLONG_MIN (–9 223 372 036 854 775 807LL – 1) Минимальное


signed long long
или __int64
значение
Константа Значение Описание

LLONG_MAX 9 223 372 036 854 775 807LL Максимальное


signed long long
или __int64
значение

ULLONG_MAX 0xffffffffffffffffull Максимальное


значение для
unsigned long long

_I8_MIN (–127i8 – 1) Минимальное 8-


битное значение со
знаком

_I8_MAX 127i8 Максимальное 8-


битное значение со
знаком

_UI8_MAX 0xffui8 Максимальное 8-


битное значение без
знака

_I16_MIN (–32 767i16 – 1) Минимальное 16-


битное значение со
знаком

_I16_MAX 32 767i16 Максимальное 16-


битное значение со
знаком

_UI16_MAX 0xffffui16 Максимальное 16-


битное значение без
знака

_I32_MIN (–2 147 483 647i32 – 1) Минимальное 32-


битное значение со
знаком

_I32_MAX 2 147 483 647i32 Максимальное 32-


битное значение со
знаком

_UI32_MAX 0xffffffffui32 Максимальное 32-


битное значение без
знака

_I64_MIN (–9 223 372 036 854 775 807 – 1) Минимальное 64-


битное значение со
знаком
Константа Значение Описание

_I64_MAX 9223372036854775807 Максимальное 64-


битное значение со
знаком

_UI64_MAX 0xffffffffffffffffui64 Максимальное 64-


битное значение без
знака

_I128_MIN (– Минимальное 128-


170 141 183 460 469 231 731 687 303 715 884 105 727i128 битное значение со
– 1) знаком

_I128_MAX 170 141 183 460 469 231 731 687 303 715 884 105 727i128 Максимальное 128-


битное значение со
знаком

_UI128_MAX 0xffffffffffffffffffffffffffffffffui128 Максимальное 128-


битное значение без
знака

SIZE_MAX то же, что _UI64_MAX и если _WIN64 он определен, или Максимальный


UINT_MAX размер
собственного
целочисленного
типа

RSIZE_MAX то же, что и ( SIZE_MAX >> 1) Максимальный


размер
целочисленного
типа защищенной
библиотеки

Типы констант с плавающей запятой


Следующие константы предоставляют диапазон и другие характеристики long
double double типов данных. float Чтобы использовать их, включите заголовок

float.h в исходный файл.

#include <float.h>

Константа Значение Описание


Константа Значение Описание

DBL_DECIMAL_DIG 17 Число десятичных разрядов точности


округления

DBL_DIG 15 Количество десятичных разрядов точности

DBL_EPSILON 2,2204460492503131e-016 Наименьший размер: 1,0 + DBL_EPSILON !=


1,0

DBL_HAS_SUBNORM 1 Тип поддерживает денормализованные


числа

DBL_MANT_DIG 53 Число битов в мантиссе

DBL_MAX 1,7976931348623158e+308 Максимальное значение

DBL_MAX_10_EXP 308 Максимальный показатель десятичной


степени

DBL_MAX_EXP 1024 Максимальный показатель двоичной


степени

DBL_MIN 2,2250738585072014e-308 Минимальное нормализованное


положительное значение

DBL_MIN_10_EXP (-307) Минимальный показатель десятичной


степени

DBL_MIN_EXP (-1021) Минимальный показатель двоичной степени

_DBL_RADIX 2 Основание системы счисления

DBL_TRUE_MIN 4.9406564584124654e-324 Минимальное денормализованное


положительное значение

FLT_DECIMAL_DIG 9 Число десятичных разрядов точности


округления

FLT_DIG 6 Число десятичных разрядов точности

FLT_EPSILON 1,192092896e-07F Наименьший, что 1,0 + FLT_EPSILON != 1,0

FLT_HAS_SUBNORM 1 Тип поддерживает денормализованные


числа

FLT_MANT_DIG 24 Число битов в мантиссе

FLT_MAX 3,402823466e+38F Максимальное значение

FLT_MAX_10_EXP 38 Максимальный показатель десятичной


степени
Константа Значение Описание

FLT_MAX_EXP 128 Максимальный показатель двоичной


степени

FLT_MIN 1,175494351e-38F Минимальное нормализованное


положительное значение

FLT_MIN_10_EXP (-37) Минимальный показатель десятичной


степени

FLT_MIN_EXP (-125) Минимальный показатель двоичной степени

FLT_RADIX 2 Основание системы счисления

FLT_TRUE_MIN 1.401298464e-45F Минимальное денормализованное


положительное значение

LDBL_DIG 15 Количество десятичных разрядов точности

LDBL_EPSILON 2,2204460492503131e-016 Наименьший, что 1,0 + LDBL_EPSILON != 1,0

LDBL_HAS_SUBNORM 1 Тип поддерживает денормализованные


числа

LDBL_MANT_DIG 53 Число битов в мантиссе

LDBL_MAX 1,7976931348623158e+308 Максимальное значение

LDBL_MAX_10_EXP 308 Максимальный показатель десятичной


степени

LDBL_MAX_EXP 1024 Максимальный показатель двоичной


степени

LDBL_MIN 2,2250738585072014e-308 Минимальное нормализованное


положительное значение

LDBL_MIN_10_EXP (-307) Минимальный показатель десятичной


степени

LDBL_MIN_EXP (-1021) Минимальный показатель двоичной степени

_LDBL_RADIX 2 Основание системы счисления

LDBL_TRUE_MIN 4.9406564584124654e-324 Минимальное денормализованное


положительное значение

DECIMAL_DIG то же самое, что и Число десятичных разрядов точности


DBL_DECIMAL_DIG округления по умолчанию (два)
См. также раздел
Глобальные константы
Константы среды
Статья • 03.04.2023

Синтаксис
C

#include <stdlib.h>

Remarks
Константа _MAX_ENV определяет длину среды для строк.

Константа Значение

_MAX_ENV Максимальный размер строки среды.

См. также раздел


Глобальные константы
EOF , WEOF
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
EOF возвращается подпрограммой ввода-вывода при обнаружении конца файла

(или в некоторых случаях возникает ошибка).

WEOF возвращает возвращаемое значение типа wint_t , используемое для сигнала о

конце широкого потока или для сообщения об ошибке.

См. также раздел


putc, putwc

ungetc, ungetwc

scanf, _scanf_l, wscanf, _wscanf_l

fflush

fclose, _fcloseall

_ungetch, _ungetwch, _ungetch_nolock, _ungetwch_nolock

_putch, _putwch

isascii, __isascii, iswascii

Глобальные константы
errno Константы
Статья • 03.04.2023

Синтаксис
C++

#include <errno.h>

Remarks
Константы errno — это значения, назначенные errno для различных условий
ошибок.

ERRNO.H содержит определения значений errno . Однако не все определения,

указанные в ERRNO.H них, используются в 32-разрядных операционных системах


Windows. Некоторые из значений ERRNO.H присутствуют для обеспечения
совместимости с семейством операционных систем UNIX. errno Значения в 32-
разрядной операционной системе Windows представляют собой подмножество
значений в errno системах UNIX.

Значение errno не обязательно совпадает с фактическим кодом ошибки,


возвращенным системным вызовом из операционной системы Windows. Чтобы
получить доступ к фактическому коду ошибки операционной системы, используйте
_doserrno переменную, содержащую это значение.

Поддерживаются следующие errno значения:

Константа Описание Значение

E2BIG Список аргументов слишком длинный. 7


Константа Описание Значение

EACCES В разрешении отказано. Параметр разрешения файла не 13


разрешает указанный доступ. Предпринята попытка получить
доступ к файлу (или, в некоторых случаях, каталогу),
несовместимым с атрибутами файла.

Например, эта ошибка может возникать при попытке чтения из


файла, который не открыт. Или при попытке открыть
существующий файл только для чтения для записи или открыть
каталог, а не файл. В операционных системах MS-DOS версии 3.0
и более поздних EACCES версий также может указывать на
нарушение блокировки или совместного использования.

Ошибка может также возникать при попытке переименовать


файл или каталог или при попытке удалить существующий
каталог.

EAGAIN Больше процессов или недостаточно памяти или максимального 11


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

EBADF Неверный номер файла. Существует две возможные причины: 1) 9


Указанный дескриптор файла не является допустимым
значением или не ссылается на открытый файл. 2) Предпринята
попытка записи в файл или устройство, которые были открыты
только для чтения.

EBUSY Устройство или ресурс занят. 16

ECHILD Нет порожденных процессов. 10

EDEADLK Может произойти взаимоблокировка ресурсов. 36

EDEADLOCK EDEADLK Аналогично совместимости с более старыми версиями 36


Microsoft C.

EDOM Математический аргумент. Аргумент математической функции 33


не в домене функции.

EEXIST Файлы существуют. Предпринята попытка создать файл, который 17


уже существует. Например, _O_CREAT в вызове указаны _open
флаги и _O_EXCL флаги, но именованный файл уже существует.

EFAULT Неправильный адрес. 14

EFBIG Слишком большой файл. 27


Константа Описание Значение

EILSEQ Недопустимая последовательность байтов (например, в строке 42


MBCS ).

EINTR Прерванная функция. 4

EINVAL Недопустимый аргумент. Для одного из аргументов функции 22


указано недопустимое значение. Например, значение, заданное
для источника при расположении указателя файла (по вызову
fseek ), находится перед началом файла.

EIO Ошибка ввода-вывода. 5

EISDIR Каталог. 21

EMFILE Слишком много открытых файлов. Нет доступных дескрипторов 24


файлов, поэтому невозможно открыть дополнительные файлы.

EMLINK Слишком много ссылок. 31

ENAMETOOLONG Слишком длинное имя файла. 38

ENFILE Слишком много файлов, открытых в системе. 23

ENODEV Нет такого устройства. 19

ENOENT Отсутствует такой файл или каталог. Указанный файл или каталог 2
не существует или не найден. Это сообщение может возникать
всякий раз, когда указанный файл не существует или компонент
пути не указывает существующий каталог.

ENOEXEC Ошибка формата исполняемого файла. Предпринята попытка 8


выполнить файл, который не является исполняемым или имеет
недопустимый формат исполняемого файла.

ENOLCK Блокировки недоступны. 39

ENOMEM Недостаточно памяти для выполнения запрошенного оператора. 12


Например, это сообщение может возникать, если недостаточно
памяти для выполнения дочернего процесса или когда запрос
на выделение в _getcwd вызове не может быть удовлетворен.

ENOSPC На устройстве не осталось места. На устройстве нет больше 28


доступного для записи места (например, при полном
заполнении диска).

ENOSYS Функция не поддерживается. 40

ENOTDIR Не каталог. 20
Константа Описание Значение

ENOTEMPTY Каталог не пуст. 41

ENOTTY Неуместная операция управления вводом-выводом. 25

ENXIO Нет такого устройства или адреса. 6

EPERM Операция не разрешена. 1

EPIPE Сломанная труба. 32

ERANGE Результат слишком большой. Аргумент математической функции 34


слишком велик, что приведет к частичной или полной потере
значимости результата. Эта ошибка также может возникать в
других функциях, если аргумент больше ожидаемого (например,
если buffer аргумент _getcwd длиннее ожидаемого).

EROFS Только для чтения файловая система. 30

ESPIPE Недопустимый поиск. 29

ESRCH Такой процесс не существует. 3

EXDEV Ссылка между устройствами. Предпринята попытка переместить 18


файл на другое устройство (с помощью rename функции).

STRUNCATE Копирование или объединение строк привело к усечению 80


строки. См. раздел _TRUNCATE.

Для совместимости с POSIX поддерживаются следующие значения:

Константа Описание Значение

EADDRINUSE Используемый адрес. 100

EADDRNOTAVAIL Адрес недоступен. 101

EAFNOSUPPORT Семейство адресов не поддерживается. 102

EALREADY Подключение уже выполняется. 103

EBADMSG Неправильное сообщение. 104

ECANCELED Операция отменена. 105

ECONNABORTED Подключение прервано. 106

ECONNREFUSED Подключение отклонено. 107

ECONNRESET Сброс подключения. 108


Константа Описание Значение

EDESTADDRREQ Необходим адрес назначения. 109

EHOSTUNREACH Узел недоступен. 110

EIDRM Идентификатор удален. 111

EINPROGRESS Выполняется операция. 112

EISCONN Уже подключено. 113

ELOOP Слишком много символических уровней ссылок. 114

EMSGSIZE Размер сообщения. 115

ENETDOWN Сеть отключена. 116

ENETRESET Сброс сети. 117

ENETUNREACH Сеть недоступна. 118

ENOBUFS Нет буферного пространства. 119

ENODATA Сообщение недоступно. 120

ENOLINK Нет ссылки. 121

ENOMSG Нет сообщения. 122

ENOPROTOOPT Нет параметра протокола. 123

ENOSR Нет потоковой передачи ресурсов. 124

ENOSTR Не поток. 125

ENOTCONN Отсутствует соединение. 126

ENOTRECOVERABLE Состояние не может быть восстановлено. 127

ENOTSOCK Не сокет. 128

ENOTSUP Не поддерживается. 129

EOPNOTSUPP Неподдерживаемая операция. 130

EOTHER Другое 131

EOVERFLOW Слишком большое значение. 132

EOWNERDEAD Владелец умер. 133


Константа Описание Значение

EPROTO Ошибка протокола. 134

EPROTONOSUPPORT Протокол не поддерживается. 135

EPROTOTYPE Неправильный тип протокола. 136

ETIME Время ожидания потока. 137

ETIMEDOUT Истекло время ожидания. 138

ETXTBSY Текстовый файл занят. 139

EWOULDBLOCK Операция может вызвать блокировку. 140

См. также раздел


Глобальные константы
Константы обработки исключений
Статья • 03.04.2023

Константа EXCEPTION_CONTINUE_SEARCH , EXCEPTION_CONTINUE_EXECUTION или


EXCEPTION_EXECUTE_HANDLER возвращается при возникновении исключения во время

выполнения защищенного раздела оператора try-except. Возвращаемое значение


определяет, как обрабатывается исключение. Дополнительные сведения см. в
статье Оператор try-except в справочнике по языку С++.

См. также раздел


Глобальные константы
EXIT_SUCCESS , EXIT_FAILURE
Статья • 03.04.2023

Обязательный заголовок
C

#include <stdlib.h>

Комментарии
Константы и EXIT_FAILURE являются аргументами для exit функций и _exit и
возвращаемыми значениями для atexit функций и _onexit . EXIT_SUCCESS

Константа Заданные значения

EXIT_SUCCESS 0

EXIT_FAILURE 1

См. также раздел


Глобальные константы
Константы атрибутов файлов
Статья • 03.04.2023

Синтаксис
C

#include <io.h>

Remarks
Эти константы определяют атрибуты текущего файла или каталога, заданного с
помощью функции.

Атрибуты представлены следующими константами манифеста.

Константа Описание

_A_ARCH Архив. Устанавливается при любом изменении файла и очищается командой


BACKUP. Значение: 0x20

_A_HIDDEN Скрытый файл. Такой файл не отображается командой DIR, если не указан
параметр /AH. Возвращает сведения о обычных файлах и файлах с этим
атрибутом. Значение: 0x02

_A_NORMAL Нормальный. Такой файл можно читать или изменять без ограничений.
Значение: 0x00

_A_RDONLY Только для чтения. Невозможно открыть файл для записи, и файл с тем же
именем не удается создать. Значение: 0x01

_A_SUBDIR Подкаталог. Значение: 0x10

_A_SYSTEM Системный файл. Такой файл не отображается командой DIR, если не указан
параметр /AS. Значение: 0x04

Несколько констант можно объединить с оператором OR ( | ).

См. также раздел


Функции поиска имени файла

Глобальные константы
Константы файлов
Статья • 03.04.2023

Синтаксис
C

#include <fcntl.h>

Remarks
Целочисленное выражение, образуемое из одной или нескольких этих констант,
определяет тип разрешенных операций чтения или записи. Он формируется путем
объединения одной или нескольких констант с константой в режиме перевода.

Константы файла выглядят следующим образом:

Константа Описание

_O_APPEND Перемещает файловый указатель в конец файла перед каждой операцией


записи.

_O_CREAT Создает и открывает новый файл для записи; Константа не действует, если
файл, указанный в filename файле, существует.

_O_EXCL Возвращает значение ошибки, если файл, указанный параметром filename ,


существует. Применяется только при использовании в сочетании с _O_CREAT .

_O_RDONLY Открывает файл только для чтения; Значение , если этот флаг задан и
_O_RDWR _O_WRONLY не может быть задано.

_O_RDWR Открывает файл для чтения и записи; Значение , если этот флаг задан и
_O_RDONLY _O_WRONLY не может быть задано.

_O_TRUNC Открывает и усекает до нулевой длины существующий файл; файл должен


иметь разрешение на запись. Содержимое файла уничтожается. Если этот флаг
задан, нельзя указать _O_RDONLY .

_O_WRONLY Открывает файл только для записи; Значение , если этот флаг задан и
_O_RDONLY _O_RDWR не может быть задано.

См. также раздел


_open, _wopen

_sopen, _wsopen

Глобальные константы
Константы разрешений файлов
Статья • 03.04.2023

Синтаксис
C

#include <sys/stat.h>

Remarks
Одна из этих констант обязательна при указании _O_CREAT ( _open , _sopen ).

Аргумент pmode определяет настройки разрешений файла следующим образом.

Константа Значение

_S_IREAD Разрешено чтение

_S_IWRITE Разрешена запись

_S_IREAD | _S_IWRITE Разрешены чтение и запись

При использовании в качестве аргумента pmode для функции _umask эта константа
манифеста задает настройки разрешений следующим образом.

Константа Значение

_S_IREAD Запись запрещена (файл доступен только для чтения)

_S_IWRITE Чтение запрещено (файл доступен только для записи)

_S_IREAD | _S_IWRITE Как чтение, так и запись запрещены

См. также раздел


_open, _wopen

_sopen, _wsopen

_umask

Стандартные типы

Глобальные константы
Константы доступа для чтения и
записи файлов
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
Эти константы определяют запрашиваемый для файла тип доступа ("a", "r" или "w").
В типе доступа можно указать как режим преобразования ("b" или "t"), так и режим
фиксации на диск ("c" или "n").

Типы доступа описаны в следующей таблице.

Тип Описание
доступа

"r" Открывает для чтения. Если файл не существует или его не удается найти, вызов
для открытия файла завершается ошибкой.

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление); сначала создает файл, если
он не существует. Все операции записи выполняются в конце файла. Хотя
указатель на файл можно изменить с помощью fseek или rewind , он всегда
перемещается обратно в конец файла перед выполнением любой операции
записи.

" r+ " Открывает для чтения и записи. Если файл не существует или его не удается
найти, вызов для открытия файла завершается ошибкой.

" w+ " Открывает пустой файл для чтения и записи. Если указанный файл существует, его
содержимое удаляется.

" a+ " То же, что и " a ", но также позволяет читать.

Если задан тип доступа "r+", "w+" или "a+", разрешены чтение и запись (считается,
что файл открыт "для обновления"). Однако при переключении между чтением и
записью должны быть промежуточные операции fflush , fsetpos , fseek или
rewind . Для операции fsetpos или fseek можно задать текущее положение.

См. также раздел


_fdopen, _wfdopen

fopen, _wfopen

freopen, _wfreopen

_fsopen, _wfsopen

_popen, _wpopen

Глобальные константы
Константы трансляции файлов
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
Эти константы определяют режим преобразования ("b" или "t"). Режим содержится
в строке, указывающей тип доступа ("r", "w", "a", "r+", "w+", "a+").

Режимы преобразования приведены ниже:

Открывает файл в текстовом (преобразованном) режиме. В этом режиме при


вводе сочетания символов возврата каретки и перевода строки (CR-LF)
преобразуются в один символ перевода строки (LF), а при выводе символы
перевода строки (LF) преобразуются в сочетания символов возврата каретки
и перевода строки (CR-LF). Кроме того, при вводе символ CTRL+Z
интерпретируется как символ конца файла. В файлах, открытых для чтения или
чтения и записи, функция fopen проверяет наличие CTRL+Z в конце файла и
удаляет его, если это возможно. Он удаляется из-за того, что использование
fseek функций и ftell функций для перемещения внутри файла,
заканчивающегося клавишами CTRL+Z, может привести fseek к
неправильному поведении в конце файла.

7 Примечание

Параметр t не предусмотрен в стандарте ANSI для функций fopen и


freopen . Это расширение Microsoft и оно не должно использоваться, если
требуется совместимость с ANSI.

b
Открывает в двоичном (непреобразованном) режиме. Вышеописанные
преобразования отключены.

Если параметр t или b не указан, mode режим перевода определяется переменной


_fmodeпо умолчанию. Дополнительные сведения об использовании текстовых и
двоичных режимов см. в разделе "Текстовый и двоичный режим файлового ввода-
вывода".

См. также раздел


_fdopen, _wfdopen

fopen, _wfopen

freopen, _wfreopen

_fsopen, _wfsopen

Глобальные константы
FILENAME_MAX
Статья • 03.04.2023

Максимально допустимая длина для размера буфера строк filename .

Синтаксис
C

#include <stdio.h>

См. также раздел


Пределы поля "Путь"

Глобальные константы
FOPEN_MAX , _SYS_OPEN
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
FOPEN_MAX и _SYS_OPEN максимальное количество файлов, которые могут быть

открыты одновременно. FOPEN_MAX  — это ANSI-совместимое имя. Константа


_SYS_OPEN предоставлена для обеспечения совместимости с существующим кодом.

См. также раздел


Глобальные константы
_FREEENTRY , _USEDENTRY
Статья • 03.04.2023

Синтаксис
C

#include <malloc.h>

Remarks
Эти константы представляют значения, назначенные _heapwalk подпрограммам
_useflag элементу _HEAPINFO структуры. Они показывают состояние записи кучи.

См. также раздел


_heapwalk

Глобальные константы
fseek , _lseek константы
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
Аргумент origin указывает начальную позицию и может быть одной из следующих
констант манифеста:

Константа Значение

SEEK_END Конец файла

SEEK_CUR Текущая позиция файлового указателя

SEEK_SET Начало файла

См. также раздел


fseek, _fseeki64

_lseek, _lseeki64

Глобальные константы
Константы кучи
Статья • 03.04.2023

Синтаксис
C

#include <malloc.h>

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

Константа Значение

_HEAPBADBEGIN Исходные сведения о заголовке не найдены или недопустимы.

_HEAPBADNODE Обнаружен недопустимый узел или куча повреждена.

_HEAPBADPTR _pentry поле структуры не содержит допустимый _HEAPINFO указатель на


кучу ( _heapwalk только подпрограмма).

_HEAPEMPTY Куча не инициализирована.

_HEAPEND Конец кучи успешно достигнут (только для подпрограммы _heapwalk ).

_HEAPOK Куча согласована (только для подпрограмм _heapset и _heapchk ). Нет


ошибок до сих пор; _HEAPINFO Структура содержит сведения о следующей
записи ( _heapwalk только подпрограмма).

См. также раздел


_heapchk
_heapset

_heapwalk

Глобальные константы
_HEAP_MAXREQ
Статья • 25.10.2022

Синтаксис

#include <malloc.h>

Remarks
Максимальный размер пользовательского запроса на выделение памяти, который
может быть удовлетворен.

См. также раздел


malloc

calloc

Глобальные константы
HUGE_VAL , _HUGE
Статья • 03.04.2023

Синтаксис
C

#include <math.h>

Remarks
HUGE_VAL является максимальным представимым значением double. Это значение

возвращается многими математическими функциями времени выполнения при


возникновении ошибки. Для некоторых -HUGE_VAL функций возвращается значение
. HUGE_VAL определяется как результат продукта с плавающей запятой, который
гарантированно переполняется. HUGE_VALF и HUGE_VALL — это наибольшие
представляемые float и long double типизированные значения соответственно.
Внутреннее значение _HUGE и синоним HUGE определяются аналогичным образом,
но математические функции времени выполнения возвращают . HUGE_VAL Для
согласованности в коде также необходимо использовать значение HUGE_VAL .

См. также раздел


Глобальные константы
Категории языковых стандартов
Статья • 03.04.2023

Синтаксис
C

#include <locale.h>

Remarks
Категории языковых стандартов представляют собой константы манифеста, с
помощью которых подпрограммы локализации указывают, какую информацию о
языковом стандарте программы они будут использовать. Языковой стандарт
определяет расположение (или страну, или регион), для которого можно настроить
определенные аспекты программы. Например, языковой стандарт влияет на
форматирование дат и отображение денежных значений.

Категории Части программы, на которые они влияют


языкового
стандарта

LC_ALL Любое применение языкового стандарта (все категории)

LC_COLLATE Поведение функций strcoll и strxfrm

LC_CTYPE Поведение функций обработки символов (за исключением isdigit , isxdigit ,


mbstowcs и mbtowc )

LC_MAX То же, что LC_TIME

LC_MIN То же, что LC_ALL

LC_MONETARY Информация о форматировании денежных значений, возвращаемая


функцией localeconv

LC_NUMERIC Символ десятичного разделителя для процедур форматированного вывода


(например, printf ), для процедур преобразования данных и для
форматирования в выводе функции localeconv , не имеющего отношения к
денежным значениям.

LC_TIME Поведение функции strftime


_wsetlocaleСмsetlocale. пример.

См. также раздел


localeconv

setlocale, _wsetlocale

Функции strcoll

strftime, wcsftime, _strftime_l, _wcsftime_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l

Глобальные константы
_locking Константы
Статья • 03.04.2023

Синтаксис
C

#include <sys/locking.h>

Remarks
Аргумент mode в вызове _locking функции указывает выполняемую операцию
блокировки.

Аргумент mode должен быть одной из следующих констант манифеста.

Значение Описание

_LK_LOCK Блокирует указанные байты. Если байты не могут быть заблокированы,


функция пытается повторить попытку через 1 секунду. Если байты не могут
быть заблокированы после 10 попыток, функция возвращает ошибку.

_LK_RLCK Эквивалентно _LK_LOCK .

_LK_NBLCK Блокирует указанные байты. Если не удается заблокировать байты, функция


возвращает ошибку.

_LK_NBRLCK Эквивалентно _LK_NBLCK .

_LK_UNLCK Разблокирует указанные байты. (Байты должны быть ранее заблокированы.)

См. также раздел


_locking

Глобальные константы
Математические константы
Статья • 03.04.2023

Корпорация Майкрософт предоставляет несколько предопределенных макросов


препроцессора для общих математических констант.

Синтаксис
C++

#define _USE_MATH_DEFINES // for C++

#include <cmath>

#define _USE_MATH_DEFINES // for C

#include <math.h>

Remarks
Определены символические обозначения для следующих величин:

Символ Expression Значение

M_E й 2.71828182845904523536

M_LOG2E log2(e) 1.44269504088896340736

M_LOG10E log10(e) 0.434294481903251827651

M_LN2 ln(2) 0.693147180559945309417

M_LN10 ln(10) 2.30258509299404568402

M_PI pi 3.14159265358979323846

M_PI_2 pi/2 1.57079632679489661923

M_PI_4 pi/4 0.785398163397448309616

M_1_PI 1/pi 0.318309886183790671538

M_2_PI 2/pi 0.636619772367581343076

M_2_SQRTPI 2/sqrt(pi) 1.12837916709551257390

M_SQRT2 sqrt(2) 1.41421356237309504880


Символ Expression Значение

M_SQRT1_2 1/sqrt(2) 0.707106781186547524401

Математические константы не определены в стандарте C/C++. Чтобы использовать


их, необходимо сначала определить _USE_MATH_DEFINES , а затем включить <cmath>
или <math.h> .

Файл <ATLComTime.h> включает в себя <math.h> , когда проект построен в режиме


выпуска. Если в проекте используется одна или несколько математических
констант, которые также включают <ATLComTime.h> , необходимо определить
_USE_MATH_DEFINES перед включением <ATLComTime.h> .

См. также раздел


Глобальные константы
Константы математических ошибок
Статья • 03.04.2023

Синтаксис
C

#include <math.h>

Remarks
Математические подпрограммы библиотеки времени выполнения могут
генерировать константы математических ошибок.

Эти ошибки, описанные ниже, соответствуют типам исключений, определенным в


файле MATH.H, и возвращаются функцией _matherr , когда возникает
математическая ошибка.

Константа Значение

_DOMAIN Значение аргумента функции находится вне домена функции.

_OVERFLOW Результат слишком велик для представления в виде типа возвращаемого


значения функции.

_PLOSS Произошла частичная потеря значимости.

_SING Сингулярность аргумента: аргумент функции имеет недопустимое значение.


(Например, значение 0 передается в функцию, для которой требуется
ненулевое значение.)

_TLOSS Произошла полная потеря значимости.

_UNDERFLOW Результат слишком мал для представления.

См. также раздел


_matherr

Глобальные константы
_MAX_ENV
Статья • 03.04.2023

Максимально допустимая длина строки переменной среды.

Синтаксис
C

#include <stdio.h>

См. также раздел


Константы среды

Глобальные константы
MB_CUR_MAX
Статья • 03.04.2023

Макрос, который указывает максимальное количество байтов в многобайтовом


символе для текущего языкового стандарта.

Синтаксис
C++

#include <stdlib.h>

Remarks
Контекст: функции преобразования для расширенных и многобайтовых символов
ANSI

Значение MB_CUR_MAX — это максимальное количество байт в многобайтовом


символе для текущего языкового стандарта.

См. также
_mbclen, mblen, _mblen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

___mb_cur_max_func, ___mb_cur_max_l_func, __p___mb_cur_max, __mb_cur_max

Стандартные типы

wcstombs, _wcstombs_l

wctomb, _wctomb_l

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

Глобальные константы
NULL (CRT)
Статья • 03.04.2023

NULL — значение null-указателя, используемое со многими операциями и

функциями указателя. Это эквивалентно 0. NULL определяется в следующих файлах


заголовков: CRTDBG. H, LOCALE. H, STDDEF. H, STDIO. H, STDLIB. H, STRING. H, TCHAR.
H, TIME. H и WCHAR.H.

См. также раздел


Глобальные константы
Пределы поля "Путь"
Статья • 03.04.2023

Синтаксис
C++

#include <stdlib.h>

Remarks
Эти константы определяют максимальную длину пути и отдельных полей в пути.

Константа Значение

_MAX_DIR Максимальная длина компонента каталога

_MAX_DRIVE Максимальная длина компонента диска

_MAX_EXT Максимальная длина компонента расширения

_MAX_FNAME Максимальная длина компонента имени файла

_MAX_PATH Максимальная длина полного пути

7 Примечание

Среда выполнения языка C поддерживает длину пути до 32768 символов, но


поддержка таких длинных путей зависит от операционной системы, а именно,
от файловой системы. Для полной обратной совместимости с файловыми
системами FAT32 общая длина полей не должна превышать _MAX_PATH .
Файловая система Windows NTFS поддерживает пути длиной до 32 768
символов, но только при использовании API Юникода. При использовании
длинных путей указывайте в начале пути символы \\?\ и используйте версии
функций среды выполнения языка С для Юникода.

См. также раздел


Глобальные константы
RAND_MAX
Статья • 03.04.2023

Синтаксис
C

#include <stdlib.h>

Remarks
Константа RAND_MAX является максимальным значением, которое может
возвращаться функцией rand . RAND_MAX определяется как значение 0x7fff.

См. также раздел


rand

Глобальные константы
setvbuf Константы
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
Эти константы представляют тип буфера для setvbuf .

Возможные значения определяются следующими константами манифеста:

Константа Значение

_IOFBF Полная буферизация. Используется буфер, указанный в вызове функции


setvbuf , и его размер равен указанному в вызове функции setvbuf . Если
указатель буфера имеет значение NULL , используется автоматически
выделенный буфер указанного размера.

_IOLBF Эквивалентно _IOFBF .

_IONBF Буфер не используется, независимо от аргументов в вызове функции setvbuf .

См. также раздел


setbuf

Глобальные константы
Совместное использование констант
Статья • 03.04.2023

Константы для режимов общего доступа к файлам.

Синтаксис
C

#include <share.h>

Remarks
Аргумент shflag определяет режим общего доступа, состоящий из одной или
нескольких констант манифеста. Эти константы можно объединить с oflag
аргументами (см. константы файла).

В следующей таблице перечислены константы и их смысловые значения:

Константа Значение

_SH_DENYRW Запрещает доступ к файлу для чтения и записи

_SH_DENYWR Запрещает доступ к файлу для записи

_SH_DENYRD Запрещает доступ к файлу для чтения

_SH_DENYNO Разрешает доступ для чтения и записи

_SH_SECURE Устанавливает безопасный режим (совместный доступ для чтения,


монопольный доступ для записи)

См. также раздел


_sopen, _wsopen

_fsopen, _wfsopen

Глобальные константы
signal Константы
Статья • 03.04.2023

Синтаксис
C

#include <signal.h>

Remarks
Аргумент sig должен представлять собой одну из констант манифеста,
определенных в SIGNAL.H (перечислены ниже).

Константа Описание

SIGABRT Аварийное завершение. По умолчанию завершает вызывающую


программу с кодом выхода 3.

SIGABRT_COMPAT То же значение, что и SIGABRT . Для обеспечения совместимости с другими


платформами.

SIGFPE Ошибка операций с плавающей запятой, например переполнение, деление


на ноль или недопустимая операция. По умолчанию завершает
вызывающую программу.

SIGILL Недопустимая инструкция. По умолчанию завершает вызывающую


программу.

SIGINT Прерывание CTRL+C. По умолчанию завершает вызывающую программу с


кодом выхода 3.

SIGSEGV Недопустимое обращение к хранилищу. По умолчанию завершает


вызывающую программу.

SIGTERM В программу направлен запрос на прекращение. По умолчанию завершает


вызывающую программу с кодом выхода 3.

SIG_ERR Тип значения, возвращаемого из signal с информацией о произошедшей


ошибке.

См. также раздел


signal

raise

Глобальные константы
signal константы действий
Статья • 03.04.2023

Действие, выполняемое при получении сигнала прерывания, зависит от значения


func .

Синтаксис
C

#include <signal.h>

Remarks
Аргумент func должен содержать адрес функции или одну из констант манифеста,
определенных в SIGNAL.H (перечислены ниже).

Константа Описание

SIG_DFL Использует ответ системы по умолчанию. Если вызывающая программа


использует потоковый ввод-вывод, буферы, созданные библиотекой времени
выполнения, не очищаются.

SIG_IGN Игнорирует сигнал прерывания. Это значение нельзя использовать для SIGFPE ,
так как в этом случае состояние процесса с плавающей запятой остается
неопределенным.

SIG_GET Возвращает текущее значение сигнала.

SIG_SGE Указывает, что в signal произошла ошибка.

SIG_ACK Указывает, что получено подтверждение.

SIG_ERR Тип значения, возвращаемого из signal с информацией о произошедшей


ошибке.

См. также раздел


signal

Глобальные константы
spawn Константы
Статья • 03.04.2023

Синтаксис
C

#include <process.h>

Remarks
Аргумент mode определяет действие, предпринимаемое процессом перед
операцией инициализации и в течение нее. Для mode возможны следующие
значения:

Константа Значение

_P_OVERLAY Перекрывает вызывающий процесс новым процессом, уничтожая


вызывающий процесс (тот же эффект, что и у вызовов функции _exec ).

_P_WAIT Приостанавливает вызывающий поток до тех пор, пока не будет завершено


выполнение нового процесса (синхронная функция _spawn ).

_P_NOWAIT , Продолжает выполнять вызывающий процесс параллельно с новым


_P_NOWAITO процессом (асинхронная функция _spawn ).

_P_DETACH Продолжает выполнять вызывающий процесс; новый процесс выполняется в


фоновом режиме без доступа к консоли или клавиатуре. Вызовы функции
_cwait для нового процесса будут завершаться с ошибкой. Это _spawn
асинхронная.

См. также раздел


_spawn, _wspawn функции

Глобальные константы
_stat Константы полей структуры
st_mode
Статья • 03.04.2023

Синтаксис
C

#include <sys/stat.h>

Remarks
Эти константы используются для указания типа файла в st_mode поле _stat
структуры.

Ниже перечислены константы битовой маски.

Константа Значение

_S_IFMT Маска типа файла

_S_IFDIR Каталог

_S_IFCHR Специальный символ (если задана, указывает устройство)

_S_IFREG Регулярно

_S_IREAD Разрешение на чтение, владелец

_S_IWRITE Разрешение на запись, владелец

_S_IEXEC Разрешение на выполнение или поиск, владелец

См. также раздел


_stat, _wstat функции

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

Стандартные типы

Глобальные константы
stdin , stdout , stderr
Статья • 03.04.2023

Синтаксис
C

FILE *stdin;

FILE *stdout;

FILE *stderr;

#include <stdio.h>

Remarks
Глобальные stdin указатели констант , stdout и stderr являются стандартными
потоками для ввода, вывода и вывода ошибок.

По умолчанию стандартный ввод — чтение с клавиатуры, в то время как


стандартный вывод и стандартный вывод ошибок печатаются на экране.

Следующие указатели потока доступны для получения стандартных потоков:

Указатель STREAM

stdin Стандартный ввод

stdout Стандартные выходные данные

stderr Стандартная ошибка

Эти указатели можно использовать в качестве аргументов для функций. Некоторые


функции, такие как getchar и putchar, используют stdin и stdout автоматически.

Эти указатели являются константами и не могут быть назначены новые значения.


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

См. также раздел


Потоковый ввод-вывод

Глобальные константы
TMP_MAX , L_tmpnam
Статья • 03.04.2023

Синтаксис
C

#include <stdio.h>

Remarks
TMP_MAX — максимальное число уникальных имен файлов, которые функция tmpnam

может создать. L_tmpnam — длина имен временных файлов, создаваемых tmpnam .


Дополнительные сведения см. в разделе _tempnam, _wtempnam, tmpnam, .
_wtmpnam TMP_MAX_S и _TMP_MAX_S являются синонимами для использования со
связанными безопасными TMP_MAX функциямиtmpnam_s , _wtmpnam_s.

См. также раздел


Глобальные константы
Константы режима трансляции
Статья • 03.04.2023

Синтаксис
C

#include <fcntl.h>

Remarks
Константы _O_BINARY манифеста , _O_TEXT , _O_WTEXT , _O_U16TEXT и _O_U8TEXT
определяют режим преобразования для файлов ( _open и _sopen ) или режим
преобразования для потоков ( _setmode ).

Допустимые значения:

Значение Описание

_O_TEXT Открывает файл в текстовом режиме (с преобразованием). Во время ввода


сочетание символов возврата каретки и перевода строки (CR-LF)
преобразуется в один символ перевода строки (LF). Символы перевода строки
преобразуются в комбинацию CR-LF в выводе. Кроме того, при вводе символ
CTRL+Z интерпретируется как символ конца файла. В файлах, открытых для
чтения и чтения и записи, функция fopen проверяет наличие CTRL+Z в конце
файла и удаляет его, если это возможно. Он удаляется, так как использование
fseek функций и ftell для перемещения в файле, заканчивающегося
клавишами CTRL+Z, может привести fseek к неправильному поведению в
конце файла.

_O_WTEXT Открывает файл в режиме UTF16 (переведено). Поддерживаются расширенные


версии перевода _O_TEXT текста.

_O_U16TEXT Открывает файл в UTF16 без BOM (переведено). Поддерживаются


расширенные версии перевода _O_TEXT текста.

_O_U8TEXT Открывает файл в режиме UTF8 без BOM (переведено). Поддерживаются


текстовые _O_TEXT переводы .

_O_BINARY Открывает файл в двоичном (непреобразованном) режиме. Вышеописанные


преобразования отключены.
Значение Описание

_O_RAW Эквивалентно _O_BINARY . Поддерживается для обеспечения совместимости с


C 2.0.

Дополнительные сведения см. в разделах Текстовый и двоичный режим операций


ввода-вывода и Константы перевода файлов.

См. также раздел


_open, _wopen

_pipe

_sopen, _wsopen

_setmode

Глобальные константы
_TRUNCATE
Статья • 03.04.2023

Определяет поведение усечения строки.

Синтаксис
C

#include <stdlib.h>

Remarks
_TRUNCATE разрешает усечение, если передается в качестве параметра count этим
функциям:

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

mbstowcs_s, _mbstowcs_s_l

mbsrtowcs_s

wcstombs_s, _wcstombs_s_l

wcsrtombs_s

_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l

vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, _vsnwprintf_s_l

Если целевой буфер слишком мал для хранения всей строки, нормальное
поведение этих функций заключается в том, чтобы рассматривать его как ошибку
(см. раздел "Проверка параметров"). Однако, если разрешено усечение строки
путем передачи _TRUNCATE , эти функции копируют столько символов, сколько
возможно, завершая буфер нулевым символом, и успешно завершаются.

Усечение строки меняет возвращаемые значения соответствующих функций.


Следующие функции возвращают 0, если усечение не происходит, или STRUNCATE ,
если усечение происходит.
strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

wcstombs_s, _wcstombs_s_l

mbstowcs_s, _mbstowcs_s_l

Следующие функции возвращают количество скопированных символов, если


усечение не происходит, или -1, если усечение происходит (соответствует
поведению исходных snprintf функций):

_snprintf_s, _snprintf_s_l, _snwprintf_s, _snwprintf_s_l

vsnprintf_s, _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, _vsnwprintf_s_l

Пример
C

// crt_truncate.c

#include <stdlib.h>

#include <errno.h>

int main()

char src[] = "1234567890";

char dst[5];

errno_t err = strncpy_s(dst, _countof(dst), src, _TRUNCATE);

if ( err == STRUNCATE )

printf( "truncation occurred!\n" );

printf( "'%s'\n", dst );

Output

truncation occurred!

'1234'

См. также раздел


Глобальные константы
TZNAME_MAX
Статья • 03.04.2023

Устарело. Максимально допустимая длина строки переменной названия часового


пояса. Этот макрос был определен в <limits.h> в Visual Studio 2012 и более ранних
версиях. Он не определен в Visual Studio 2013 и более поздних версиях. Чтобы
получить длину, необходимую для хранения текущего имени часового пояса,
используйте _get_tzname.

Синтаксис
C

#include <limits.h>

См. также раздел


Константы среды

Глобальные константы

_get_tzname
_WAIT_CHILD , _WAIT_GRANDCHILD
Статья • 03.04.2023

Синтаксис
C

#include <process.h>

Remarks
Функция _cwait может использоваться любым процессом для ожидания любого
другого процесса (если известен его идентификатор). Аргумент действия может
принимать одно из следующих значений:

Константа Значение

_WAIT_CHILD Вызывающий процесс ожидает завершения указанного нового процесса.

_WAIT_GRANDCHILD Вызывающий процесс ожидает завершения указанного нового процесса


и всех процессов, созданных этим новым процессом.

См. также раздел


_cwait

Глобальные константы
WCHAR_MAX
Статья • 03.04.2023

Максимальное значение для типа wchar_t .

Синтаксис
C

#include <wchar.h>

См. также раздел


Глобальные константы
WCHAR_MIN
Статья • 03.04.2023

Минимальное значение для типа wchar_t .

Синтаксис
C

#include <wchar.h>

См. также раздел


Глобальные константы
Универсальные текстовые
сопоставления
Статья • 03.04.2023

Чтобы упростить написание кода для международной аудитории, в файле TCHAR.H


определены следующие универсальные текстовые сопоставления:

Типы данных

Константы и глобальные переменные

Сопоставления подпрограмм

Дополнительные сведения см. в разделе "Использование универсальных текстовых


сопоставлений". Универсальные текстовые сопоставления — это расширения
Майкрософт, несовместимые с ANSI.

См. также раздел


Сопоставления типов данных

Пример программы, использующей обычный текст


Сопоставление типов данных
Статья • 03.04.2023

Сопоставления типов данных определяются в TCHAR.H и зависят от того,


определена ли в вашей программе константа _UNICODE или _MBCS .

Дополнительные сведения см. в разделе Использование типов данных TCHAR.H с


кодом _MBCS.

Сопоставления типов данных универсального текста

Универсальный SBCS (_UNICODE,


_MBCS
_UNICODE

текст

_MBCS не
defined defined
имя типа
данных определен)

_TCHAR char char wchar_t

_tfinddata_t _finddata_t _finddata_t _wfinddata_t

_tfinddata64_t __finddata64_t __finddata64_t _wfinddata64_t

_tfinddatai64_t _finddatai64_t _finddatai64_t _wfinddatai64_t

_TINT int int wint_t

_TSCHAR signed char signed char wchar_t

_TUCHAR unsigned char unsigned char wchar_t

_TXCHAR char unsigned char wchar_t

_T или _TEXT Не действует Не действует L (преобразует следующий


(удаляется (удаляется символ или строку в аналог в
препроцессором) препроцессором) Юникоде)

См. также раздел


Универсальные текстовые сопоставления

Сопоставления констант и глобальных переменных

Сопоставления подпрограмм

Пример программы, использующей обычный текст

Использование универсальных текстовых сопоставлений


Сопоставления констант и глобальных
переменных
Статья • 03.04.2023

Сопоставления универсальных текстовых констант, глобальных переменных и


стандартных типов определяются в TCHAR.H и зависят от того, определена ли в
вашей программе константа _UNICODE или _MBCS .

Сопоставления универсальных текстовых констант и


глобальных переменных

Универсальный текст - SBCS ( _UNICODE не _MBCS _MBCS _UNICODE


имя объекта определено) Определенные Определенные

_TEOF EOF EOF WEOF

_tenviron _environ _environ _wenviron

_tpgmptr _pgmptr _pgmptr _wpgmptr

См. также раздел


Универсальные текстовые сопоставления

Сопоставления типов данных

Сопоставления подпрограмм

Пример программы, использующей обычный текст

Использование универсальных текстовых сопоставлений


Сопоставления подпрограмм
Статья • 03.04.2023

Сопоставления универсальных текстовых подпрограмм определены в файле


TCHAR.H. _tccpy и _tclen сопоставляются с функциями в модели MBCS; они
сопоставляются с макросами или встроенными функциями в моделях SBCS и
Юникода для полноты. Сведения об универсальной текстовой процедуре см. в
справочной статье о соответствующей SBCS процедуре, связанной с -, _MBCS -или
_UNICODE ..

Более конкретные сведения об отдельных подпрограммах, перечисленных в левом


столбце в следующей таблице, недоступны в этой документации. Однако можно
легко найти сведения о соответствующей подпрограмме, связанной с SBCS , _MBCS
или _UNICODE . Выберите команду Поиск в меню Справка для поиска любой
универсальной текстовой подпрограммы, указанной ниже.

Дополнительные сведения см. в разделе Сопоставления универсального текста в


tchar.h.

Сопоставления подпрограмм с универсальным


текстом

Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE


текстовой определены) Определенные Определенные
подпрограммы

_cgetts _cgets _cgets _cgetws

_cgetts_s _cgets_s _cgets_s _cgetws_s

_cputts _cputs _cputs _cputws

_fgettc fgetc fgetc fgetwc

_fgettchar _fgetchar _fgetchar _fgetwchar

_fgetts fgets fgets fgetws

_fputtc fputc fputc fputwc

_fputtchar _fputchar _fputchar _fputwchar

_fputts fputs fputs fputws


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_ftprintf fprintf fprintf fwprintf

_ftprintf_s fprintf_s fprintf_s fwprintf_s

_ftscanf fscanf fscanf fwscanf

_ftscanf_s fscanf_s fscanf_s fwscanf_s

_gettc getc getc getwc

_gettch _getch _getch _getwch

_gettchar getchar getchar getwchar

_gettche _getche _getche _getwche

_getts gets gets getws

_getts_s gets_s gets_s getws_s

_istalnum isalnum _ismbcalnum iswalnum

_istalpha isalpha _ismbcalpha iswalpha

_istascii isascii isascii iswascii

_istcntrl iscntrl iscntrl iswcntrl

_istdigit isdigit _ismbcdigit iswdigit

_istgraph isgraph _ismbcgraph iswgraph

_istlead Всегда возвращает _ismbblead Всегда возвращает


значение false значение false

_istleadbyte Всегда возвращает isleadbyte Всегда возвращает


значение false значение false

_istlegal Всегда возвращает _ismbclegal Всегда возвращает


значение true значение true

_istlower islower _ismbclower iswlower

_istprint isprint _ismbcprint iswprint

_istpunct ispunct _ismbcpunct iswpunct

_istspace isspace _ismbcspace iswspace


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_istupper isupper _ismbcupper iswupper

_istxdigit isxdigit isxdigit iswxdigit

_itot _itoa _itoa _itow

_itot_s _itoa_s _itoa_s _itow_s

_ltot _ltoa _ltoa _ltow

_ltot_s _ltoa_s _ltoa_s _ltow_s

_puttc putc putc putwc

_puttch _putch _putch _putwch

_puttchar putchar putchar putwchar

_putts puts puts _putws

_sctprintf _scprintf _scprintf _scwprintf

_sntprintf _snprintf _snprintf _snwprintf

_sntprintf_s _snprintf_s _snprintf_s _snwprintf_s

_sntscanf _snscanf _snscanf _snwscanf

_sntscanf_s _snscanf_s _snscanf_s _snwscanf_s

_stprintf sprintf sprintf swprintf

_stprintf_s sprintf_s sprintf_s swprintf_s

_stscanf sscanf sscanf swscanf

_stscanf_s sscanf_s sscanf_s swscanf_s

_taccess _access _access _waccess

_taccess_s _access_s _access_s _waccess_s

_tasctime asctime asctime _wasctime

_tasctime_s asctime_s asctime_s _wasctime_s


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tccmp Сопоставляется макросу _mbsncmp Сопоставляется


или встраиваемой макросу или
функции встраиваемой
функции

_tccpy Сопоставляется макросу _mbccpy Сопоставляется


или встраиваемой макросу или
функции встраиваемой
функции

_tccpy_s strcpy_s _mbccpy_s wcscpy_s

_tchdir _chdir _chdir _wchdir

_tclen Сопоставляется макросу _mbclen Сопоставляется


или встраиваемой макросу или
функции встраиваемой
функции

_tchmod _chmod _chmod _wchmod

_tcprintf _cprintf _cprintf _cwprintf

_tcprintf_s _cprintf_s _cprintf_s _cwprintf_s

_tcreat _creat _creat _wcreat

_tcscanf _cscanf _cscanf _cwscanf

_tcscanf_s _cscanf_s _cscanf_s _cwscanf_s

_tcscat strcat _mbscat wcscat

_tcscat_s strcat_s _mbscat_s wcscat_s

_tcschr strchr _mbschr wcschr

_tcsclen strlen _mbslen wcslen

_tcsclen_s strlen_s _mbslen_s wcslen_s

_tcscmp strcmp _mbscmp wcscmp

_tcscoll strcoll _mbscoll wcscoll

_tcscpy strcpy _mbscpy wcscpy

_tcscpy_s strcpy_s _mbscpy_s wcscpy_s


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tcscspn strcspn _mbscspn wcscspn

_tcsdec _strdec _mbsdec _wcsdec

_tcsdup _strdup _mbsdup _wcsdup

_tcserror strerror strerror _wcserror

_tcserror_s strerror_s strerror_s _wcserror_s

_tcsftime strftime strftime wcsftime

_tcsicmp _stricmp _mbsicmp _wcsicmp

_tcsicoll _stricoll _mbsicoll _wcsicoll

_tcsinc _strinc _mbsinc _wcsinc

_tcslen strlen strlen wcslen

_tcslwr _strlwr _mbslwr _wcslwr

_tcslwr_s _strlwr_s _mbslwr_s _wcslwr_s

_tcsnbcnt _strncnt _mbsnbcnt _wcsncnt

_tcsncat strncat _mbsnbcat wcsncat

_tcsncat_s strncat_s _mbsnbcat_s wcsncat_s

_tcsnccat strncat _mbsncat wcsncat

_tcsnccmp strncmp _mbsncmp wcsncmp

_tcsnccmp_s strncmp_s _mbsncmp_s wcsncmp_s

_tcsnccoll _strncoll _mbsncoll _wcsncoll

_tcsncmp strncmp _mbsnbcmp wcsncmp

_tcsnccnt _strncnt _mbsnccnt _wcsncnt

_tcsnccpy strncpy _mbsncpy wcsncpy

_tcsnccpy_s strncpy_s _mbsncpy_s wcsncpy_s

_tcsncicmp _strnicmp _mbsnicmp _wcsnicmp


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tcsncicoll _strnicoll _mbsnicoll _wcsnicoll

_tcsncpy strncpy _mbsnbcpy wcsncpy

_tcsncpy_s strncpy_s _mbsnbcpy_s wcsncpy_s

_tcsncset _strnset _mbsnset _wcsnset

_tcsnextc _strnextc _mbsnextc _wcsnextc

_tcsnicmp _strnicmp _mbsnbicmp _wcsnicmp

_tcsnicoll _strnicoll _mbsnbicoll _wcsnicoll

_tcsninc _strninc _mbsninc _wcsninc

_tcsnccnt _strncnt _mbsnccnt _wcsncnt

_tcsnset _strnset _mbsnbset _wcsnset

_tcspbrk strpbrk _mbspbrk wcspbrk

_tcsspnp _strspnp _mbsspnp _wcsspnp

_tcsrchr strrchr _mbsrchr wcsrchr

_tcsrev _strrev _mbsrev _wcsrev

_tcsset _strset _mbsset _wcsset

_tcsspn strspn _mbsspn wcsspn

_tcsstr strstr _mbsstr wcsstr

_tcstod strtod strtod wcstod

_tcstoi64 _strtoi64 _strtoi64 _wcstoi64

_tcstok strtok _mbstok wcstok

_tcstok_s strtok_s _mbstok_s wcstok_s

_tcstol strtol strtol wcstol

_tcstoui64 _strtoui64 _strtoui64 _wcstoui64

_tcstoul strtoul strtoul wcstoul


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tcsupr _strupr _mbsupr _wcsupr

_tcsupr_s _strupr_s _mbsupr_s _wcsupr_s

_tcsxfrm strxfrm strxfrm wcsxfrm

_tctime ctime ctime _wctime

_tctime_s ctime_s ctime_s _wctime_s

_tctime32 _ctime32 _ctime32 _wctime32

_tctime32_s _ctime32_s _ctime32_s _wctime32_s

_tctime64 _ctime64 _ctime64 _wctime64

_tctime64_s _ctime64_s _ctime64_s _wctime64_s

_texecl _execl _execl _wexecl

_texecle _execle _execle _wexecle

_texeclp _execlp _execlp _wexeclp

_texeclpe _execlpe _execlpe _wexeclpe

_texecv _execv _execv _wexecv

_texecve _execve _execve _wexecve

_texecvp _execvp _execvp _wexecvp

_texecvpe _execvpe _execvpe _wexecvpe

_tfdopen _fdopen _fdopen _wfdopen

_tfindfirst _findfirst _findfirst _wfindfirst

_tfindnext _findnext _findnext _wfindnext

_tfindnext32 _findnext32 _findnext32 _wfindnext32

_tfindnext64 _findnext64 _findnext64 _wfindnext64

_tfindnexti64 _findnexti64 _findnexti64 _wfindnexti64

_tfindnexti6432 _findnexti6432 _findnexti6432 _wfindnexti6432


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tfindnext32i64 _findnext32i64 _findnext32i64 _wfindnext32i64

_tfopen fopen fopen _wfopen

_tfopen_s fopen_s fopen_s _wfopen_s

_tfreopen freopen freopen _wfreopen

_tfreopen_s freopen_s freopen_s _wfreopen_s

_tfsopen _fsopen _fsopen _wfsopen

_tfullpath _fullpath _fullpath _wfullpath

_tgetcwd _getcwd _getcwd _wgetcwd

_tgetdcwd _getdcwd _getdcwd _wgetdcwd

_tgetenv getenv getenv _wgetenv

_tgetenv_s getenv_s getenv_s _wgetenv_s

_tmain main main wmain

_tmakepath _makepath _makepath _wmakepath

_tmakepath_s _makepath_s _makepath_s _wmakepath_s

_tmkdir _mkdir _mkdir _wmkdir

_tmktemp _mktemp _mktemp _wmktemp

_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

_topen _open _open _wopen

_topen_s _open_s _open_s _wopen_s

_totlower tolower _mbctolower towlower

_totupper toupper _mbctoupper towupper

_tperror perror perror _wperror

_tpopen _popen _popen _wpopen

_tprintf printf printf wprintf


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tprintf_s printf_s printf_s wprintf_s

_tputenv _putenv _putenv _wputenv

_tputenv_s _putenv_s _putenv_s _wputenv_s

_tremove remove remove _wremove

_trename rename rename _wrename

_trmdir _rmdir _rmdir _wrmdir

_tsearchenv _searchenv _searchenv _wsearchenv

_tsearchenv_s _searchenv_s _searchenv_s _wsearchenv_s

_tscanf scanf scanf wscanf

_tscanf_s scanf_s scanf_s wscanf_s

_tsetlocale setlocale setlocale _wsetlocale

_tsopen _sopen _sopen _wsopen

_tsopen_s _sopen_s _sopen_s _wsopen_s

_tspawnl _spawnl _spawnl _wspawnl

_tspawnle _spawnle _spawnle _wspawnle

_tspawnlp _spawnlp _spawnlp _wspawnlp

_tspawnlpe _spawnlpe _spawnlpe _wspawnlpe

_tspawnv _spawnv _spawnv _wspawnv

_tspawnve _spawnve _spawnve _wspawnve

_tspawnvp _spawnvp _spawnvp _wspawnvp

_tspawnvpe _spawnvpe _spawnvpe _wspawnvpe

_tsplitpath _splitpath _splitpath _wsplitpath

_tstat _stat _stat _wstat

_tstat32 _stat32 _stat32 _wstat32


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_tstati32 _stati32 _stati32 _wstati32

_tstat64 _stat64 _stat64 _wstat64

_tstati64 _stati64 _stati64 _wstati64

_tstof atof atof _wtof

_tstoi atoi atoi _wtoi

_tstoi64 _atoi64 _atoi64 _wtoi64

_tstol atol atol _wtol

_tstrdate _strdate _strdate _wstrdate

_tstrdate_s _strdate_s _strdate_s _wstrdate_s

_tstrtime _strtime _strtime _wstrtime

_tstrtime_s _strtime_s _strtime_s _wstrtime_s

_tsystem system system _wsystem

_ttempnam _tempnam _tempnam _wtempnam

_ttmpnam tmpnam tmpnam _wtmpnam

_ttmpnam_s tmpnam_s tmpnam_s _wtmpnam_s

_ttoi atoi atoi _wtoi

_ttoi64 _atoi64 _atoi64 _wtoi64

_ttol atol atol _wtol

_tunlink _unlink _unlink _wunlink

_tutime _utime _utime _wutime

_tutime32 _utime32 _utime32 _wutime32

_tutime64 _utime64 _utime64 _wutime64

_tWinMain WinMain WinMain wWinMain

_ui64tot _ui64toa _ui64toa _ui64tow


Имя универсальной SBCS ( _UNICODE и MBCS не _MBCS _UNICODE
текстовой определены) Определенные Определенные
подпрограммы

_ui64tot_s _ui64toa_s _ui64toa_s _ui64tow_s

_ultot _ultoa _ultoa _ultow

_ultot_s _ultoa_s _ultoa_s _ultow_s

_ungettc ungetc ungetc ungetwc

_ungettch _ungetch _ungetch _ungetwch

_vftprintf vfprintf vfprintf vfwprintf

_vftprintf_s vfprintf_s vfprintf_s vfwprintf_S

_vsctprintf _vscprintf _vscprintf _vscwprintf

_vsctprintf_s _vscprintf_s _vscprintf_s _vscwprintf_S

_vsntprintf _vsnprintf _vsnprintf _vsnwprintf

_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s

_vstprintf vsprintf vsprintf vswprintf

_vstprintf_s vsprintf_s vsprintf_s vswprintf_s

_vtprintf vprintf vprintf vwprintf

_vtprintf_s vprintf_s vprintf_s vwprintf_s

См. также раздел


Универсальные текстовые сопоставления

Сопоставления типов данных

Сопоставления констант и глобальных переменных

Пример программы, использующей обычный текст

Использование универсальных текстовых сопоставлений


UCRT: сведения о строках имени
языкового стандарта, языка, а также
страны или региона
Статья • 03.04.2023

Аргумент может быть задан locale setlocaleкак , _wsetlocale_create_localeи


_wcreate_locale функции несколькими способами. Языковой стандарт можно задать
с помощью имен языкового стандарта, языков, кодов стран и регионов и кодовых
страниц, поддерживаемых API NLS Windows. Аргумент locale принимает одну из
следующих форм:

locale :: "locale-name"

 | "language[_country-region[. code-page]"

 | ". кодовая страница"

 | "C"

 | ""

 | NULL

Параметр locale-name представлен в формате короткой строки стандарта IETF,


например en-US для английского языка (США) или bs-Cyrl-BA для боснийского
(кириллица, Босния и Герцеговина). Такой формат является предпочтительным.
Список поддерживаемых имен языковых стандартов для версий операционной
системы Windows см. в столбце Тег языка таблицы, которая приведена в
приложении A (поведение продукта) справочника по коду языка Windows. Этот
список ресурсов включает в себя поддерживаемый язык, скрипт и региональные
части имен языковых стандартов. Сведения о поддерживаемых именах языкового
стандарта, у которых нет заказов сортировки по умолчанию, см. в столбце "Имя
языкового стандарта" в идентификаторах порядка сортировки. В версии Windows
10 или более поздней допускаются имена языкового стандарта, соответствующие
допустимым тегам языка BCP-47 . Например, jp-US это допустимый тег BCP-47, но
он фактически предназначен только US для функциональных возможностей
языкового стандарта.

Язык[_country-region[.кодовая страница]] форма хранится в параметре языкового


стандарта для категории, если для создания языкового стандарта используется
строка языка или строка языка и страна или строка региона. Набор
поддерживаемых строк языка описан в строках языка, а список поддерживаемых
строк страны и региона указан в строках страны или региона. Если указанный язык
не связан с указанной страной или регионом, язык по умолчанию для указанной
страны или региона хранится в параметре языкового стандарта. Мы не
рекомендуем использовать эту форму для строк языкового стандарта, внедренных
в код или сериализованных в хранилище: эти строки, скорее всего, будут изменены
обновлением операционной системы, чем форма имени языкового стандарта.

Кодовой страницей (code-page) является кодовая страница ANSI/OEM, связанная с


этим языковым стандартом. Кодовая страница определяется автоматически при
указании языкового стандарта с помощью языка или с помощью языка и страны
или региона по отдельности. Особое значение .ACP определяет кодовую страницу
ANSI для страны или региона. Особое значение .OCP определяет кодовую страницу
OEM для страны или региона. Например, если указать "Greek_Greece.ACP" языковой
стандарт, языковой стандарт сохраняется как Greek_Greece.1253 (кодовая страница
ANSI для греческого языка), а если указан "Greek_Greece.OCP" языковой стандарт, он
хранится как Greek_Greece.737 (кодовая страница OEM для греческого языка).
Дополнительные сведения о кодовой странице см. в разделе "Кодовая страница".
Список поддерживаемых кодовых страниц в Windows см. в разделе
идентификаторы кодовой страницы.

Если для указания языкового стандарта используется только кодовая страница,


используется язык пользователя по умолчанию и страна или регион, как
сообщается GetUserDefaultLocaleName . Например, если указать ".1254" (ANSI —
турецкий) как языковой стандарт пользователя, который настроен на
использование английского (США), сохранится языковой стандарт English_United
States.1254 . Мы не рекомендуем эту форму, так как это может привести к

несогласованности поведения.

Значение locale аргумента C указывает минимальную среду, соответствующую


ANSI для перевода C. Языковой стандарт C предполагает, что все типы данных
char соответствуют 1 байту, а их значение всегда меньше 256. Если locale

указывает на пустую строку, языковой стандарт соответствует исходной среде,


определенной реализацией.

Можно указать все категории языкового стандарта одновременно для функций


setlocale и _wsetlocale с помощью категории LC_ALL . Всем категориям можно
задать тот же языковой стандарт, также можно задать каждую категорию по
отдельности с помощью аргумента языкового стандарта, имеющего следующую
форму:

LC-ALL-specifier :: locale

 | [ LC_COLLATE= locale ][ ;LC_CTYPE= locale ][ ;LC_MONETARY= locale ]


[ ;LC_NUMERIC= locale ][ ;LC_TIME= locale ]

Можно задать несколько типов категорий с разделением точкой с запятой. Типы


категорий, которые не указаны, используют текущий параметр языкового
стандарта. Например, этот фрагмент кода задает текущий языковой стандарт для
всех категорий de-DE , а затем задает категории LC_MONETARY для en-GB и LC_TIME
для es-ES :

_wsetlocale(LC_ALL, L"de-DE");

_wsetlocale(LC_ALL, L"LC_MONETARY=en-GB;LC_TIME=es-ES");

Поддержка UTF-8
Поддержка UTF-8 может быть включена с помощью кодовой страницы UTF-8 в
строке языкового стандарта. Дополнительные сведения см. в разделе поддержки
setlocaleUTF-8 .

См. также раздел


Справочник по библиотеке времени выполнения C

_get_current_locale

setlocale, _wsetlocale

_create_locale, _wcreate_locale

Строки языка

Строки страны или региона


Строки языка
Статья • 03.04.2023

_create_locale Функции setlocale могут использовать поддерживаемые языки API


NLS Для Windows в операционных системах, которые не используют кодовую
страницу Юникода. Список поддерживаемых языков для версий операционной
системы см. в приложении A (поведение продукта) в справочнике по коду языка
Windows. Строка языка может принимать любое из значений, перечисленных в
столбцах Язык и Тег языка списка поддерживаемых языков. Пример кода,
перечисляющего доступные имена языкового стандарта и связанные значения, см.
в статье NLS: Пример API на основе имен.

Поддерживаемые языковые строки


Реализация библиотеки времени выполнения C от Майкрософт также
поддерживает эти строки языка:

Строка языка Соответствующее название языкового стандарта

american en-US

american english en-US

american-english en-US

australian en-AU

belgian nl-BE

canadian en-CA

chh zh-HK

chi zh-SG

chinese zh

chinese-hongkong zh-HK

chinese-simplified zh-CN

chinese-singapore zh-SG

chinese-traditional zh-TW

dutch-belgian nl-BE
Строка языка Соответствующее название языкового стандарта

english-american en-US

english-aus en-AU

english-belize en-BZ

english-can en-CA

english-caribbean en-029

english-ire en-IE

english-jamaica en-JM

english-nz en-NZ

english-south africa en-ZA

english-trinidad y tobago en-TT

english-uk en-GB

english-us en-US

english-usa en-US

french-belgian fr-BE

french-canadian fr-CA

french-luxembourg fr-LU

french-swiss fr-CH

german-austrian de-AT

german-lichtenstein de-LI

german-luxembourg de-LU

german-swiss de-CH

irish-english en-IE

italian-swiss it-CH

norwegian no

norwegian-bokmal nb-NO
Строка языка Соответствующее название языкового стандарта

norwegian-nynorsk nn-NO

portuguese-brazilian pt-BR

spanish-argentina es-AR

spanish-bolivia es-BO

spanish-chile es-CL

spanish-colombia es-CO

spanish-costa rica es-CR

spanish-dominican republic es-DO

spanish-ecuador es-EC

spanish-el salvador es-SV

spanish-guatemala es-GT

spanish-honduras es-HN

spanish-mexican es-MX

spanish-modern es-ES

spanish-nicaragua es-NI

spanish-panama es-PA

spanish-paraguay es-PY

spanish-peru es-PE

spanish-puerto rico es-PR

spanish-uruguay es-UY

spanish-venezuela es-VE

swedish-finland sv-FI

swiss de-CH

uk en-GB

us en-US
Строка языка Соответствующее название языкового стандарта

usa en-US

См. также раздел


Строки языков, языков и стран и регионов\
Строки страны или региона\
setlocale, _wsetlocale\
_create_locale, _wcreate_locale
Строки страны или региона
Статья • 03.04.2023

Строки страны и региона можно объединять со строкой с названием языка для


создания спецификации языкового стандарта для функций setlocale , _wsetlocale ,
_create_locale и _wcreate_locale .

Список названий стран и регионов, поддерживаемых разными версиями


операционной системы Windows, см. в столбцах Язык, Расположение и Тег языка
таблицы, которая приведена в приложении A (поведение продуктов) справочника
по коду языка Windows. Пример кода для перечисления имен доступных языковых
стандартов и связанных значений см. в руководстве по многоязыковой поддержке
с примером API на основе имени.

Другие поддерживаемые строки страны и


региона
Реализация библиотеки времени выполнения Microsoft C также поддерживает
следующие строки страны или региона и сокращения:

Строка страны или Сокращение Соответствующее название языкового


региона стандарта

america USA en-US

britain GBR en-GB

china CHN zh-CN

czech CZE cs-CZ

england GBR en-GB

great britain GBR en-GB

holland NLD nl-NL

hong-kong HKG zh-HK

new-zealand NZL en-NZ

nz NZL en-NZ

pr china CHN zh-CN


Строка страны или Сокращение Соответствующее название языкового
региона стандарта

pr-china CHN zh-CN

puerto-rico PRI es-PR

slovak SVK sk-SK

south africa ZAF af-ZA

south korea KOR ko-KR

south-africa ZAF af-ZA

south-korea KOR ko-KR

trinidad & tobago TTO en-TT

uk GBR en-GB

united-kingdom GBR en-GB

united-states USA en-US

us USA en-US

См. также раздел


Строки языков, языков и стран и регионов

Строки языка

setlocale, _wsetlocale

_create_locale, _wcreate_locale
Общие сведения о семействе
функций
Статья • 03.04.2023

В этом разделе перечислены подпрограммы библиотеки среды выполнения C по


семейству функций.

Семейства подпрограмм библиотек CRT


_exec, _wexec

Функции для загрузки и выполнения нового процесса.

Функции поиска имени файла

Функции для поиска указанных имен файлов и закрытия поиска.

Синтаксис спецификации форматирования для printf и wprintf

Описывает строку формата и аргументы для printf и wprintf .

Форматирование символов поля спецификации: scanf и wscanf

Описывает поля спецификации формата для синтаксического анализа входного


потока для всего scanf семейства функций.

is, isw функции

Функции для тестирования символов на предмет того, являются ли они


прописными буквами, ASCII, числовыми, знаками препинания и т. д.

Функции _ismbb

Функции для тестирования целочисленного значения для того, представляет ли он


альфа-символ, пустой символ, символ печати и т. д.

Функции _ismbc
Функции для проверки многобайтового символа на наличие альфа-символа,
пустого символа, печатного символа и т. д.

operator delete (CRT)

Начиная с Visual Studio 2013, универсальная среда выполнения C (UCRT) больше не


поддерживает функцию удаления оператора C++. Теперь она входит в
стандартную библиотеку C++.

operator new (CRT)

Начиная с Visual Studio 2013, универсальная среда выполнения C (UCRT) больше не


поддерживает новую функцию оператора C++. Теперь она входит в стандартную
библиотеку C++.

printf функции позиционных параметров

Позиционные параметры задаются номером аргумента для замены в поле в строке


формата.

scanf Символы полей типа

Символ типа определяет, интерпретируется ли связанный аргумент как символ,


строка или число для любого семейства scanf функций, включая безопасные
версии. scanf_s

scanf спецификация ширины

Поле ширины — это положительное десятичное целое число, определяющее


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

Функции _spawn, _wspawn

Функции для создания и выполнения нового процесса.

Функции strcoll

wcscoll Функции strcoll сравнивают две строки в соответствии с параметром


LC_COLLATE категории кодовой страницы языкового стандарта.

Функции преобразования строк в числовые значения

Семейство strtod функций преобразует строку, завершаемую значением NULL, в


числовое значение.

Функции vprintf

Функции vprintf принимают указатель на список аргументов, форматируйте его и


записывает результат в указанное место назначения. Функции различаются
несколькими способами: выполнена проверка параметров; принимает ли они
широкие или однобайтовые символьные строки; назначение выходных данных; и
поддержка указания порядка, в котором параметры используются в строке
формата.

См. также раздел


Справочник по библиотеке среды выполнения C
_exec Функции , _wexec
Статья • 03.04.2023

Каждая функция в этом семействе загружает и выполняет новый процесс.

_execl, _wexecl

_execv, _wexecv

_execle, _wexecle

_execve, _wexecve

_execlp, _wexeclp

_execvp, _wexecvp

_execlpe, _wexeclpe

_execvpe, _wexecvpe

Буква в конце имени функции определяет вариацию.

_exec Описание
суффикс
функции

e envp , массив указателей на параметры среды, передается в новый процесс.

l Аргументы командной строки передаются по отдельности в функцию _exec .


Обычно используется, когда число параметров нового процесса известно
заранее.

p Переменная среды PATH используется для поиска файла для выполнения.

v argv , массив указателей на аргументы командной строки, передается в _exec .


Обычно используется, когда число параметров нового процесса непостоянно.

Комментарии
Каждая функция _exec загружает и выполняет новый процесс. Все _exec функции
используют одну и ту же функцию операционной системы (CreateProcess). Функции
_exec автоматически обрабатывают аргументы строки многобайтовых символов
соответствующим образом, распознавая последовательности многобайтовых
символов согласно многобайтовой кодовой странице, используемой в данный
момент. Функции _wexec — это версии функций _exec с расширенными
символами. Функции _wexec ведут себя идентично своим _exec семейным
аналогам, за исключением того, что они не обрабатывают многобайтовые строки
символов.

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_texecl _execl _execl _wexecl

_texecle _execle _execle _wexecle

_texeclp _execlp _execlp _wexeclp

_texeclpe _execlpe _execlpe _wexeclpe

_texecv _execv _execv _wexecv

_texecve _execve _execve _wexecve

_texecvp _execvp _execvp _wexecvp

_texecvpe _execvpe _execvpe _wexecvpe

Параметр cmdname указывает файл, который будет выполняться как новый процесс.
Он может указывать полный путь (от корневого каталога), частичный путь (от
текущего рабочего каталога) или имя файла. Если cmdname не имеет расширения
имени файла или не заканчивается точкой (.), _exec функция выполняет поиск
именованного файла. Если поиск не дает результатов, функция пытается найти то
же основное имя с расширением COM, а затем с расширениями EXE, BAT и CMD.
Если параметр cmdname включает расширение файла, для поиска используется
только это расширение. Если cmdname заканчивается точкой, функция _exec
выполняет поиск cmdname без расширения файла. _execlp , _execlpe , _execvp и
_execvpe выполняют поиск cmdname (используя те же процедуры) в каталогах,

указанных переменной среды PATH . Если cmdname содержит описатель диска или
косую черту (то есть относительный путь), _exec вызов выполняет поиск только
указанного файла; путь не выполняется.

Параметры передаются в новый процесс путем предоставления одного или


нескольких указателей на строки символов как параметров в вызове _exec . Эти
строки символов формируют список параметров для нового процесса. Общая
длина наследуемых параметров среды и строк, формирующих список параметров
для нового процесса, не должна превышать 32 КБ. Завершающий NULL символ ( \0 )
для каждой строки не включается в число, но учитываются пробелы (вставляемые
автоматически для разделения параметров).

7 Примечание

Пробелы, встроенные в строки, могут вызывать непредвиденное поведение.


Например, если передать в функцию _exec строку "hi there" , это приведет к
тому, что новый процесс получит два аргумента: "hi" и "there" . Если
предполагалось, что новый процесс должен открыть файл с именем hi there,
произойдет сбой процесса. Этого можно избежать, заключив строку в
кавычки: "\"hi there\"" .

) Важно!

Не передавайте данные, вводимые пользователем, в функцию _exec , не


выбрав это содержимое явно. _exec приведет к вызову CreateProcess ,
поэтому помните, что непроверенные имена путей могут привести к
потенциальным уязвимостям системы безопасности.

Эти функции _exec проверяют свои параметры. Если ожидаемые параметры


являются пустыми указателями, пустыми строками или опущены, функции
вызывают обработчик недопустимых параметров, _exec как описано в разделе
Проверка параметров. Если продолжение выполнения разрешено, эти функции
устанавливают для errno значение EINVAL и возвращают -1. Новые процессы не
выполняются.

Указатели аргументов могут передаваться как отдельные параметры (в _execl ,


_execle , _execlp и _execlpe ) или как массивы указателей (в _execv , _execve ,

_execvp и _execvpe ). По крайней мере один параметр , arg0 должен быть передан в

новый процесс; этот параметр относится argv[0] к новому процессу. Обычно этот
параметр является копией cmdname (Другое значение не приводит к ошибке.)

Вызовы функций _execl , _execle , _execlp и _execlpe обычно используются, когда


число параметров известно заранее. Параметр arg0 , как правило, является
указателем на cmdname . Параметры с arg1 по argn указывают на строку символов,
формирующую новый список параметров. За параметром argn должен следовать
пустой указатель, отмечающий конец списка параметров.
Функции _execv , _execve , _execvp и _execvpe можно вызывать, когда число
параметров в новом процессе не определено. Указатели на параметры передаются
как массив, argv . Параметр argv[0] , как правило, является указателем на cmdname .
Параметры с argv[1] по argv[n] указывают на строку символов, формирующую
новый список параметров. Параметр argv[n+1] должен быть указателем NULL для
пометки конца списка параметров.

Файлы, открытые во время вызова функции _exec , остаются открытыми в новом


процессе. В вызовах _execl , _execlp , _execv и _execvp новый процесс наследует
среду вызывающего процесса. Вызовы функций _execle , _execlpe , _execve и
_execvpe изменяют среду для нового процесса, передавая список параметров

среды с помощью параметра envp . envp — это массив указателей символов,


каждый элемент которого (за исключением последнего) указывает на строку,
завершающуюся символом null, определенную в переменной среды. Такие строки
обычно имеют вид NAME=value , где NAME  — это имя переменной среды, а value  —
строковое значение, задаваемое для данной переменной. (Не value заключен в
двойные кавычки.) Последним элементом массива envp должен быть NULL . Если же
значение самого параметра envp — NULL , новый процесс наследует параметры
среды вызывающего процесса.

Программа, выполняемая с одной из _exec функций, всегда загружается в память,


как если бы для поля максимального выделения в заголовке файла .exe программы
было задано значение 0xFFFFH по умолчанию .

Вызовы _exec не сохраняют режимы преобразования открытых файлов. Если


новый процесс должен использовать файлы, унаследованные от вызывающего
процесса, используйте _setmode подпрограмму, чтобы задать для этих файлов
нужный режим преобразования. Перед вызовом функции fflush необходимо явно
сбросить (используя ключевое слово _flushall или _exec ) или закрыть все потоки.
Параметры сигнала не сохраняются в новых процессах, создаваемых вызовами
_exec подпрограмм. Сигнальные параметры сбрасываются до значений по

умолчанию в новом процессе.

Пример
C

// crt_args.c

// Illustrates the following variables used for accessing

// command-line arguments and environment variables:

// argc argv envp

// This program will be executed by crt_exec which follows.

#include <stdio.h>

int main( int argc, // Number of strings in array argv

char *argv[], // Array of command-line argument strings

char **envp ) // Array of environment variable strings

int count;

// Display each command-line argument.

printf( "\nCommand-line arguments:\n" );

for( count = 0; count < argc; count++ )

printf( " argv[%d] %s\n", count, argv[count] );

// Display each environment variable.

printf( "\nEnvironment variables:\n" );

while( *envp != NULL )

printf( " %s\n", *(envp++) );

return;

Запустите следующую программу, чтобы выполнить Crt_args.exe:

// crt_exec.c

// Illustrates the different versions of exec, including

// _execl _execle _execlp _execlpe

// _execv _execve _execvp _execvpe

//

// Although CRT_EXEC.C can exec any program, you can verify how

// different versions handle arguments and environment by

// compiling and specifying the sample program CRT_ARGS.C. See

// "_spawn, _wspawn Functions" for examples of the similar spawn

// functions.

#include <stdio.h>

#include <conio.h>

#include <process.h>

char *my_env[] = // Environment for exec?e

"THIS=environment will be",

"PASSED=to new process by",

"the EXEC=functions",

NULL

};

int main( int ac, char* av[] )

char *args[4];

int ch;

if( ac != 3 ){

fprintf( stderr, "Usage: %s <program> <number (1-8)>\n", av[0] );

return;

// Arguments for _execv?

args[0] = av[1];

args[1] = "exec??";

args[2] = "two";

args[3] = NULL;

switch( atoi( av[2] ) )

case 1:

_execl( av[1], av[1], "_execl", "two", NULL );

break;

case 2:

_execle( av[1], av[1], "_execle", "two", NULL, my_env );

break;

case 3:

_execlp( av[1], av[1], "_execlp", "two", NULL );

break;

case 4:

_execlpe( av[1], av[1], "_execlpe", "two", NULL, my_env );

break;

case 5:

_execv( av[1], args );

break;

case 6:

_execve( av[1], args, my_env );

break;

case 7:

_execvp( av[1], args );

break;

case 8:

_execvpe( av[1], args, my_env );

break;

default:

break;

// This point is reached only if exec fails.

printf( "\nProcess was not execed." );

exit( 0 );

Требования
Заголовка: process.h
См. также раздел
Управление процессами и средой

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
Функции поиска имени файла
Статья • 03.04.2023

Эти функции осуществляют и завершают поиск для указанных имен файлов:

_findnext, _wfindnext

_findfirst, _wfindfirst

_findclose

Комментарии
Функция _findfirst предоставляет сведения о первом экземпляре имени файла,
соответствующем файлу, указанному в аргументе filespec . В filespec можно
использовать любые комбинации подстановочных знаков, которые
поддерживаются операционной системой.

Функции возвращают сведения о файле в _finddata_t структуре, которая


определена в IO.h . Различные функции в данном семействе используют
множество вариантов структуры _finddata_t . Базовая структура _finddata_t
содержит следующие элементы:

unsigned attrib

Атрибут файла.

time_t time_create

Время создания файла ( -1L для файловых систем FAT). Это время хранится в
формате UTC. Для преобразования в местное время используйте функцию
localtime_s.

time_t time_access

Время последнего доступа к файлу ( -1L для файловых систем FAT). Это время
хранится в формате UTC. Для преобразования в местное время используйте
функцию localtime_s .

time_t time_write

Время последней записи в файл. Это время хранится в формате UTC. Для
преобразования в местное время используйте функцию localtime_s .
_fsize_t size

Длина файла в байтах.

char name [ _MAX_PATH ] NULL — имя совпадающего файла или каталога без пути.

В файловых системах, которые не поддерживают время создания и последнего


доступа к файлу, например в системе time_create FAT, поля и time_access всегда
-1L имеют значение .

_MAX_PATH определяется как Stdlib.h 260 байт.

Вы не можете указать целевые атрибуты (например, _A_RDONLY ), чтобы ограничить


операцию поиска. Эти атрибуты возвращаются в attrib поле _finddata_t
структуры и могут иметь следующие значения (определенные в IO.h ).
Пользователи не должны полагаться на то, что эти атрибуты будут единственными
возможными значениями для attrib поля.

_A_ARCH

Архив. Задается при каждом изменении файла и очистке с помощью BACKUP


команды . Значение: 0x20 .

_A_HIDDEN

Скрытый файл. Команда не часто встречается DIR , если вы не используете /AH


параметр . Возвращает сведения об обычных файлах и файлах, имеющих этот
атрибут. Значение: 0x02 .

_A_NORMAL

Нормальный. У файла не установлены никакие другие атрибуты, чтение и запись


возможны без ограничений. Значение: 0x00 .

_A_RDONLY

Только для чтения. Невозможно открыть файл для записи и создать файл с таким
же именем. Значение: 0x01 .

_A_SUBDIR

Подкаталог. Значение: 0x10 .

_A_SYSTEM

Системный файл. Обычно не отображается в команде DIR , если /A не


используется параметр или /A:S . Значение: 0x04 .

Функция _findnext находит следующее имя, если таковое имеется, которое


соответствует аргументу filespec , указанному в предыдущем вызове функции
_findfirst . Аргумент fileinfo должен указывать на структуру,

инициализированную предыдущим вызовом функции _findfirst . Если


обнаружено соответствие, содержимое структуры fileinfo изменяется, как
описано выше. В противном случае он остается без изменений. Функция _findclose
закрывает указанный дескриптор поиска и освобождает все связанные ресурсы
для функций _findfirst и _findnext . Дескриптор, возвращенный ранее функцией
_findfirst или _findnext , необходимо сначала передать в функцию _findclose ,
чтобы можно было выполнять операции изменения (например, удаление) в
каталогах, которые образуют переданные им пути.

Функции _find допускают вложение. Например, если вызов функции _findfirst


или _findnext нашел файл, являющийся подкаталогом, новый поиск можно начать
другим вызовом функции _findfirst или _findnext .

_wfindfirst и _wfindnext — это версии функций _findfirst и _findnext для

расширенных символов. Аргумент структуры версий расширенных символов имеет


_wfinddata_t тип данных, определенный в IO.h и в Wchar.h . Поля этого типа

данных совпадают с полями _finddata_t типа данных, за исключением того, что


поле _wfinddata_t name имеет тип wchar_t , а не тип char . В противном _wfindfirst
случае и _wfindnext ведут себя идентично и _findfirst . _findnext

Функции _findfirst и _findnext используют 64-разрядный тип времени. Если


необходимо использовать прежний 32-разрядный тип времени, можно определить
_USE_32BIT_TIME_T . Версии этих функций с суффиксом 32 в именах используют 32-
разрядный тип времени, а версии с суффиксом 64 — 64-разрядный тип времени.

Функции _findfirst32i64 , _findnext32i64 , _wfindfirst32i64 и _wfindnext32i64 также


ведут себя идентично версиям этих функций с 32-разрядным типом времени, за
исключением того, что они используют и возвращают 64-разрядные значения
длины файлов. Функции _findfirst64i32 , _findnext64i32 , _wfindfirst64i32 и
_wfindnext64i32 используют 64-разрядный тип времени, но 32-разрядные значения

длины файлов. Эти функции используют соответствующие варианты типа


_finddata_t , в которых поля имеют разные типы для времени и размера файла.

_finddata_t фактически представляет собой макрос, который преобразуется в

_finddata64i32_t (или _finddata32_t , если определена константа _USE_32BIT_TIME_T


). В следующей таблице приведены сводные сведения об этих вариантах
_finddata_t :

Структура Тип времени Тип размера файла


Структура Тип времени Тип размера файла

_finddata_t , _wfinddata_t __time64_t _fsize_t

_finddata32_t , _wfinddata32_t __time32_t _fsize_t

__finddata64_t , _wfinddata64_t __time64_t __int64

_finddata32i64_t , _wfinddata32i64_t __time32_t __int64

_finddata64i32_t , _wfinddata64i32_t __time64_t _fsize_t

_fsize_t представляет собой typedef для unsigned long (32 бита).

Пример
C

// crt_find.c

// This program uses the 32-bit _find functions to print

// a list of all files (and their attributes) with a .C extension

// in the current directory.

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

#include <time.h>

int main( void )

struct _finddata_t c_file;

intptr_t hFile;

// Find first .c file in current directory

if( (hFile = _findfirst( "*.c", &c_file )) == -1L )

printf( "No *.c files in current directory!\n" );

else

printf( "Listing of .c files\n\n" );

printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' );

printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' );

do {

char buffer[30];

printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " );

printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " );

printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " );

printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " );

ctime_s( buffer, _countof(buffer), &c_file.time_write );

printf( " %-12s %.24s %9ld\n",

c_file.name, buffer, c_file.size );

} while( _findnext( hFile, &c_file ) == 0 );

_findclose( hFile );

Output

Listing of .c files

RDO HID SYS ARC FILE DATE SIZE

--- --- --- --- ---- ---- ----

N N N Y blah.c Wed Feb 13 09:21:42 2002 1715

N N N Y test.c Wed Feb 06 14:30:44 2002 312

См. также раздел


Системные вызовы
Синтаксис спецификации формата:
printf и wprintf функции
Статья • 03.04.2023

Различные функции printf и wprintf принимают строку формата и


необязательные аргументы и создают форматированную последовательность
символов для выходных данных. Строка формата не содержит ни одной или
содержит несколько директив, которые являются либо литеральными символами
для выходных данных, либо закодированными спецификациями преобразования,
описывающими способ форматирования аргумента в выходных данных. Эта статья
описывает синтаксис для кодирования спецификаций преобразования в строке
формата. Список этих функций см. в разделе Потоковый ввод-вывод.

Спецификация преобразования состоит из необязательных и обязательных полей,


имеющих следующий вид:

%[flags][width][.precision][size]type

Каждое поле спецификации преобразования — это символ или число,


указывающее конкретный параметр формата или описатель преобразования.
Обязательное поле type определяет тип преобразования, которое применяется к
аргументу. Необязательные поля флагов, ширины и точности управляют другими
аспектами формата, такими как начальные пробелы или нули, обоснование и
отображаемая точность. Поле size указывает размер использованного и
преобразованного аргумента.

Базовая спецификация преобразования содержит только символ процента и


символ type. Например, %s определяет преобразование строк. Чтобы вывести
символ знака процента, используйте %% . Если за символом процента следует
символ, который не имеет смысла в поле формата, вызывается обработчик
недопустимого параметра. Дополнительные сведения см. в разделе Проверка
параметров.

) Важно!

Для обеспечения безопасности и стабильности убедитесь, что строки


спецификации преобразования формата не определены конечным
пользователем. Например, рассмотрим программу, которая предлагает
пользователю ввести имя и сохраняет введенные данные в строковой
переменной с именем user_name . Для печати user_name никогда не делайте
следующее:

printf( user_name ); /* Danger! If user_name contains "%s", program will crash

*/

Вместо этого используйте следующий код:

printf( "%s", user_name );

7 Примечание

В Visual Studio 2015 printf семейство функций и scanf было объявлено как
inline и перемещено в заголовки <stdio.h> и <conio.h> . Если вы переносите
более старый код, вы можете увидеть LNK2019 в связи с этими функциями.
Дополнительные сведения см. в статье Журнал изменений Visual C++ с 2003
по 2015.

Спецификатор преобразования типов


Символ спецификации преобразования type определяет, как должен
интерпретироваться соответствующий аргумент: как символ, строка, указатель,
целое число или число с плавающей запятой. Символ type — единственное
обязательное поле спецификации преобразования; он указывается после всех
необязательных полей.

Аргументы, следующие за строкой формата, интерпретируются в соответствии с


соответствующим символом типа и необязательным префиксом размера .
Преобразования для символьных типов char и wchar_t задаются с помощью c или
C , а однобайтовые и многобайтовые или расширенные символьные строки

задаются с помощью s или S в зависимости от используемой функции


форматирования. Символьные и строковые аргументы, заданные с помощью и c s
, интерпретируются как char и char* семейными printf функциями или как
wchar_t и wchar_t* семейными функциями wprintf . Символьные и строковые
аргументы, заданные с помощью и C S , интерпретируются как wchar_t и wchar_t*
семейными printf функциями или как char и char* семейными функциями
wprintf . Это поведение зависит от корпорации Майкрософт. По историческим
причинам wprintf функции используют c и s для ссылки на wchar_t символы, а
также C для S указания узких символов.
Целочисленные типы, такие как , , , и их unsigned варианты, задаются с помощью
d , i , o , , x u и X . long long long int short Типы с плавающей запятой, такие как
float , double и long double , задаются с помощью a , A , , e , E f , F g и G . По

умолчанию, если они не изменены префиксом размера , целочисленные аргументы


принуждаются к типу int , а аргументы с плавающей запятой — к double . В 64-
разрядных системах int объект является 32-разрядным значением, поэтому 64-
разрядные целые числа будут усечены при форматировании выходных данных,
если не используется префикс ll размера или I64 . Типы указателей, указанные в
параметре p , используют размер указателя по умолчанию для платформы.

7 Примечание

Для майкрософт:

Символ Z типа и поведение символов c типа , C , s и S при их использовании


с функциями printf и wprintf являются расширениями Майкрософт. Стандарт
ISO C использует и s согласованно для c узких символов и строк, а C также S
для расширенных символов и строк во всех функциях форматирования.

Символы поля типа

Символ Аргумент Формат вывода


типа

c Знак При использовании с функциями printf определяет


однобайтовый символ; при использовании с функциями wprintf
определяет расширенный символ.

C Знак При использовании с функциями printf определяет


расширенный символ; при использовании с функциями wprintf
определяет однобайтовый символ.

d Целое число Десятичное целое число со знаком.

i Целое число Десятичное целое число со знаком.

o Целое число Восьмеричное целое число без знака.

u Целое число Десятичное целое число без знака.

x Целое число Шестнадцатеричное целое число без знака; использует " abcdef ".

X Целое число Шестнадцатеричное целое число без знака; использует " ABCDEF ".
Символ Аргумент Формат вывода
типа

e С плавающей Значение со знаком в формате [ - ]d.dddd e [ - + |]dd[d], где d —


запятой одна десятичная цифра, dddd — одна или несколько десятичных
цифр в зависимости от указанной точности или шесть по
умолчанию, а dd[d] — две или три десятичные цифры в
зависимости от формата вывода и размера экспоненты.

E С плавающей Идентичен формату e , за исключением того, что E вместо e


запятой введения экспоненты.

f С плавающей Значение со знаком в формате [ - ]dddd . dddd, где dddd — одна


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

F С плавающей Идентичен формату f , за исключением того, что выходные


запятой данные бесконечности и NaN являются прописными.

g С плавающей Подписанные значения отображаются в формате или e , в f


запятой зависимости от того, что является более компактным для
заданного значения и точности. Формат e используется только в
том случае, если экспонента значения меньше -4 или больше
или равна аргументу precision . Нули в конце отбрасываются, а
десятичная запятая отображается только в том случае, если за
ней следует хотя бы одна цифра.

G С плавающей Идентичен формату g , за исключением того, что E , а не e ,


запятой вводит экспоненту (если это необходимо).

a С плавающей Шестнадцатеричное шестнадцатеричное значение двойной


запятой точности с плавающей запятой со знаком, которое имеет форму
[ - ] 0x hhhh p [| - + ]dd, где hhhh — шестнадцатеричные цифры
мантиссы (с использованием строчных букв), а dd — одна или
несколько цифр для экспоненты. Точность определяет
количество цифр после запятой.

A С плавающей Шестнадцатеричное шестнадцатеричное значение двойной


запятой точности с плавающей запятой со знаком, которое имеет форму
[ - ] 0X hhhh P [| - + ]dd, где hhhh — шестнадцатеричные цифры
мантиссы (с прописными буквами), а dd — одна или несколько
цифр для экспоненты. Точность определяет количество цифр
после запятой.
Символ Аргумент Формат вывода
типа

n Указатель на Число символов, которые успешно записаны на данный момент


целое число в поток или буфер. Это значение хранится в целом числе, адрес
которого указан в качестве аргумента. Размер целочисленного
значения, на которое ссылается указатель, управляется
префиксом спецификации размера аргумента. Описатель n
отключен по умолчанию. Дополнительные сведения см. в
примечании по безопасности.

p Тип указателя Отображение аргумента в виде адреса в шестнадцатеричных


цифрах.

s Строковый При использовании с функциями printf определяет строку


тип однобайтовых или многобайтовых символов; при
использовании с функциями wprintf определяет строку
расширенных символов. Символы отображаются до первого
нулевого символа или до тех пор, пока не будет достигнуто
значение precision.

S Строковый При использовании с функциями printf определяет строку


тип расширенных символов; при использовании с функциями
wprintf определяет строку однобайтовых или многобайтовых
символов. Символы отображаются до первого нулевого
символа или до тех пор, пока не будет достигнуто значение
precision.
Символ Аргумент Формат вывода
типа

Z Структура VS 2013 и более ранние версии

ANSI_STRING При передаче адреса ANSI_STRING структуры или


или UNICODE_STRING в качестве аргумента отображается строка,
UNICODE_STRING содержащаяся в буфере Buffer , на которую указывает поле
структуры. Используйте префикс модификатора w размера для
указания аргумента UNICODE_STRING , %wZ например . Поле Length
структуры должно содержать значение длины строки в байтах.
Поле MaximumLength структуры должно содержать значение
длины буфера в байтах.

Универсальная среда выполнения C (UCRT)


Существует известная проблема в UCRT, которая в настоящее
время поддерживается для обеспечения совместимости. S Как и
описатель, Z описатель без префикса модификатора размера
относится к UNICODE_STRING при использовании узкой функции
печати (например printf , ) и ANSI_STRING при использовании
функции широкой печати (например wprintf , ).

Вместо Z используйте hZ , чтобы указать ANSI_STRING . wZ (или


lZ ) по-прежнему можно использовать для указания
UNICODE_STRING .

Как правило, символ типа используется только в функциях


отладки драйверов, Z использующих спецификацию
преобразования, например dbgPrint и kdPrint .

В Visual Studio 2015 и более поздних версиях, если аргумент, соответствующий


спецификатору преобразования с плавающей запятой ( a , , e A , F g E f , , ),
G является бесконечным, неопределенным или NaN, форматированные выходные

данные соответствуют стандарту C99. В этой таблице перечислены


форматированные выходные данные.

Значение Выходные данные

Infinity inf

Несигнальное значение NaN nan

Сигнальное значение NaN nan(snan)

Неопределенное значение NaN nan(ind)

Любая из этих строк может иметь префикс со знаком . Если символ описателя
преобразования type с плавающей запятой является прописной буквой, выходные
данные форматируются также прописными буквами. Например, если
спецификатором формата является %F вместо %f , бесконечность форматируется
как INF вместо inf . Функции scanf также могут анализировать эти строки, поэтому
эти значения могут совершать круговой путь через функции printf и scanf .

До выхода Visual Studio 2015 в среде CRT использовался другой нестандартный


формат для выходных данных значений бесконечности, неопределенных значений
и значений NaN.

Значение Выходные данные

+ Бесконечность 1.#INF случайные цифры

-Бесконечности -1.#INF случайные цифры

Неопределенное (то же, что и не число без вызова Цифра .#IND случайные
исключения) цифры

Не число Цифра .#NAN случайные


цифры

Любая из этих строк может иметь префикс знака и форматироваться по-разному в


зависимости от ширины поля и точности, иногда с необычными эффектами.
Например, печатает 1.#J , printf("%.2f\n", INFINITY) так как #INF будет округлен до
двух цифр точности.

7 Примечание

Если аргумент, который соответствует %s или %S , или поле Buffer аргумента,


который соответствует %Z , является указателем NULL, отображается значение "
(NULL)".

7 Примечание

Во всех экспоненциальных форматах минимальное отображаемое количество


цифр показателя степени по умолчанию равно двум (три используются только
при необходимости). С помощью _set_output_format функции можно задать
число отображаемых цифр равным трем для обеспечения обратной
совместимости с кодом, написанным для Visual Studio 2013 и ранее.

) Важно!
%n Поскольку формат по своей сути небезопасный, он отключен по

умолчанию. При %n обнаружении в строке формата вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров.
Чтобы включить %n поддержку, см. раздел _set_printf_count_output.

Директивы флагов
Первое необязательное поле в спецификации преобразования содержит
директивы флага. Это поле содержит ноль или более символов флага, которые
указывают обоснование вывода и контрольные выходные данные знаков,
пробелов, начальных нулей, десятичных запятых, а также восьмеричных и
шестнадцатеричных префиксов. В спецификации преобразования может быть
указано несколько директив флагов, и символы флагов могут размещаться в любом
порядке.

Символы флагов

Flag Значение Значение по


умолчанию

- Выравнивание результата по левому краю в пределах заданной Выравнивание


ширины поля. по правому
краю.

+ Используйте знак (+ или -) для префикса выходного значения, Знак


если оно имеет тип со знаком. отображается
только для
отрицательных
значений со
знаком –.

0 Если ширина имеет префикс 0 , начальные нули добавляются до Без


достижения минимальной ширины. Если указаны одновременно заполнения.
0 и - , знак 0 игнорируется. Если 0 указан для целочисленного
формата ( i , , u x , X , o , , d ) и также присутствует спецификация
точности, например , %04.d 0 то игнорируется. Если 0 параметр
указан для a формата или A с плавающей запятой, начальные
нули добавляются к мантиссе после 0x префикса или 0X .

blank Используйте пустое значение для префикса выходного значения, Пустой


(' ') если оно является подписанным и положительным. Пустой префикс не
префикс игнорируется, если одновременно с ним присутствует отображается.
флаг +.
Flag Значение Значение по
умолчанию

# При использовании с форматом o # , x или X флаг использует 0 , Префикс не


0x или 0X соответственно для префикса любого ненулевого отображается.
выходного значения.

При использовании с форматом e # , E , f , F , a , или A флаг Десятичный


принудительно заставляет выходное значение содержать разделитель
десятичную запятую. появляется,
только если
после него есть
цифры.

Если используется в сочетании с форматом g или G , флаг # Десятичный


принудительно добавляет десятичный разделитель к выходному разделитель
значению и запрещает отбрасывать конечные нули.
появляется,
только если
Флаг игнорируется в сочетании с форматами c , d , i , u и s . после него есть
цифры.
Конечные нули
отбрасываются.

Спецификация ширины
В спецификации преобразования необязательное поле спецификации ширины
отображается после любых символов флага. Аргумент width представляет собой
неотрицательное десятичное целое число, определяющее минимальное
количество выходных символов. Если количество символов в выходном значении
меньше заданной ширины, к значениям слева или справа (в зависимости от того,
определен ли флаг выравнивания по левому краю ( - )) добавляются пробелы, в
количестве, необходимом для достижения минимальной ширины. Если width
имеет префикс 0, начальные нули добавляются к преобразованиям целочисленных
или с плавающей запятой до достижения минимальной ширины, за исключением
случаев, когда преобразование равно бесконечности или NaN .

Спецификация ширины никогда не вызывает усечения значения. Если число


символов в выходном значении больше указанной ширины или width если не
указано, все символы значения будут выводиться в соответствии со спецификацией
точности.

Если в качестве спецификации ширины указана звездочка ( * ), значение ширины


задается аргументом int из списка аргументов. Аргумент width должен
предшествовать значению, которое форматируется в списке аргументов, как
показано в следующем примере:

printf("%0*d", 5, 3); /* 00003 is output */

Отсутствие или небольшое width значение в спецификации преобразования не


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

Спецификация точности
В спецификации преобразования третье необязательное поле является
спецификацией точности. Он состоит из точки ( . ), за которой следует
неотрицательное десятичное целое число, которое в зависимости от типа
преобразования определяет количество строковых символов, количество
десятичных знаков или количество значимых цифр, которые должны быть
выведены.

В отличие от спецификации ширины, спецификация точности может вызывать


либо усечение выходного значения, либо округление значения с плавающей
запятой. Если precision задано значение 0, а преобразуемое значение равно 0,
результат не выводит символы, как показано в следующем примере:

printf( "%.0d", 0 ); /* No characters output */

Если спецификация точности представляет собой звездочку ( * ), аргумент int из


списка аргументов предоставляет значение. В списке аргументов аргумент
precision должен предшествовать форматируемому значению, как показано в
следующем примере:

printf( "%.*f", 3, 3.14159265 ); /* 3.142 output */

Символ type определяет либо интерпретацию precision , либо точность по


умолчанию, когда precision опущен, как показано в следующей таблице.

Влияние значений точности на тип

Тип Значение По умолчанию


Тип Значение По умолчанию

a, Точность определяет количество цифр после запятой. Точность по умолчанию —


A 13. Если точность равна 0,
десятичная запятая не
выводится, если не
используется флаг # .

c, Точность не применяется. Символ выводится.


C

d, Точность определяет минимальное выводимое Точность по умолчанию — 1.


i, количество цифр. Если количество цифр в аргументе
o, меньше значения precision, выходное значение
u, дополняется слева нулями. Значение не усекается,
x, если число цифр превышает точность.
X

e, Выводимое количество знаков дробной части Точность по умолчанию — 6.


E задается спецификацией точности. Последняя Если точность равна 0 или
выводимая цифра округляется. точка ( . ) отображается без
числа после нее, десятичная
запятая не выводится.

f, Значение точности задает количество цифр после Точность по умолчанию — 6.


F десятичной запятой. Если десятичная запятая Если точность равна 0 или
присутствует, перед ней присутствует по крайней точка ( . ) отображается без
мере одна цифра. Значение округляется до числа после нее, десятичная
соответствующего количества цифр. запятая не выводится.

g, Точность определяет максимальное выводимое Выводятся шесть значащих


G количество значащих цифр. цифр, а конечные нули
усекаются.

s, Точность определяет максимальное количество Символы печатаются до тех


S выводимых символов. Символы, выходящие за рамки пор, пока не будет найден
precision, не выводятся. пустой символ.

Спецификация размера аргумента


В спецификации преобразования поле size — это модификатор длины аргумента
для описателя преобразования type. Поля размера префиксов поля типа — hh ,
h j , l (строчные буквы L), L , ll , t , w , z , I (прописные буквы i), I32 и I64 —

указывают "размер" соответствующего аргумента — длинный или короткий, 32-


разрядный или 64-разрядный, однобайтовый или широкий символ — в
зависимости от изменяемого описателя преобразования. Эти префиксы размера
используются с символами type в семействах функций printf и wprintf для
определения интерпретации размеров аргументов, как показано в следующей
таблице. Поле size является необязательным для некоторых типов аргументов. Если
префикс размера не указан, модуль форматирования использует целые аргументы,
например подписанные или не подписанные char , short , int , long и типы
перечисления как 32-разрядные типы int , а аргументы float , double и long double
с плавающей запятой используются как 64-разрядные типы double . Такое
поведение соответствует правилам повышения уровня аргументов по умолчанию
для списков аргументов переменных. Дополнительные сведения о повышении
роли аргументов см. в разделе Многоточие и аргументы по умолчанию в
постфиксных выражениях. В 32-разрядных и 64-разрядных системах спецификация
преобразования 64-разрядного целочисленного аргумента ll должна включать
префикс размера или I64 . В противном случае поведение модуля форматирования
не определено.

Некоторые типы имеют разный размер в 32-разрядном и 64-разрядном коде.


Например, size_t на 32 бита длиннее в коде, скомпилированном для x86, и на 64
бита длиннее в коде, скомпилированном для x64. Чтобы создать код
форматирования для типов с переменным количеством байт, не зависящий от
платформы, можно использовать модификатор размера аргумента с переменным
количеством байт. Вместо этого используйте модификатор размера 64-разрядного
аргумента и явным образом повысьте тип аргумента переменной ширины до 64
бит. Модификатор размера аргумента (прописной i) майкрософт I обрабатывает
целочисленные аргументы переменной ширины, но для переносимости
рекомендуется использовать модификаторы , t и z для конкретного j типа.

Префиксы размера для описателей printf и wprintf


format-type

Чтобы указать Используемый префикс Со спецификатором типа

char
hh d , i , o , u , x или X
unsigned char

short int
h d , i , o , u , x или X
short unsigned int

__int32
I32 d , i , o , u , x или X
unsigned __int32

__int64
I64 d , i , o , u , x или X
unsigned __int64
Чтобы указать Используемый префикс Со спецификатором типа

intmax_t
j или I64 d , i , o , u , x или X
uintmax_t

long double l (строчная буква L) или L a , A , e , E , f , F , g или G

long int
l (строчная L) d , i , o , u , x или X
long unsigned int

long long int


ll (в нижнем регистре LL) d , i , o , u , x или X
unsigned long long int

ptrdiff_t t или I (прописные буквы i) d , i , o , u , x или X

size_t z или I (прописные буквы i) d , i , o , u , x или X

Однобайтовый символ h c или C

Расширенный символ l (строчная буква L) или w c или C

Строка однобайтовых символов h s , S или Z

Строка расширенных символов l (строчная буква L) или w s , S или Z

Типы ptrdiff_t и size_t являются __int32 или unsigned __int32 на 32-разрядных


платформах и __int64 или unsigned __int64 на 64-разрядных платформах. I
Префиксы размера (в верхнем регистре i), j , t и z принимают правильную
ширину аргумента для платформы.

В Visual C++ хотя long double является отдельным типом, он имеет то же


внутреннее представление, что и тип double .

Описатель hc типа или hC является синонимом c в printf функциях и с C в


wprintf функциях. Описатель lc типа , lC , wc или wC является синонимом C в
printf функциях и с c в wprintf функциях. Описатель hs типа или hS является

синонимом s в printf функциях и с S в wprintf функциях. Описатель ls типа , lS ,


ws или wS является синонимом S в printf функциях и с s в wprintf функциях.

7 Примечание

Для конкретной корпорации Майкрософт:

I Префиксы модификаторов размера аргументов (в верхнем регистре i), I32 ,

I64 и w являются расширениями Майкрософт и не совместимы с ISO C.


Префикс h при использовании с данными типа char и l префикс (строчная
буква L) при использовании с данными типа double являются расширениями
Майкрософт.

См. также раздел


printf, _printf_l, wprintf, _wprintf_l

printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

printf_p Позиционные параметры


Поля спецификации формата: scanf и
wscanf функции
Статья • 03.04.2023

Приведенные здесь сведения относятся ко всему scanf семейству функций,


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

Аргумент format представляет собой строку, которая указывает интерпретацию


входных данных и может содержать один или несколько из следующих значений:

Пробелы: пустой ( ), вкладка ( \t ) или новая строка ( \n ). Пробельные


символы приводят к тому, что функция scanf считывает, но не сохраняет все
последовательные пробельные символы во входных данных до следующего
символа, отличного от пробельного. Один пробельный символ в формате
соответствует любому числу (включая 0) и сочетанию пробельных символов
во входных данных.

Символы, отличные от пробельных, за исключением символа процента ( % ).


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

Спецификации формата, начинающиеся со знака процента ( % ). Спецификация


формата приводит scanf к чтению и преобразованию символов во входных
данных в значение указанного типа. Значение присваивается аргументу из
списка аргументов.

Спецификация формата имеет следующий вид:

% [ * ][ width ][{ h | l | ll | I64 | L }] type

Здесь , width h , l , ll , , I64 и L представляют спецификацию


scanf ширины scanf и type символ поля типа.

Строка format аргумента считывается слева направо. Символы, не входящие в


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

При обнаружении первой спецификации формата значение первого поля ввода


преобразуется в соответствии с этой спецификацией. Это значение хранится в
расположении, указанном первым аргументом, который следует за аргументом
format . Вторая спецификация формата приводит к тому, что второе поле ввода
преобразуется и сохраняется в следующем аргументе и т. д. в конце строки
форматирования.

Поле ввода определяется следующим образом: Все символы до первого пробела


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

Каждое поле спецификации формата представляет собой один символ или число,
указывающее на определенный параметр формата. Символ type , который
указывается после последнего необязательного поля формата, определяет способ
интерпретации поля ввода: как символ, как строка или как число.

Простейшая спецификация формата содержит только символ процента и символ


type (например, %s ). Если за знаком процента ( % ) следует символ, который не
имеет значения как управляющий символ формата, этот символ и следующие
символы (до следующего знака процента) рассматриваются как обычная
последовательность символов. То есть они рассматриваются как
последовательность символов, которые должны соответствовать входным данным.
Например, чтобы указать, что во входных данных должен присутствовать символ
процента, используйте %% .

Звездочка ( * ) за знаком процента отключает назначение следующего поля ввода,


которое интерпретируется как поле указанного типа. Поле сканируется, но не
сохраняется в аргументе .

Для безопасных версий (с суффиксом _s ) scanf семейства функций требуется,


чтобы каждый параметр типа c , C , s S или [ передавался сразу после параметра
размера буфера. Дополнительные сведения о безопасных версиях семейства
функций см. в scanf разделе scanf_s, _scanf_s_l, wscanf_s, . _wscanf_s_l
См. также раздел
scanf Спецификация ширины

scanf Введите символы полей

scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l


is , isw подпрограммы
Статья • 03.04.2023

isalnum, iswalnum, _isalnum_l, _iswalnum_l

isalpha, iswalpha, _isalpha_l, _iswalpha_l

isascii, __isascii, iswascii

isblank, iswblank, _isblank_l, _iswblank_l

iscntrl, iswcntrl, _iscntrl_l, _iswcntrl_l

iscsym, iscsymf, __iscsym, __iswcsym, __iscsymf, __iswcsymf, _iscsym_l, _iswcsym_l,


_iscsymf_l, _iswcsymf_l

_isctype, iswctype, _isctype_l, _iswctype_l

isdigit, iswdigit, _isdigit_l, _iswdigit_lisgraph, iswgraph, _isgraph_l, _iswgraph_l

isleadbyte, _isleadbyte_l

islower, iswlower, _islower_l, _iswlower_l

isprint, iswprint, _isprint_l, _iswprint_l

ispunct, iswpunct, _ispunct_l, _iswpunct_l

isspace, iswspace, _isspace_l, _iswspace_l

isupper, _isupper_l, iswupper, _iswupper_l

isxdigit, iswxdigit, _isxdigit_l, _iswxdigit_l

Комментарии
Эти подпрограммы проверяют символы на соответствие заданным условиям.

Подпрограммы is дают значимые результаты для любого целочисленного


аргумента от -1 ( EOF ) до UCHAR_MAX (0xFF), включительно. Ожидается тип аргумента
int .

U Внимание!

is Для подпрограмм передача аргумента типа char может привести к

непредсказуемым результатам. Однобайтовый символ типа char со


значением, превышающем 0x7F, в однобайтовой или многобайтовой
кодировке является отрицательным. Если передается значение char ,
компилятор может преобразовать значение в значение signed int или
значение signed long . Компилятор может расширить знак данного значения,
что приведет к непредвиденным результатам.
Подпрограммы isw дают значимые результаты для любого целочисленного
значения от -1 до WEOF 0xFFFF включительно. Тип wint_t данных определяется как
<WCHAR.H> . unsigned short Он может содержать любой расширенный символ или

значение конца файла ( WEOF ).

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта.

В языковом стандарте "C" условия тестирования для is подпрограмм выполняются


следующим образом:

isalnum

Алфавитно-цифровые символы (A–Z, a–z или 0–9).

isalpha

Алфавитные (A–Z или a–z).

__isascii

Символы ASCII (0x00–0x7F).

isblank

Горизонтальная табуляция или пробел (0x09 или 0x20).

iscntrl

Управляющий символ (0x00–0x1F или 0x7F).

__iscsym

Буква, символ подчеркивания или цифра.

__iscsymf

Буква или символ подчеркивания.

isdigit

Десятичная цифра (0–9).

isgraph

Печатный символ за исключением пробела (0x20).

islower

Буквы нижнего регистра (a–z).


isprint

Печатные символы, включая пробел (0x20–0x7E).

ispunct

Знак препинания.

isspace

Пробельный символ (0x09–0x0D или 0x20).

isupper

Буквы верхнего регистра (A–Z).

isxdigit

Шестнадцатеричная цифра (А–F, a–f или 0–9).

isw Для подпрограмм результат теста для указанного условия не зависит от

языкового стандарта. Ниже приведены условия тестирования для isw функций.

iswalnum

iswalpha или iswdigit .

iswalpha

Любой расширенный символ из набора, определенного реализацией, для которого


ни одна из функций iswcntrl , iswdigit , iswpunct и iswspace не принимает
значение, отличное от нуля. iswalpha возвращает ненулевое значение только для
расширенных символов, для которых iswupper или iswlower имеет ненулевое
значение.

iswascii

Представление символа ASCII (0x0000–0x007F) в расширенных символах.

iswblank

Расширенный символ, соответствующий стандартному пробелу или входящий в


определяемый реализацией набор расширенных символов, для которых функция
iswalnum имеет значение false. Стандартные пустые символы : пробел ( L' ' ) и
горизонтальная вкладка ( L'\t' ).

iswcntrl

Расширенный символ управления.

__iswcsym

Любой расширенный символ, для которого функция isalnum имеет значение true,
или символ "_".
__iswcsymf

Любой расширенный символ, для которого функция iswalpha имеет значение true,
или символ "_".

iswctype

Символ имеет свойство, указанное аргументом desc . Для каждого допустимого


значения аргумента desc iswctype существует эквивалентная подпрограмма
классификации расширенных символов, как показано в следующей таблице:

Эквивалентность iswctype(c, desc) другим isw


подпрограммам тестирования

Значение аргумента desc Эквивалент iswctype(c, desc)

_ALPHA iswalpha(c)

_ALPHA | _DIGIT iswalnum(c)

_BLANK iswblank(c)

_CONTROL iswcntrl(c)

_DIGIT iswdigit(c)

_ALPHA | _DIGIT | _PUNCT iswgraph(c)

_LOWER iswlower(c)

_ALPHA | _BLANK | _DIGIT | _PUNCT iswprint(c)

_PUNCT iswpunct(c)

_BLANK iswblank(c)

_SPACE iswspace(c)

_UPPER iswupper(c)

_HEX iswxdigit(c)

iswdigit

Расширенный символ, соответствующий символу десятичной цифры.

iswgraph

Печатный расширенный символ, за исключением символа с расширенным


пробелом ( L' ' ).
iswlower

Строчная буква или член определенного реализацией набора расширенных


символов, для которых ни одна из функций iswcntrl , iswdigit , iswpunct и iswspace
не имеет значения, отличного от нуля. iswlower возвращает ненулевое значение
только для расширенных символов, которые соответствуют буквам нижнего
регистра.

iswprint

Печатный расширенный символ, включая символ с широким пространством ( L'


' ).

iswpunct

Печатный расширенный символ, который не является символом ширины пробела


( L' ' ), а не широким символом, для которого iswalnum не является нулевым.

iswspace

Расширенный символ, соответствующий стандартному расширенному символу


пробела или являющийся одним из определяемых реализацией расширенных
символов, для которых функция iswalnum имеет значение false. Стандартные
символы пробелов: пробел ( L' ' ), веб-канал формы ( L'\f' ), новая строка (),
возврат каретки ( L'\n' L'\r' ), горизонтальная вкладка ( L'\t' ) и вертикальная
( L'\v' ).

iswupper

Расширенный символ верхнего регистра или символ из набора определенных


реализацией расширенных символов, для которых ни одна из функций iswcntrl ,
iswdigit , iswpunct и iswspace не имеет нулевого значения. Функция iswupper

возвращает ненулевое значение только для расширенных символов, которые


соответствуют буквам верхнего регистра.

iswxdigit

Расширенный символ, который соответствует символу шестнадцатеричной цифры.

Пример
C

// crt_isfam.c

/* This program tests all characters between 0x0

* and 0x7F, then displays each character with abbreviations

* for the character-type codes that apply.

*/

#include <stdio.h>

#include <ctype.h>

int main( void )

int ch;

for( ch = 0; ch <= 0x7F; ch++ )

printf( "%.2x ", ch );

printf( " %c", isprint( ch ) ? ch : ' ' );

printf( "%4s", isalnum( ch ) ? "AN" : "" );

printf( "%3s", isalpha( ch ) ? "A" : "" );

printf( "%3s", __isascii( ch ) ? "AS" : "" );

printf( "%3s", iscntrl( ch ) ? "C" : "" );

printf( "%3s", __iscsym( ch ) ? "CS " : "" );

printf( "%3s", __iscsymf( ch ) ? "CSF" : "" );

printf( "%3s", isdigit( ch ) ? "D" : "" );

printf( "%3s", isgraph( ch ) ? "G" : "" );

printf( "%3s", islower( ch ) ? "L" : "" );

printf( "%3s", ispunct( ch ) ? "PU" : "" );

printf( "%3s", isspace( ch ) ? "S" : "" );

printf( "%3s", isprint( ch ) ? "PR" : "" );

printf( "%3s", isupper( ch ) ? "U" : "" );

printf( "%3s", isxdigit( ch ) ? "X" : "" );

printf( ".\n" );

Выходные данные
Output

00 AS C .

01 AS C .

02 AS C .

03 AS C .

04 AS C .

05 AS C .

06 AS C .

07 AS C .

08 AS C .

09 AS C S .

0a AS C S .

0b AS C S .

0c AS C S .

0d AS C S .

0e AS C .

0f AS C .

10 AS C .

11 AS C .

12 AS C .

13 AS C .

14 AS C .

15 AS C .

16 AS C .

17 AS C .

18 AS C .

19 AS C .

1a AS C .

1b AS C .

1c AS C .

1d AS C .

1e AS C .

1f AS C .

20 AS S PR .

21 ! AS G PU PR .

22 " AS G PU PR .

23 # AS G PU PR .

24 $ AS G PU PR .

25 % AS G PU PR .

26 & AS G PU PR .

27 ' AS G PU PR .

28 ( AS G PU PR .

29 ) AS G PU PR .

2a * AS G PU PR .

2b + AS G PU PR .

2c , AS G PU PR .

2d - AS G PU PR .

2e . AS G PU PR .

2f / AS G PU PR .

30 0 AN AS CS D G PR X.

31 1 AN AS CS D G PR X.

32 2 AN AS CS D G PR X.

33 3 AN AS CS D G PR X.

34 4 AN AS CS D G PR X.

35 5 AN AS CS D G PR X.

36 6 AN AS CS D G PR X.

37 7 AN AS CS D G PR X.

38 8 AN AS CS D G PR X.

39 9 AN AS CS D G PR X.

3a : AS G PU PR .

3b ; AS G PU PR .

3c < AS G PU PR .

3d = AS G PU PR .

3e > AS G PU PR .

3f ? AS G PU PR .

40 @ AS G PU PR .

41 A AN A AS CS CSF G PR U X.

42 B AN A AS CS CSF G PR U X.

43 C AN A AS CS CSF G PR U X.

44 D AN A AS CS CSF G PR U X.

45 E AN A AS CS CSF G PR U X.

46 F AN A AS CS CSF G PR U X.

47 G AN A AS CS CSF G PR U .

48 H AN A AS CS CSF G PR U .

49 I AN A AS CS CSF G PR U .

4a J AN A AS CS CSF G PR U .

4b K AN A AS CS CSF G PR U .

4c L AN A AS CS CSF G PR U .

4d M AN A AS CS CSF G PR U .

4e N AN A AS CS CSF G PR U .

4f O AN A AS CS CSF G PR U .

50 P AN A AS CS CSF G PR U .

51 Q AN A AS CS CSF G PR U .

52 R AN A AS CS CSF G PR U .

53 S AN A AS CS CSF G PR U .

54 T AN A AS CS CSF G PR U .

55 U AN A AS CS CSF G PR U .

56 V AN A AS CS CSF G PR U .

57 W AN A AS CS CSF G PR U .

58 X AN A AS CS CSF G PR U .

59 Y AN A AS CS CSF G PR U .

5a Z AN A AS CS CSF G PR U .

5b [ AS G PU PR .

5c \ AS G PU PR .

5d ] AS G PU PR .

5e ^ AS G PU PR .

5f _ AS CS CSF G PU PR .

60 ` AS G PU PR .

61 a AN A AS CS CSF G L PR X.

62 b AN A AS CS CSF G L PR X.

63 c AN A AS CS CSF G L PR X.

64 d AN A AS CS CSF G L PR X.

65 e AN A AS CS CSF G L PR X.

66 f AN A AS CS CSF G L PR X.

67 g AN A AS CS CSF G L PR .

68 h AN A AS CS CSF G L PR .

69 i AN A AS CS CSF G L PR .

6a j AN A AS CS CSF G L PR .

6b k AN A AS CS CSF G L PR .

6c l AN A AS CS CSF G L PR .

6d m AN A AS CS CSF G L PR .

6e n AN A AS CS CSF G L PR .

6f o AN A AS CS CSF G L PR .

70 p AN A AS CS CSF G L PR .

71 q AN A AS CS CSF G L PR .

72 r AN A AS CS CSF G L PR .

73 s AN A AS CS CSF G L PR .

74 t AN A AS CS CSF G L PR .

75 u AN A AS CS CSF G L PR .

76 v AN A AS CS CSF G L PR .

77 w AN A AS CS CSF G L PR .

78 x AN A AS CS CSF G L PR .

79 y AN A AS CS CSF G L PR .

7a z AN A AS CS CSF G L PR .

7b { AS G PU PR .

7c | AS G PU PR .

7d } AS G PU PR .

7e ~ AS G PU PR .

7f AS C .

См. также
Классификация символов

Локаль

setlocale, _wsetlocale

Интерпретация последовательностей многобайтовых символов

Функции to
_ismbb Процедуры
Статья • 03.04.2023

Проверяет заданное целочисленное значение c для определенного условия,


используя текущий языковой стандарт или указанную LC_CTYPE категорию
состояния преобразования.

_ismbbalnum, _ismbbalnum_l

_ismbbalpha, _ismbbalpha_l

_ismbbblank, _ismbbblank_l

_ismbbgraph, _ismbbgraph_l

_ismbbkalnum, _ismbbkalnum_l

_ismbbkana, _ismbbkana_l

_ismbbkprint, _ismbbkprint_l

_ismbbkpunct, _ismbbkpunct_l

_ismbblead, _ismbblead_l

_ismbbprint, _ismbbprint_l

_ismbbpunct, _ismbbpunct_l

_ismbbtrail, _ismbbtrail_l\

Комментарии
Каждая из подпрограмм семейства _ismbb проверяет заданное целочисленное
значение c на выполнение определенного условия. Результат проверки зависит от
действующей многобайтовой кодовой страницы. По умолчанию в качестве
многобайтовой кодовая страницы установлена кодовая страница ANSI, полученная
от операционной системы при запуске программы. Можно использовать для
_getmbcp запроса многобайтовой кодовой страницы, которая используется, или
_setmbcp для ее изменения.

На выходное значение влияет параметр LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделеsetlocale , _wsetlocale. Версии этих функций,
у которых _l нет суффикса, используют текущий языковой стандарт для этого
поведения, зависящее от языкового стандарта; версии с суффиксом _l идентичны,
за исключением того, что вместо этого они используют переданный параметр
языкового стандарта.

Подпрограммы семейства _ismbb проверяют заданное целое число c следующим


образом.
Подпрограмма Условие проверки байта

_ismbbalnum isalnum(c) || _ismbbkalnum(c)

_ismbbalpha isalpha(c) || _ismbbkalpha(c)

_ismbbblank isblank(c)

_ismbbgraph То же, что и _ismbbprint , но _ismbbgraph не включает символ пробела


(0x20)

_ismbbkalnum Не входящий в набор ASCII текстовый символ, отличный от знака


препинания. Например, только для кодовой страницы 932, функция
_ismbbkalnum проверяет на принадлежность к алфавитно-цифровым
символам катаканы

_ismbbkana Катакана (0xA1–0xDF). Относится к кодовой странице 932

_ismbbkprint Не входящие в набор ASCII текстовые и пунктуационные символы.


Например, только _ismbbkprint на кодовой странице 932 тестирует знаки
препинания катаканы или катаканы (диапазон: 0xA1 — 0xDF).

_ismbbkpunct Не входящий в набор ASCII знак препинания. Например, только


_ismbbkpunct на кодовой странице 932 выполняется проверка пунктуации
катаканы.

_ismbblead Первый байт многобайтового символа. Например, только на кодовой


странице 932 допустимые диапазоны 0x81 — 0x9F, 0xE0 — 0xFC

_ismbbprint isprint(c) || _ismbbkprint(c) . ismbbprint содержит символ пробела


(0x20)

_ismbbpunct ispunct(c) || _ismbbkpunct(c) .

_ismbbtrail Второй байт многобайтового символа. Например, только на кодовой


странице 932 допустимые диапазоны 0x40 — 0x7E, 0x80 — 0xEC

В следующей таблице показаны объединенные | значения, которые составляют


условия тестирования для этих подпрограмм. Константы _BLANK манифеста , _DIGIT ,
_LOWER , _PUNCT и _UPPER определяются в ctype.h .

Подпрограмма _BLANK _DIGIT LOWER _PUNCT UPPER Не ASCII


Не ASCII

текст пунктуация;

_ismbbalnum — x x — x x —

_ismbbalpha — — x — x x —

_ismbbblank x — — — — — —
Подпрограмма _BLANK _DIGIT LOWER _PUNCT UPPER Не ASCII
Не ASCII

текст пунктуация;

_ismbbgraph — x x x x x x

_ismbbkalnum — — — — — x —

_ismbbkprint — — — — — x x

_ismbbkpunct — — — — — — x

_ismbbprint x x x x x x x

_ismbbpunct — — — x — — x

Подпрограммы _ismbb реализованы и как функции, и как макросы.


Дополнительные сведения о выборе любой из реализаций см. в статье
Рекомендации по выбору между функциями и макросами.

См. также раздел


Классификация байтов

is, isw подпрограммы

_mbbtombc, _mbbtombc_l

_mbctombb, _mbctombb_l
_ismbc Процедуры
Статья • 03.04.2023

Каждая _ismbc подпрограмма проверяет заданный многобайтовый символ c для


определенного условия.

_ismbcalnum, _ismbcalnum_l, _ismbcalpha, _ismbcalpha_l, _ismbcdigit,


_ismbcdigit_l\
_ismbcl0, _ismbcl0_l, _ismbcl1, _ismbcl1_l, _ismbcl2, _ismbcl2_l\
_ismbcgraph, _ismbcgraph_l, _ismbcprint, _ismbcprint_l, _ismbcpunct,
_ismbcpunct_l, _ismbcblank, _ismbcblank_l, _ismbcspace, _ismbcspace_l\
_ismbclegal, _ismbclegal_l, _ismbcsymbol, _ismbcsymbol_l\
_ismbchira, _ismbchira_l, _ismbckata, _ismbckata_l\
_ismbclower, _ismbclower_l, _ismbcupper, _ismbcupper_l

Комментарии
Результат тестирования каждой _ismbc подпрограммы зависит от используемой
многобайтовой кодовой страницы. Многобайтовые кодовые страницы содержат
однобайтовые буквенные символы. По умолчанию в качестве многобайтовой
кодовой страницы установлена стандартная системная кодовая страница ANSI,
полученная от операционной системы при запуске программы. Вы можете
запросить или изменить многобайтовую кодовую страницу, используемую с
_getmbcp или _setmbcpсоответственно.

Выходное значение зависит от LC_CTYPE параметра категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта.

Подпрограмма Условие теста Пример кодовой страницы 932

_ismbcalnum, Буквенно- Возвращает отличное от нуля значение только в том


_ismbcalnum_l цифровой случае, если c  — однобайтовое представление
английской буквы в коде ASCII: см. примеры для
_ismbcdigit и _ismbcalpha .
Подпрограмма Условие теста Пример кодовой страницы 932

_ismbcalpha, По алфавиту Возвращает ненулевое значение, если и только в том


_ismbcalpha_l случае, если c является однобайтовым
представлением английской буквы ASCII: см. примеры
для _ismbcupper и _ismbclower ; или буква катаканы:
0xA6<= c <=0xDF.

_ismbcdigit, Цифровой Возвращает ненулевое значение, если и только в том


_ismbcdigit_l случае, если c является однобайтовым
представлением цифры ASCII: 0x30<= c <=0x39.

_ismbcgraph, GRAPHIC Возвращает ненулевое значение только в том случае,


_ismbcgraph_l если c является однобайтовым представлением
любого печатного символа ASCII или катаканы, кроме
пробела ( ). См. примеры для _ismbcdigit , _ismbcalpha
и _ismbcpunct .

_ismbclegal, Допустимый Возвращает ненулевое значение только в том случае,


_ismbclegal_l многобайтовый если первый байт c находится в диапазонах 0x81–0x9F
символ или 0xE0–0xFC, а второй — в диапазонах 0x40–0x7E или
0x80–FC.

_ismbclower, Строчные Возвращает ненулевое значение, если и только в том


_ismbclower_l буквы случае, если c является однобайтовым
представлением строчной английской буквы ASCII:
0x61<= c <=0x7A.

_ismbcprint, Печатные Возвращает ненулевое значение только в том случае,


_ismbcprint_l символы если c является однобайтовым представлением
любого печатного символа ASCII или катаканы,
включая пробел ( ): см. примеры для _ismbcspace ,
_ismbcdigit , _ismbcalpha и _ismbcpunct .

_ismbcpunct, Пунктуация Возвращает ненулевое значение только в том случае,


_ismbcpunct_l если c является однобайтовым представлением
любого знака препинания ASCII или катаканы.

_ismbcblank, Пробелы или Возвращает ненулевое значение только в том случае,


_ismbcblank_l символы если c является однобайтовым представлением
горизонтальной символа пробела или горизонтальной табуляции:
табуляции c =0x20 или c =0x09.

_ismbcspace, Пробелы Возвращает ненулевое значение, если и только если c


_ismbcspace_l является символом пробела: c =0x20 или
0x09<= c <=0x0D.

_ismbcsymbol, Многобайтовый Возвращает ненулевое значение, если и только если


_ismbcsymbol_l символ 0x8141<= c <=0x81AC.
Подпрограмма Условие теста Пример кодовой страницы 932

_ismbcupper, Прописные Возвращает ненулевое значение, если и только в том


_ismbcupper_l буквы случае, если c является однобайтовым
представлением прописной английской буквы ASCII:
0x41<= c <=0x5A.

Раздел для кодовой страницы 932

Следующие подпрограммы применяются только к кодовой странице 932.

Подпрограмма Условие теста (только для кодовой страницы 932)

_ismbchira, _ismbchira_l Двухбайтовая хирагана: 0x829F<= c <=0x82F1.

_ismbckata, _ismbckata_l Двухбайтовая катакана: 0x8340<= c <=0x8396.

_ismbcl0, _ismbcl0_l JIS не кандзи: 0x8140<= c <=0x889E.

_ismbcl1, _ismbcl1_l JIS уровня 1: 0x889F<= c <=0x9872.

_ismbcl2, _ismbcl2_l JIS уровня 2: 0x989F<= c <=0xEA9E.

_ismbcl0 , _ismbcl1 и _ismbcl2 убедитесь, что указанное значение c соответствует


условиям теста, описанным в предыдущей таблице, но не проверяйте, является ли
c допустимым многобайтовый символ. Если младший байт находится в диапазонах

0x00–0x3F, 0x7F или 0xFD–0xFF, эти функции возвращают ненулевое значение,


указывающее, что символ удовлетворяет условию теста. Используйте _ismbbtrail,
чтобы проверить, _ismbbtrail_l определен ли многобайтовый символ.

КОНЕЦ раздела для кодовой страницы 932

См. также раздел


Классификация символов

is, isw подпрограммы

_ismbb Процедуры
operator new (CRT)
Статья • 03.04.2023

Начиная с Visual Studio 2013 универсальная среда выполнения C (UCRT) больше не


поддерживает функции operator new и operator delete функции C++. Эти функции
теперь являются частью стандартной библиотеки C++. Дополнительные сведения
смnew. в справочнике по языку C++ и операторам и deletenew операторам.
operator delete (CRT)
Статья • 03.04.2023

Начиная с Visual Studio 2013 универсальная среда выполнения C (UCRT) больше не


поддерживает функции operator new и operator delete функции C++. Эти функции
теперь являются частью стандартной библиотеки C++. Дополнительные сведения
смnew. в справочнике по языку C++ и операторам и deletedelete операторам.
printf_p позиционные параметры
Статья • 03.04.2023

Позиционные параметры позволяют указать по номеру аргумента для замены в


поле в строке формата. Доступны следующие функции printf с позиционными
параметрами:

Непозиционные функции printf Эквиваленты позиционных параметров

printf, _printf_l, wprintf, _wprintf_l _printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l

sprintf, _sprintf_l, swprintf, _swprintf_l, _sprintf_p, _sprintf_p_l, _swprintf_p,


__swprintf_l _swprintf_p_l

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l _cprintf_p, _cprintf_p_l, _cwprintf_p,


_cwprintf_p_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l _fprintf_p, _fprintf_p_l, _fwprintf_p,


_fwprintf_p_l

vprintf, _vprintf_l, vwprintf, _vwprintf_l _vprintf_p, _vprintf_p_l, _vwprintf_p,


_vwprintf_p_l

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l _vfprintf_p, _vfprintf_p_l, _vfwprintf_p,


_vfwprintf_p_l

vsprintf, _vsprintf_l, vswprintf, _vswprintf_l, _vsprintf_p, _vsprintf_p_l, _vswprintf_p,


__vswprintf_l _vswprintf_p_l

Определение позиционных параметров

Индексирование параметров
Если позиционное форматирование отсутствует, поведение позиционных функций
по умолчанию совпадает с поведением непозиционных. Позиционный параметр
для форматирования задается символами %n$ в начале описателя формата, где
n  — это позиция форматируемого параметра в списке параметров. Первый

аргумент после строки форматирования имеет номер позиции 1. Для остальной


части описателя формата действуют те же правила, что и для описателя формата
printf . Дополнительные сведения об описателях формата см. в описании
синтаксиса спецификации формата и printfwprintf функциях.

Ниже приведен пример позиционного форматирования:


C

_printf_p("%1$s %2$s", "November", "10");

В этом примере печатаются:

Output

November 10

Порядок используемых чисел может не совпадать с порядком аргументов.


Например, вот допустимая строка формата:

_printf_p("%2$s %1$s", "November", "10");

В этом примере печатаются:

Output

10 November

В отличие от традиционных строк форматирования, позиционные параметры


можно использовать в строке формата несколько раз. Например, примененная к
объекту директива

_printf_p("%1$d times %1$d is %2$d", 10, 100);

В этом примере печатаются:

Output

10 times 10 is 100

Все аргументы должны использоваться в строке формата по меньшей мере один


раз. Максимальное число разрешенных позиционных параметров в строке
формата задается _ARGMAX .

Ширина и точность
С помощью *n$ можно указать позиционный параметр в качестве описателя
ширины или точности, где n обозначает позицию нужного параметра в списке
параметров. Позиция значения ширины или точности должна отображаться сразу
после символа *. Например, примененная к объекту директива

_printf_p("%1$*2$s","Hello", 10);

или

_printf_p("%2$*1$s", 10, "Hello");

Сочетание позиционных и непозиционных


аргументов
Позиционные параметры не могут смешиваться с непозиционными параметрами в
одной строке формата. Если используется позиционное форматирование, для всех
описателей формата необходимо использовать позиционное форматирование.
Однако printf_p и связанные функции еще поддерживают непозиционные
параметры в строке формата, не содержащей позиционных параметров.

Пример
C

// positional_args.c

// Build by using: cl /W4 positional_args.c

// Positional arguments allow the specification of the order

// in which arguments are consumed in a formatting string.

#include <stdio.h>

int main()

int i = 1,

j = 2,

k = 3;

double x = 0.1,

y = 2.22,

z = 333.3333;

char *s1 = "abc",

*s2 = "def",

*s3 = "ghi";

// If positional arguments are unspecified,

// normal input order is used.

_printf_p("%d %d %d\n", i, j, k);

// Positional arguments are numbers followed by a $ character.


_printf_p("%3$d %1$d %2$d\n", i, j, k);

// The same positional argument may be reused.

_printf_p("%1$d %2$d %1$d\n", i, j);

// The positional arguments may appear in any order.

_printf_p("%1$s %2$s %3$s\n", s1, s2, s3);

_printf_p("%3$s %1$s %2$s\n", s1, s2, s3);

// Precision and width specifiers must be int types.

_printf_p("%3$*5$f %2$.*4$f %1$*4$.*5$f\n", x, y, z, j, k);

Output

1 2 3

3 1 2

1 2 1

abc def ghi

ghi abc def

333.333300 2.22 0.100

См. также раздел


Синтаксис спецификации формата: printf и wprintf функции
scanf Символы поля типа
Статья • 03.04.2023

Следующие сведения применимы к любой функции из семейства scanf , включая


безопасные версии, например scanf_s .

Символ type — единственное обязательное поле формата; он находится после


всех необязательных полей формата. Символ type определяет, интерпретируется
ли аргумент как символ, строка или число.

type Символы для scanf функций

Знак Ожидаемый тип входных данных Тип аргумента Аргумент


размера в
безопасной
версии?

c Символ. При использовании с функциями Указатель на char при Обязательный.


scanf определяет однобайтовый символ; использовании с Размер не
при использовании с функциями wscanf функциями scanf , включает
определяет расширенный символ. указатель на wchar_t пробел для
Символы-разделители обычно при использовании с конца null.
пропускаются при чтении, если указано функциями wscanf .
значение c . В отличие от других полей
типа, описатель ширины поля указывает
точное количество символов, а не
максимальное. Для считывания
следующего однобайтового символа,
отличного от пробельного, используйте
%1s ; для считывания следующего
расширенного символа, отличного от
пробельного, используйте %1ws .
Знак Ожидаемый тип входных данных Тип аргумента Аргумент
размера в
безопасной
версии?

C Символ противоположного размера. При Указатель на wchar_t Обязательный.


использовании с функциями scanf при использовании с Аргумент size
определяет расширенный символ; при функциями scanf , не содержит
использовании с функциями wscanf указатель на char при пробела для
определяет однобайтовый символ. использовании с конца null.
Символы-разделители обычно функциями wscanf .
пропускаются при чтении, если указано
значение C . В отличие от других полей
типа, описатель ширины поля указывает
точное количество символов, а не
максимальное. Для считывания
следующего однобайтового символа,
отличного от пробельного, используйте
%1s ; для считывания следующего
расширенного символа, отличного от
пробельного, используйте %1ws .

d Десятичное целое число. Указатель на int . Нет.

i Целое число. Шестнадцатеричное число, Указатель на int . Нет.


если входная строка начинается с "0x" или
"0X", восьмеричное число, если строка
начинается с "0"; в противном случае —
десятичное число.

o Восьмеричное целое число. Указатель на int . Нет.

p Адрес указателя в шестнадцатеричном Указатель на void* . Нет.


виде. Максимальное число считываемых
цифр зависит от размера указателя (32
бита или 64 бита), который зависит от
архитектуры компьютера. "0x" и "0X"
принимаются как префиксы.

u Десятичное целое число без знака. Указатель на unsigned Нет.


int .

x Шестнадцатеричное целое число. Указатель на int . Нет.


Знак Ожидаемый тип входных данных Тип аргумента Аргумент
размера в
безопасной
версии?

e, Число с плавающей запятой, состоящее Указатель на float . Нет.


E, из необязательного знака (+ или –),
f, последовательности из одной или
F, нескольких десятичных цифр,
g, G содержащей десятичную запятую, и
необязательной экспоненты ("e" или "E"),
за которой следует целое число со
знаком (необязательным).

a, A Значение с плавающей запятой, Указатель на float . Нет.


состоящее из последовательности один
или нескольких шестнадцатеричных
цифр, содержащее дополнительную
десятичную запятую, и экспонента ("p"
или "P"), за которой идет десятичное
значение.

n Нет данных, прочитанных из потока или Указатель на int , по Нет.


буфера. которому сохраняется
число символов,
успешно прочитанных
из потока или буфера
до этой точки в
текущем вызове
функции scanf или
wscanf .
Знак Ожидаемый тип входных данных Тип аргумента Аргумент
размера в
безопасной
версии?

s Строка, до первого символа-разделителя При использовании с Обязательный.


(пробела, знака табуляции или новой функциями scanf Размер
строки). Чтобы считывать строки, не обозначает массив включает
разделенные пробелами, используйте однобайтовых место для
набор квадратных скобок ( [ ] ), как символов; при завершающего
описано в scanf спецификации ширины. использовании с нуль-символа.
функциями wscanf
обозначает массив
расширенных
символов. В любом
случае массив
символов должен быть
достаточно большим
для поля ввода и
автоматически
добавляемого
завершающего нуль-
символа.

S Строка символов противоположного При использовании с Обязательный


размера, до первого символа- функциями scanf элемент.
разделителя (пробела, знака табуляции обозначает массив Размер
или новой строки). Чтобы считывать расширенных включает
строки, не разделенные пробелами, символов; при место для
используйте набор квадратных скобок ( [ использовании с завершающего
] ), как описано в scanf спецификации функциями wscanf нуль-символа.
ширины. обозначает массив
однобайтовых
символов. В любом
случае массив
символов должен быть
достаточно большим
для поля ввода и
автоматически
добавляемого
завершающего нуль-
символа.

При необходимости аргументы размера должны передаваться в списке


параметров сразу после аргумента, к который они применяются. Например,
приведенный ниже код

C
char string1[11], string2[9];

scanf_s("%10s %8s", string1, 11, string2, 9);

считывает строку с максимальной длиной 10 в string1 и строку с максимальной


длиной 8 в string2 . Размер буфера должен быть по крайней мере на один больше
указанной ширины, поскольку должно быть зарезервировано место для
завершающего нуль-символа.

Строка формата может обрабатывать однобайтовые или расширенные входные


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

Чтобы считать символ Воспользуйтесь этой С этими описателями


как функцией формата

один байт Функции scanf c , hc или hC

один байт Функции wscanf C , hc или hC

расширенный символ Функции wscanf c , lc или lC

расширенный символ Функции scanf C , lc или lC

Для чтения строк с использованием функций scanf и wscanf используйте


указанную выше таблицу с описателями формата s и S вместо c и C .

См. также раздел


scanf, _scanf_l, wscanf, _wscanf_l
scanf спецификация ширины
Статья • 03.04.2023

Эти данные применяются для интерпретации строк формата в семействе функций


scanf , включая безопасные версии, такие как scanf_s . Эти функции обычно
предполагают, что входной поток разбивается на последовательность токенов.
Маркеры разделяются пробелами (пробелом, табуляции или новой строкой) или
числовыми типами по естественному концу числового типа данных, как указано
первым символом, который не может быть преобразован в числовой текст.
Однако с помощью спецификации ширины можно остановить анализ входных
данных перед естественным концом токена.

Спецификация width состоит из символов между % описателями полей типа,


которые могут включать положительное целое число, которое называется width
полем, и один или несколько символов, указывающих размер поля, который также
может рассматриваться как модификаторы типа поля, например указание того,
является short ли целочисленный тип или long . Такие символы называются
префиксами размера.

Поле width
Поле width является положительным десятичным целым числом, которое
управляет максимальным числом символов, считываемых для этого поля. Не более
чем width символы преобразуются и хранятся в соответствующих
argument символах. width Меньше символов может быть прочитано, если символ

пробела или символ, который не может быть преобразован в соответствии с


заданным форматом, происходит до width достижения.

Спецификация ширины отделена и отличается от аргумента размера буфера,


необходимого для безопасных версий этих функций (например, , scanf_s и
wscanf_s т. д.). В следующем примере спецификация ширины равна 20; это

означает, что из входного потока могут быть прочитаны до 20 символов. Длина


буфера равна 21, что включает место для возможных 20 символов плюс
завершающий нуль-символ:

char str[21];

scanf_s("%20s", str, 21);

width Если поле не используется, scanf_s пытается прочитать весь токен в строку.

Если указанный размер недостаточно велик для хранения всего токена, ничего не
записывается в целевую строку. width Если задано поле, первые width символы в
маркере записываются в целевую строку вместе с признаком конца NULL.

Префикс размера
Необязательные префиксы h , , hh , I64 l ll и L указывают размер argument
(длинный или короткий, однобайтовый или широкий символ в зависимости от
изменяемого символа типа). Эти символы спецификации формата используются с
символами типа в функциях scanf и wscanf для определения интерпретации
аргументов, как показано в следующей таблице. Префикс I64 типа является
расширением Майкрософт и несовместим со стандартом C. Символы типа и их
значения описаны в таблице "Type Characters for scanf functions" (Символы типов
для функций scanf) в scanf символах поля типа.

7 Примечание

l Префиксы h и L префиксы — это расширения Майкрософт при

использовании с данными типа char .

Префиксы размера для scanf описателей типов


форматирования и wscanf форматирования

Чтобы указать Используемый Со спецификатором


префикс типа

double l e , E , f , g или G

long double (то же, что и double ) L e , E , f , g или G

long int l d , i , o , x или X

long unsigned int l u

long long ll d , i , o , x или X

short int h d , i , o , x или X

short unsigned int h u

char hh d , i , o , x или X
Чтобы указать Используемый Со спецификатором
префикс типа

unsigned char hh u

int64 I64 d , i , o , u , x или X

Однобайтовый символ для функции h c или C


scanf

Однобайтовый символ для функции h c или C


wscanf

Расширенный символ для функции l c или C


scanf

Расширенный символ для функции l c или C


wscanf

Строка однобайтового символа с scanf h s или S

Строка однобайтового символа с h s или S


wscanf

Строка расширенных символов с scanf l s или S

Строка расширенных символов с l s или S


wscanf

В следующих примерах используются h l scanf_s функции и wscanf_s функции:

scanf_s("%ls", &x, 2); // Read a wide-character string

wscanf_s(L"%hC", &x, 2); // Read a single-byte character

При использовании небезопасной функции из семейства scanf опустите параметр


размера, указывающий длину буфера предыдущего аргумента.

Чтение неуверенных строк


Для чтения строк, не разделенных символами пробелов, можно заменить набор
символов в квадратных скобках ( [ ] ) на s символ типа (string). Набор символов в
квадратных скобках называется строкой элемента управления. Соответствующее
поле ввода считывается до первого символа, который не отображается в строке
элемента управления. Если первый символ в наборе — символ каретки ( ^ ), логика
работы меняется на обратную: поле ввода считывается до первого символа,
который есть в остальной части набора символов.

Оба %[a-z] и %[z-a] интерпретируются как эквивалентные %[abcde...z] . Это


общее scanf расширение функции, но не требуется стандартом C.

Чтение нетерминированных строк


Чтобы сохранить строку без сохранения завершающего символа NULL ("\0"),
используйте спецификацию %Nc , где N является десятичным целым числом. В этом
случае символ типа указывает, c что аргумент является указателем на массив
символов. Следующие N-символы считываются из входного потока в указанное
расположение и не добавляются пустые символы ('\0'). Если значение N не указано,
значение по умолчанию равно 1.

При scanf остановке чтения поля


Функция scanf считывает каждое поле ввода, символ за символом. Он может
перестать читать определенное поле ввода, прежде чем он достигнет пробела по
одной из нескольких причин:

Достигнута указанная ширина.

Следующий символ не может быть преобразован как указанный.

Следующий символ конфликтует с символом в строке элемента управления,


который он должен соответствовать.

Следующий символ отсутствует в заданном наборе символов.

По какой бы причине функция scanf не прекратила чтение поля ввода, считается,


что следующее поле ввода начинается с первого непрочитанного символа.
Конфликтующий символ, если таковой имеется, считается непрочитанным. Это
первый символ следующего поля ввода или первый символ в последующих
операциях чтения во входном потоке.

См. также раздел


scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

Поля спецификации форматирования: scanf и wscanf функции

scanf Символы поля типа


_spawn , _wspawn функции
Статья • 03.04.2023

Каждая из функций _spawn создает и запускает новый процесс:

_spawnl, _wspawnl

_spawnle, _wspawnle

_spawnlp, _wspawnlp

_spawnlpe, _wspawnlpe

_spawnv, _wspawnv

_spawnve, _wspawnve

_spawnvp, _wspawnvp

_spawnvpe, _wspawnvpe

Буквы в конце имени функции определяют вариацию.

Письмо Variant

e envp , массив указателей на параметры среды, передается в новый процесс.

l Аргументы командной строки передаются по отдельности в функцию _spawn . Этот


суффикс обычно используется, когда некоторые параметры для нового процесса
известны заранее.

p Переменная среды PATH используется для поиска файла для выполнения.

v argv , массив указателей на аргументы командной строки, передается в функцию


_spawn . Этот суффикс обычно используется, когда несколько параметров для
нового процесса являются переменными.

Комментарии
Каждая из функций _spawn создает и выполняет новый процесс. Такие функции
автоматически обрабатывают аргументы в виде многобайтовых строк требуемым
образом, распознавая многобайтовые последовательности символов в
соответствии с текущей многобайтовой кодовой страницей. Функции _wspawn
являются версиями расширенных символов _spawn функций; они не обрабатывают
многобайтовые строки. В противном случае функции _wspawn ведут себя точно так
же, как аналогичные функции _spawn .

Сопоставления подпрограмм универсального текста


Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tspawnl _spawnl _spawnl _wspawnl

_tspawnle _spawnle _spawnle _wspawnle

_tspawnlp _spawnlp _spawnlp _wspawnlp

_tspawnlpe _spawnlpe _spawnlpe _wspawnlpe

_tspawnv _spawnv _spawnv _wspawnv

_tspawnve _spawnve _spawnve _wspawnve

_tspawnvp _spawnvp _spawnvp _wspawnvp

_tspawnvpe _spawnvpe _spawnvpe _wspawnvpe

Для загрузки и выполнения нового процесса необходимо обеспечить достаточно


памяти. Аргумент mode определяет действие, предпринимаемое вызывающим
процессом перед вызовом функции _spawn и во время ее выполнения. Следующие
значения определяются в Process.h следующих значениях mode :

Значение Описание

_P_OVERLAY Перекрывает вызывающий процесс новым процессом, уничтожая


вызывающий процесс (тот же эффект, что и при вызовах функций _exec ).

_P_WAIT Приостанавливает вызывающий поток до тех пор, пока не будет завершено


выполнение нового процесса (синхронная функция _spawn ).

_P_NOWAIT Продолжает выполнять вызывающий процесс параллельно с новым


или процессом (асинхронная функция _spawn ).
_P_NOWAITO

_P_DETACH Продолжает выполнять вызывающий процесс; новый процесс выполняется в


фоновом режиме без доступа к консоли или клавиатуре. Вызовы функции
_cwait для нового процесса завершаются ошибкой (асинхронная функция
_spawn ).

Аргумент cmdname определяет файл, который выполняется как новый процесс и


может указывать полный путь (от корневого каталога), частичный путь (из текущего
рабочего каталога) или просто имя файла. Если cmdname расширение имени файла
отсутствует или не заканчивается точкой (.), _spawn функция сначала пытается
использовать расширение COM-файла, а затем расширение имени файла .exe,
расширение имени файла .bat и, наконец, расширение CMD-файла.
Если параметр cmdname имеет расширение имени файла, для поиска используется
только это расширение. Если cmdname заканчивается точкой, вызванная функция
_spawn выполняет поиск cmdname без расширения имени файла. Функции _spawnlp ,

_spawnlpe , _spawnvp и _spawnvpe выполняют поиск cmdname (используя те же


процедуры) в каталогах, указанных в переменной среды PATH .

Если cmdname содержит описатель диска или какие-либо косые черты (то есть, если
это относительный путь), _spawn вызов выполняет поиск только по указанному
файлу; поиск пути не выполняется.

Раньше некоторые из этих функций присваивали параметру errno нулевое


значение в случае успеха, теперь при успешном результате значение errno
остается неизменным, как указано в стандарте С. Если нужно эмулировать старое
поведение, перед вызовом этих функций присвойте параметру errno нулевое
значение.

7 Примечание

Чтобы обеспечить правильную инициализацию и прекращение перекрытия,


не используйте функцию setjmp или longjmp для входа в подпрограмму
перекрытия или выхода из нее.

Аргументы для порожденного процесса


Для передачи аргументов в новый процесс задайте один или нескольких
указателей на символьные строки как аргументы вызова функции _spawn . Эти
символьные строки формируют список аргументов для порожденного процесса.
Общая длина строк, формирующих список аргументов для нового процесса, не
должна превышать 1024 байтов. Завершающий пустой символ ('\0') для каждой
строки не включается в число, но пробелы (автоматически вставлены в отдельные
аргументы) включаются.

7 Примечание

Пробелы, встроенные в строки, могут вызывать непредвиденное поведение.


Например, если передать в функцию _spawn строку "hi there" , это приведет к
тому, что новый процесс получит два аргумента: "hi" и "there" . Если
предполагалось, что новый процесс должен открыть файл с именем hi there,
произойдет сбой процесса. Этого можно избежать, заключив строку в
кавычки: "\"hi there\"" .

) Важно!

Не передавайте данные, вводимые пользователем, в функцию _spawn , не


выбрав это содержимое явно. _spawn приведет к вызову CreateProcess , чтобы
помнить, что неквалифицированные имена путей могут привести к
потенциальным уязвимостям системы безопасности.

Указатели аргументов можно передавать как отдельные параметры (в функциях


_spawnl , _spawnle , _spawnlp и _spawnlpe ) или как массивы указателей (в функциях
_spawnv , _spawnve , _spawnvp и _spawnvpe ). Необходимо передать по крайней мере

один аргумент arg0 или argv[0] в порожденный процесс. По правилам этот


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

Вызовы функций _spawnl , _spawnle , _spawnlp и _spawnlpe обычно используются,


если число аргументов известно заранее. Аргумент arg0 обычно является
указателем на параметр cmdname . Аргументы arg1 – argn являются указателями на
строки символов, которые образуют новый список аргументов. После argn должно
следовать указатель NULL , отмечающий конец списка аргументов.

Аргументы _spawnv , _spawnvp _spawnve и _spawnvpe вызовы полезны при наличии


переменного числа аргументов для нового процесса. Указатели на аргументы
передаются в виде массива argv . Аргумент argv[0] обычно является указателем на
путь в реальном режиме или имя программы в защищенном режиме, а argv[1]
также через argv[n] указатели на символьные строки, образующие новый список
аргументов. Аргумент argv[n +1] должен быть указателем NULL , чтобы пометить
конец списка аргументов.

Среда порожденного процесса


Файлы, открытые во время вызова функции _spawn , остаются открытыми в новом
процессе. В вызовах _spawnl , _spawnlp , _spawnv и _spawnvp новый процесс
наследует среду вызывающего процесса. Вызовы функций _spawnle , _spawnlpe ,
_spawnve и _spawnvpe изменяют среду для нового процесса, передавая список

параметров среды с помощью аргумента envp . Аргумент envp — это массив


указателей символов, каждый элемент которого (за исключением последнего)
указывает на строку, завершающуюся символом NULL, определенную в
переменной среды. Такие строки обычно имеют вид NAME = value , где NAME  — это
имя переменной среды, а value  — строковое значение, задаваемое для данной
переменной. (Значение value не заключено в двойные кавычки.) Последний
элемент массива envp должен быть NULL . Если же значение самого параметра
envp  — NULL , порожденный процесс наследует параметры среды родительского
процесса.

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


режим преобразования, в новый процесс. Эти сведения передаются в режиме
реального времени через запись C_FILE_INFO в среде. Обычно код запуска
обрабатывает эту запись, а затем удаляет ее из среды. Если же функция _spawn
порождает процесс, отличный от C, эта запись сохраняется в среде. При печати
среды в строке определения для этой записи отображаются графические символы,
так как сведения о среде передаются в формате двоичных данных в режиме
реального времени. Он не должен иметь никакого другого влияния на обычные
операции. В защищенном режиме сведения о среде передаются в виде текста и
поэтому не содержат графических символов.

Перед вызовом функции fflush необходимо явно сбросить (используя ключевое


слово _flushall или _spawn ) или закрыть все потоки.

Новые процессы, созданные вызовами _spawn подпрограмм, не сохраняют


параметры сигнала. Вместо этого порожденный процесс сбрасывает параметры
сигнала по умолчанию.

Перенаправление выходных данных


Если вы вызываете _spawn библиотеку DLL или приложение графического
пользовательского интерфейса и хотите перенаправить выходные данные в канал,
у вас есть два варианта:

Используйте API Win32 для создания канала, а затем вызова AllocConsole,


задания значений дескриптора в структуре запуска и вызова CreateProcess.

Вызов _popen или _wpopen, который создаст канал и вызовет приложение с


помощью cmd.exe /c (или command.exe /c ).

Пример
C

// crt_spawn.c

// This program accepts a number in the range

// 1-8 from the command line. Based on the number it receives,

// it executes one of the eight different procedures that

// spawn the process named child. For some of these procedures,

// the CHILD.EXE file must be in the same directory; for

// others, it only has to be in the same path.

//

#include <stdio.h>

#include <process.h>

char *my_env[] =

"THIS=environment will be",

"PASSED=to child.exe by the",

"_SPAWNLE=and",

"_SPAWNLPE=and",

"_SPAWNVE=and",

"_SPAWNVPE=functions",

NULL

};

int main( int argc, char *argv[] )

char *args[4];

// Set up parameters to be sent:

args[0] = "child";

args[1] = "spawn??";
args[2] = "two";

args[3] = NULL;

if (argc <= 2)

printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );

exit( 1 );

switch (argv[1][0]) // Based on first letter of argument

case '1':

_spawnl( _P_WAIT, argv[2], argv[2], "_spawnl", "two", NULL );

break;

case '2':

_spawnle( _P_WAIT, argv[2], argv[2], "_spawnle", "two",

NULL, my_env );

break;

case '3':

_spawnlp( _P_WAIT, argv[2], argv[2], "_spawnlp", "two", NULL );

break;

case '4':

_spawnlpe( _P_WAIT, argv[2], argv[2], "_spawnlpe", "two",

NULL, my_env );

break;

case '5':

_spawnv( _P_OVERLAY, argv[2], args );

break;

case '6':

_spawnve( _P_OVERLAY, argv[2], args, my_env );

break;

case '7':

_spawnvp( _P_OVERLAY, argv[2], args );

break;

case '8':

_spawnvpe( _P_OVERLAY, argv[2], args, my_env );

break;

default:

printf( "SYNTAX: SPAWN <1-8> <childprogram>\n" );

exit( 1 );

printf( "from SPAWN!\n" );

Output

child process output

from SPAWN!

См. также раздел


Управление процессами и средой

abort

atexit

_exec, _wexec функции

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
Функции strcoll
Статья • 03.04.2023

Каждая из функций strcoll и wcscoll сравнивает две строки согласно параметру


категории LC_COLLATE кодовой страницы использующегося языкового стандарта.
Каждая из функций _mbscoll сравнивает две строки в соответствии с
использующейся многобайтовой кодовой страницей. coll Используйте функции
для сравнения строк, если существует разница между порядком набора символов и
лексографическим порядком символов на текущей кодовой странице, если
разница интересна для сравнения. Используйте соответствующие функции cmp для
выполнения проверки только на равенство строк.

Функции strcoll

SBCS (single-byte character set, Юникод MBCS Описание


однобайтовый набор символов)

strcoll wcscoll _mbscoll Сопоставить две строки

_stricoll _wcsicoll _mbsicoll Сопоставить две строки


(регистр не учитывается)

_strncoll _wcsncoll _mbsncoll Сопоставить первые count


символов двух строк

_strnicoll _wcsnicoll _mbsnicoll Сопоставить первые count


символов двух строк (регистр
не учитывается)

Комментарии
Версии этих функций для однобайтовых символов (SBCS) ( strcoll , stricoll ,
_strncoll и _strnicoll ) сравнивают string1 и string2 согласно параметру
категории LC_COLLATE текущего языкового стандарта. Эти функции отличаются от
соответствующих функций strcmp тем, что функции strcoll используют сведения
кодовой страницы языкового стандарта, предоставляющие последовательности
сопоставления. Для сравнения строк в языковых стандартах, где порядок символов
в наборе отличается от лексикографического порядка, функции strcoll
необходимо использовать вместо соответствующих функций strcmp .
Дополнительные сведения о методе LC_COLLATE см. в разделе setlocale.
Для некоторых кодовых страниц и соответствующих наборов символов порядок
символов в наборе может отличаться от лексикографического порядка символов. В
языковом стандарте "C" это не так: порядок символов в наборе символов ASCII
совпадает с лексографическим порядком символов. Однако, в некоторых
европейских языковых стандартах, например, символ "a" (значение 0x61)
предшествует символу "ä" (значение 0xE4) в кодировке, но "ä" предшествует
символу "a" лексикографически. Чтобы выполнить лексикографическое сравнение
в таком случае, используйте strcoll вместо strcmp . Также можно использовать
функцию strxfrm для исходных строк, а затем использовать функцию strcmp для
результирующих строк.

strcoll , stricoll , _strncoll и _strnicoll автоматически обрабатывают строки

многобайтовых символов в соответствии с текущей кодовой страницей языкового


стандарта, так же ведут себя их аналоги, работающие с расширенными (Юникод)
символами. Версии этих функций, работающие с многобайтовыми символами
(MBCS), однако, сопоставляют строки посимвольно согласно текущей
многобайтовой кодовой странице.

Поскольку функции coll сопоставляют строки для лексикографического


сравнения, тогда как функции cmp просто проверяют на равенство строк, функции
coll гораздо медленнее, чем соответствующие версии cmp . Поэтому функции
следует использовать только в том случае, coll если имеется разница между
порядком набора символов и лексографическим порядком символов на текущей
кодовой странице, и это различие представляет интерес для сравнения строк.

См. также раздел


Локаль

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

localeconv

_mbsnbcoll, _mbsnbcoll_l, _mbsnbicoll, _mbsnbicoll_l

setlocale, _wsetlocale

strcmp, wcscmp, _mbscmp

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


Функции преобразования строк в
числовые значения
Статья • 03.04.2023

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

_strtoi64, _wcstoi64, _strtoi64_l, _wcstoi64_l

_strtoui64, _wcstoui64, _strtoui64_l, _wcstoui64_l

Комментарии
Каждая функция в семействе strto* преобразует строку, завершаемую значением
NULL, в числовое значение. Доступные функции перечислены в следующей
таблице.

Функция Описание

strtod Преобразует строку в значение двойной точности с плавающей запятой

strtol Преобразует строку в целочисленное значение типа long

strtoul Преобразует строку в беззнаковое целочисленное значение типа long

_strtoi64 Преобразует строку в 64-разрядное целое число типа __int64

_strtoui64 Преобразует строку в беззнаковое 64-разрядное целое число типа __int64

wcstod , wcstol , wcstoul и _wcstoi64  — это версии с расширенными символами

функций strtod , strtol , strtoul и _strtoi64 соответственно. Строковый аргумент


каждой из этих функций для расширенных символов представляет собой строку
расширенных символов; каждая функция ведет себя так же, как и эквивалентная
функция для однобайтовых символов.

Функция strtod принимает два аргумента: первая — входная строка, а второй —


указатель на символ, заканчивающий процесс преобразования. strtol _strtoi64 ,
strtoul и _strtoui64 принимает третий аргумент в качестве базы чисел для

использования в процессе преобразования.


Входная строка представляет собой последовательность символов, которые могут
обрабатываться как числовое значение указанного типа. Каждая функция
перестает считывать строку с первого символа, которую она не распознает как
часть числа. Этот символ может быть завершающим символом NULL. Для strtol ,
strtoul , _strtoi64 и _strtoui64 этот конечный символ также может быть первым

числовым символом, который больше определенного пользователем основания


системы счисления или равен ему.

Если предоставленный пользователем указатель на символ завершения


преобразования не задан или nullptr не задан NULL во время вызова, вместо него
будет сохранен указатель на символ, который остановил проверку. Если выполнить
преобразование невозможно (не найдены допустимые цифры или указано
недопустимое основание), по этому адресу сохраняется значение указателя на
строку.

strtod ожидает строку следующего вида:

[ whitespace ] [ sign ] [ digits ] [ . digits ] [{ d | D | e | E }[ sign ] digits ]

Может whitespace состоять из пробелов или символов табуляции, которые


игнорируются; sign либо плюс ( + ) или минус ( - ); и digits являются одной или
несколькими десятичными цифрами. Если перед символом основания системы
счисления нет никаких цифр, то после него должна отображаться хотя бы одна
цифра. За десятичными цифрами может следовать показатель степени, который
состоит из вводной буквы ( d , D , e или E ) и при необходимости целого числа со
знаком. Если экспонентная часть или радикс не отображается, предполагается, что
символ радикса следует за последней цифрой в строке. Первый символ, который
не соответствует этой форме, останавливает сканирование.

Функции strtol , strtoul , _strtoi64 и _strtoui64 ожидают строку следующего


вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits ]

Если базовый аргумент имеет значение от 2 до 36, он используется в качестве


основы числа. Если это значение 0, для определения базы используются начальные
символы, на которые ссылается указатель завершения преобразования. Если
первый символ равен 0, а второй — не x или X, строка интерпретируется как
восьмеричное целое число; в противном случае он интерпретируется как
десятичное число. Если первый символ — 0, а второй символ равен x или X, строка
интерпретируется как шестнадцатеричное целое число. Если первый символ — от
1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или
от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с
присвоенными значениями меньше base . strtoul и _strtoui64 допускают в
качестве префикса знак плюса ( + ) или знак минуса ( - ); знак минуса перед числом
показывает, что возвращаемое значение отрицательное.

Выходное значение зависит от параметра LC_NUMERIC категории языкового


стандарта. Для получения дополнительной информации см. setlocale. Версии этих
функций без суффикса _l используют текущий языковой стандарт для данного
поведения, зависимого от языкового стандарта. Версии с суффиксом _l
идентичны, однако они используют переданный параметр языкового стандарта.

Если значение, возвращаемое этими функциями, приведет к переполнению или


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

Функция Условие Возвращенное значение

strtod Переполнение +/- HUGE_VAL

strtod Потеря точности или отсутствие преобразования 0

strtol Переполнение + LONG_MAX

strtol Переполнение – LONG_MIN

strtol Потеря точности или отсутствие преобразования 0

_strtoi64 Переполнение + _I64_MAX

_strtoi64 Переполнение – _I64_MIN

_strtoi64 Преобразование не выполнено 0

_strtoui64 Переполнение _UI64_MAX

_strtoui64 Преобразование не выполнено 0

_I64_MAX , _I64_MIN и _UI64_MAX определены в <LIMITS.H> .

Функции wcstod , wcstol , wcstoul , _wcstoi64 и _wcstoui64  — это, соответственно,


версии функций strtod , strtol , strtoul , _strtoi64 и _strtoui64 для расширенных
символов; указатель на аргумент конца преобразования в каждой из этих функций
для расширенных символов представляет собой строку расширенных символов. В
остальном каждая из этих функций для расширенных символов работает так же,
как и ее аналог для однобайтовых символов.
См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l
Функции to
Статья • 03.04.2023

Каждая из to функций и связанных с ней макросов, если таковые есть, преобразует


один символ в другой символ.

__toascii

tolower, _tolower, towlower

toupper, _toupper, towupper

Комментарии
Ниже to приведены функции и преобразования макросов.

Подпрограмма Макрос Описание

__toascii __toascii Преобразует c в ASCII символ

tolower tolower Преобразует c в нижний регистр при необходимости

_tolower _tolower Преобразует c в нижний регистр

towlower Нет Преобразует c в соответствующую букву, представленную


расширенным символом нижнего регистра

toupper toupper Преобразует c в верхний регистр при необходимости

_toupper _toupper Преобразует c в верхний регистр

towupper Нет Преобразует c в соответствующую букву, представленную


расширенным символом нижнего регистра

Чтобы использовать версии to функций подпрограмм, которые также определены


как макросы, удалите определения макросов с #undef директивами или не
включает CTYPE.H. Если используется параметр компилятора /Za, то компилятор
использует функциональную версию toupper или tolower . Объявления функций
toupper и tolower находятся в STDLIB.H.

Подпрограмма __toascii устанавливает все, кроме младших 7 бит c , в 0, поэтому


преобразованное значение представляет символ в кодировке ASCII. Если c уже
представляет символ ASCII, c не изменяется.

Подпрограммы tolower и toupper :


зависят от категории LC_CTYPE текущего языкового стандарта ( tolower
вызывает isupper и toupper вызывает islower );

преобразовывают c , если c представляет пригодную для преобразования


букву соответствующего регистра текущего языкового стандарта и если
существует обратный регистр для данного языкового стандарта. В противном
случае c не изменяется.

Подпрограммы _tolower и _toupper :

представляют собой не зависящие от языкового стандарта, намного более


быстрые версии tolower и toupper.

Может использоваться только в том случае, если isascii( c ) и isupper( c ) или


islower( c ), соответственно, являются ненулевыми.

Укажите неопределенные результаты, если c не является буквой ASCII


соответствующего случая для преобразования.

Функции towlower и towupper возвращают преобразованную копию c только в том


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

c является расширенным символом соответствующего регистра (т. е. для


которого iswupper или iswlower, соответственно, не равны нулю).

Существует соответствующий широкий символ целевого случая (то есть для


которого iswlower или iswupper соответственно ненулево).

Пример
C

// crt_toupper.c

/* This program uses toupper and tolower to

* analyze all characters between 0x0 and 0x7F. It also

* applies _toupper and _tolower to any code in this

* range for which these functions make sense.

*/

#include <ctype.h>

#include <string.h>

char msg[] = "Some of THESE letters are Capitals.";

char *p;

int main( void )

printf( "%s\n", msg );

/* Reverse case of message. */

for( p = msg; p < msg + strlen( msg ); p++ )

if( islower( *p ) )

putchar( _toupper( *p ) );

else if( isupper( *p ) )

putchar( _tolower( *p ) );

else

putchar( *p );

Output

Some of THESE letters are Capitals.

sOME OF these LETTERS ARE cAPITALS.

См. также раздел


Преобразование данных

Локаль

is, isw подпрограммы


Функции vprintf
Статья • 03.04.2023

Каждая из функций vprintf принимает указатель на список аргументов, а затем


форматирует и записывает указанные данные в определенное назначение.
Функции различаются несколькими способами: при проверке параметров функции
принимают однобайтовые или расширенные символьные строки, назначение
вывода и поддержку указания параметров порядка используются в строке
формата.

_vcprintf, _vcwprintf

vfprintf, vfwprintf

_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l

vfprintf_s, _vfprintf_s_l, vfwprintf_s, _vfwprintf_s_l

vprintf, vwprintf

_vprintf_p, _vprintf_p_l, _vwprintf_p, _vwprintf_p_l

vprintf_s, _vprintf_s_l, vwprintf_s, _vwprintf_s_l

_vscprintf, _vscprintf_l, _vscwprintf, _vscwprintf_l

_vsnprintf, _vsnwprintfvsprintf, vswprintf

_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l

vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l

Комментарии
Функции vprintf выполняют те же действия, что и перечисленные в следующей
таблице аналоги. Но при этом каждая функция vprintf принимает указатель на
список аргументов, а их аналоги — сам список аргументов.

Эти функции форматируют данные для вывода в назначение, как описано ниже.

Функция Функция- Назначение Проверка Поддержка


аналог выходных параметров позиционных
данных параметров

_vcprintf _cprintf console Проверка значений нет


null.

_vcwprintf _cwprintf console Проверка значений нет


null.

vfprintf fprintf stream Проверка значений нет


null.
Функция Функция- Назначение Проверка Поддержка
аналог выходных параметров позиционных
данных параметров

vfprintf_p fprintf_p stream Проверка значений да


null и допустимого
формата.

vfprintf_s fprintf_s stream Проверка значений нет


null и допустимого
формата.

vfwprintf fwprintf stream Проверка значений нет


null.

vfwprintf_p fwprintf_p stream Проверка значений да


null и допустимого
формата.

vfwprintf_s fwprintf_s stream Проверка значений нет


null и допустимого
формата.

vprintf printf stdout Проверка значений нет


null.

vprintf_p printf_p stdout Проверка значений да


null и допустимого
формата.

vprintf_s printf_s stdout Проверка значений нет


null и допустимого
формата.

vwprintf wprintf stdout Проверка значений нет


null.

vwprintf_p wprintf_p stdout Проверка значений да


null и допустимого
формата.

vwprintf_s wprintf_s stdout Проверка значений нет


null и допустимого
формата.

vsprintf sprintf память, на Проверка значений нет


которую null.
указывает buffer
Функция Функция- Назначение Проверка Поддержка
аналог выходных параметров позиционных
данных параметров

vsprintf_p sprintf_p память, на Проверка значений да


которую null и допустимого
указывает buffer формата.

vsprintf_s sprintf_s память, на Проверка значений нет


которую null и допустимого
указывает buffer формата.

vswprintf swprintf память, на Проверка значений нет


которую null.
указывает buffer

vswprintf_p swprintf_p память, на Проверка значений да


которую null и допустимого
указывает buffer формата.

vswprintf_s swprintf_s память, на Проверка значений нет


которую null и допустимого
указывает buffer формата.

_vscprintf _vscprintf память, на Проверка значений нет


которую null.
указывает buffer

_vscwprintf _vscwprintf память, на Проверка значений нет


которую null.
указывает buffer

_vsnprintf _snprintf память, на Проверка значений нет


которую null.
указывает buffer

_vsnwprintf _snwprintf память, на Проверка значений нет


которую null.
указывает buffer

Аргумент argptr имеет тип va_list , который определен в VARARGS.H и STDARG.H.


Переменная argptr должна быть инициализирована va_start и может быть
повторно инициализирована последующими va_arg вызовами; argptr затем
указывает на начало списка аргументов, которые преобразуются и передаются для
вывода в соответствии с соответствующими спецификациями в аргументе format .
format имеет ту же форму и функцию, что format и аргумент для printf. Ни один из

этих функций не вызывается va_end . Более полное описание каждой функции


vprintf вы найдете в описании соответствующей функции-аналога, указанной в

таблице выше.

_vsnprintf отличается от vsprintf того, что он записывает не более count байтов в

buffer .

Версии этих функций с инфиксом w в имени — это версии расширенных символов


соответствующих функций без инфикса w ; в каждой из этих функций buffer
расширенных символов и format являются строками расширенных символов. Во
всем остальном двухбайтовые версии функций работают полностью так же, как и
соответствующие функции для однобайтовой кодировки.

Версии этих функций с суффиксами и _p суффиксами _s являются более


безопасными версиями. Эти версии проверяют строки формата. Они создают
исключение, если строка формата неправильно сформирована (например, если
используются недопустимые символы форматирования).

Версии этих функций с суффиксом _p позволяют указать порядок замены


предоставленных аргументов в строке формата. Дополнительные сведения см. в
разделе Позиционные параметры printf_p.

vswprintf _vsnwprintf _vsnprintf Если vsprintf копирование происходит между


строками, перекрывающимися, поведение не определено.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см. в разделе "Предотвращение переполнения
буфера". При использовании безопасных версий этих функций ( _s суффиксов
или _p суффиксов) строка формата, предоставляемая пользователем, может
вызвать исключение недопустимого параметра, если заданная пользователем
строка содержит недопустимые символы форматирования.

См. также раздел


Потоковый ввод-вывод

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


Устаревшие функции
Статья • 03.04.2023

Некоторые функции библиотеки устарели и имеют более новые эквиваленты. Мы


рекомендуем изменить эти функции на обновленные версии. Другие устаревшие
функции были удалены из CRT. В этой статье перечислены функции, которые
устарели, и функции, удаленные в определенной версии Visual Studio.

Не рекомендуемые к использованию как


устаревшие в Visual Studio 2015
Устаревшая функция Альтернатива

is_wctype iswctype

_loaddll LoadLibrary, LoadLibraryExили LoadPackagedLibrary

_unloaddll FreeLibrary

_getdllprocaddr GetProcAddress

_seterrormode SetErrorMode

_beep Beep

_sleep Sleep

_getsystime GetLocalTime

_setsystime SetLocalTime

Удаленные из CRT в Visual Studio 2015


Устаревшая функция Альтернатива

_cgets, _cgetws _cgets_s, _cgetws_s

gets, _getws gets_s, _getws_s

_get_output_format Нет

_heapadd Нет

_heapset Нет
Устаревшая функция Альтернатива

inp, inpw, _inp, _inpw, _inpd Нет

outp, outpw, _outp, _outpw, _outpd Нет

_set_output_format Нет

Удаленные из CRT в более ранних версиях


Visual Studio
_lock

_unlock
_cgets , _cgetws
Статья • 03.04.2023

Возвращает строку символов из консоли. Доступны более безопасные версии этих


функций; См. раздел_cgets_s , _cgetws_s.

) Важно!

Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.
Безопасные версии этих функций, _cgets_s и _cgetws_s, по-прежнему доступны.
Сведения об этих альтернативных функциях см. в разделе_cgets_s , _cgetws_s.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *_cgets(

char *buffer

);

wchar_t *_cgetws(

wchar_t *buffer

);

template <size_t size>

char *_cgets(

char (&buffer)[size]

); // C++ only

template <size_t size>

wchar_t *_cgetws(

wchar_t (&buffer)[size]

); // C++ only

Параметры

buffer

Место хранения данных.


Возвращаемое значение
_cgets и _cgetws возвращают указатель на начало строки, buffer[2] . Если buffer

имеет значение NULL , эти функции вызывают обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, они возвращают NULL и устанавливают для errno значение
EINVAL .

Комментарии
Эти функции считывают строку символов из консоли и хранят строку и ее длину в
расположении, указанном buffer . Параметр buffer должен указывать на массив
символов. Первый элемент массива, buffer[0] , должен содержать максимальную
длину (в символах) строки для считывания. Массив должен содержать достаточно
элементов для хранения строки, завершающий символ NULL (\0) и 2
дополнительных байта. Функция читает символы до считывания сочетания
возврата каретки и перевода строки (CR-LF) или до считывания указанного числа
символов. Строка сохраняется начиная с buffer[2] . Когда функция считывает CR-
LF, они сохраняет нуль-символ ("\0"). Затем функция сохраняет фактическую длину
строки во втором элементе массива, buffer[1] .

Так как все клавиши редактирования активны при вызове _cgets или _cgetws в
окне консоли, нажатие клавиши F3 повторяет последнюю введенную запись.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_cgetts _cgets _cgets _cgetws

Требования
Подпрограмма Обязательный заголовок

_cgets <conio.h>

_cgetws <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_cgets.c

// compile with: /c /W3

// This program creates a buffer and initializes

// the first byte to the size of the buffer. Next, the

// program accepts an input string using _cgets and displays

// the size and text of that string.

#include <conio.h>

#include <stdio.h>

#include <errno.h>

int main( void )

char buffer[83] = { 80 }; // Maximum characters in 1st byte

char *result;

printf( "Input line of text, followed by carriage return:\n");

// Input a line of text:

result = _cgets( buffer ); // C4996

// Note: _cgets is deprecated; consider using _cgets_s

if (!result)

printf( "An error occurred reading from the console:"

" error code %d\n", errno);

else

printf( "\nLine length = %d\nText = %s\n",

buffer[1], result );

Output

A line of input.Input line of text, followed by carriage return:

Line Length = 16

Text = A line of input.

См. также раздел


Ввод-вывод на консоль и порт

_getch, _getwch
_get_output_format
Статья • 03.04.2023

Получает текущее значение флага формата вывода.

) Важно!

Эта функция является устаревшей. Начиная с Visual Studio 2015 она недоступна
в CRT.

Синтаксис
C

unsigned int _get_output_format();

Возвращаемое значение
Текущее значение флага формата вывода.

Комментарии
Флаг формата вывода задает особенности форматированного ввода-вывода. Флаг
имеет два возможных значения: 0 и _TWO_DIGIT_EXPONENT . Если _TWO_DIGIT_EXPONENT
задано значение, число с плавающей запятой выводится только с двумя цифрами в
экспоненте, если только третья цифра не требуется для размера экспонента. Если
флаг равен нулю, то числа с плавающей запятой выводятся с тремя цифрами в
показателе степени; при необходимости значение дополняется до трех цифр
нулями.

Требования
Подпрограмма Обязательный заголовок

_get_output_format <stdio.h>
Дополнительные сведения о совместимости см. в разделе Compatibility во
введении.

См. также раздел


Синтаксис спецификации формата: printf и wprintf функции

printf, _printf_l, wprintf, _wprintf_l

printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

_set_output_format
gets , _getws
Статья • 03.04.2023

Получает строку из потока stdin . Доступны более безопасные версии этих


функций; См. разделgets_s , _getws_s.

) Важно!

Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.
Безопасные версии этих функций и gets_s _getws_s по-прежнему доступны.
Сведения об этих альтернативных функциях см. в разделеgets_s . _getws_s

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *gets(

char *buffer

);

wchar_t *_getws(

wchar_t *buffer

);

template <size_t size>

char *gets(

char (&buffer)[size]

); // C++ only

template <size_t size>

wchar_t *_getws(

wchar_t (&buffer)[size]

); // C++ only

Параметры
buffer

Место хранения входной строки.


Возвращаемое значение
В случае успеха возвращает свой аргумент. Указатель NULL указывает на ошибку
или конец файла. Используйте ferror или feof , чтобы определить, какой из них
произошел. Если buffer имеет значение NULL , эти функции вызывают обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, эти функции возвращают NULL и
устанавливают для errno значение EINVAL .

Комментарии
Функция gets считывает строку из стандартного потока ввода stdin и сохраняет ее
в буфере buffer . Строка состоит из всех символов до первого символа новой
строки ("\n"). Затем перед возвратом строки функция gets заменяет символ новой
строки нуль-символом ("\0"). Напротив, функция fgets сохраняет символ новой
строки. _getws — это версия функции gets для расширенных символов; ее аргумент
и возвращаемое значение являются строками расширенных символов.

) Важно!

Так как невозможно ограничить количество символов, считываемых ,


gets ненадежные входные данные могут легко вызвать переполнение буфера.

Взамен рекомендуется использовать fgets .

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_getts gets gets _getws


Требования
Подпрограмма Обязательный заголовок

gets <stdio.h>

_getws <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_gets.c

// compile with: /WX /W3

#include <stdio.h>

int main( void )

char line[21]; // room for 20 chars + '\0'

gets( line ); // C4996

// Danger: No way to limit input to 20 chars.

// Consider using gets_s instead.

printf( "The line entered was: %s\n", line );

Ввод длиной более 20 символов приведет к переполнению буфера строк и почти


наверняка приведет к сбою программы.

Output

Hello there!The line entered was: Hello there!

См. также раздел


Потоковый ввод-вывод

fgets, fgetws

fputs, fputws

puts, _putws
_heapadd
Статья • 03.04.2023

Добавляет память в кучу.

) Важно!

Эта функция является устаревшей. Начиная с Visual Studio 2015 она недоступна
в CRT.

Синтаксис
C

int _heapadd(

void *memblock,

size_t size

);

Параметры
memblock

Указатель на память кучи.

size

Размер добавляемой памяти в байтах.

Возвращаемое значение
В случае успешного выполнения _heapadd возвращает 0; в противном случае
функция возвращает –1 и задает для errno значение ENOSYS .

Дополнительные сведения об этом и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Начиная с Visual C++ версии 4.0 базовая структура кучи перемещена в библиотеки
среды выполнения C для обеспечения поддержки новых функций отладки. В
результате _heapadd больше не поддерживается на какой-либо платформе,
основанной на Win32 API.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_heapadd <malloc.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility во


введении.

См. также раздел


Выделение памяти

free

_heapchk
_heapmin

_heapset

_heapwalk

malloc

realloc
_heapset
Статья • 03.04.2023

Проверяет кучи на предмет минимальной согласованности и задает для свободных


записей указанное значение.

) Важно!

Эта функция является устаревшей. Начиная с Visual Studio 2015 она недоступна
в CRT.

Синтаксис
C

int _heapset(

unsigned int fill

);

Параметры

fill

Заполняющий символ.

Возвращаемое значение
Функция _heapset возвращает одну из следующих целочисленных констант
манифеста, определенных в файле Malloc.h.

Значение Описание

_HEAPBADBEGIN Начальные сведения о заголовке недопустимы или не найдены.

_HEAPBADNODE Куча повреждена или обнаружен плохой узел.

_HEAPEMPTY Куча еще не инициализирована.

_HEAPOK Вероятно, куча согласована.


Кроме того, при возникновении ошибки функция _heapset устанавливает для
параметра errno значение ENOSYS .

Комментарии
Функция _heapset показывает расположения свободной памяти или узлы, которые
были непреднамеренно перезаписаны.

_heapset проверяет кучу на предмет минимальной согласованности, а затем задает


значение fill для каждого байта свободных записей кучи. Это известное значение
показывает, какие адреса памяти кучи содержат свободные узлы, а какие содержат
данные, которые были непреднамеренно записаны в освободившуюся память.
Если операционная система не поддерживает _heapset (например, Windows 98),
функция возвращает _HEAPOK и задает значение errno ENOSYS .

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_heapset <malloc.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility во


введении.

Пример
C

// crt_heapset.c

// This program checks the heap and

// fills in free entries with the character 'Z'.

#include <malloc.h>

#include <stdio.h>

#include <stdlib.h>

int main( void )

int heapstatus;

char *buffer;

if( (buffer = malloc( 1 )) == NULL ) // Make sure heap is

exit( 0 ); // initialized

heapstatus = _heapset( 'Z' ); // Fill in free entries

switch( heapstatus )
{

case _HEAPOK:

printf( "OK - heap is fine\n" );

break;

case _HEAPEMPTY:

printf( "OK - heap is empty\n" );

break;

case _HEAPBADBEGIN:

printf( "ERROR - bad start of heap\n" );

break;

case _HEAPBADNODE:

printf( "ERROR - bad node in heap\n" );

break;

free( buffer );

Output

OK - heap is fine

См. также раздел


Выделение памяти

_heapadd

_heapchk
_heapmin

_heapwalk
inp , _inp , inpw , _inpw , _inpd
Статья • 03.04.2023

Входные данные из порта, байта ( inp , _inp ), слова ( inpw , _inpw ) или двойного
слова ( _inpd ).

) Важно!

Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.

Этот API нельзя использовать в приложениях, которые выполняются в среда


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C++

int _inp(

unsigned short port

);

unsigned short _inpw(

unsigned short port

);

unsigned long _inpd(

unsigned short port

);

Параметры
port

Номер порта ввода-вывода.

Возвращаемое значение
Эти функции возвращают байт, слово или двойное слово, прочитанное из порта
port . Ошибка не возвращается.

Комментарии
Функции _inp , _inpw и _inpd считывают из указанного порта байт, слово и двойное
слово соответственно. Входное значение может быть любым беззнаковым
коротким целым числом в диапазоне от 0 до 65535.

Так как эти функции считывают данные непосредственно из порта ввода-вывода,


их нельзя использовать в пользовательском коде.

Имена inp и inpw являются устаревшими именами для _inp функций и _inpw .
Дополнительные сведения см. в разделе Имена функций POSIX.

Требования
Подпрограмма Обязательный заголовок

_inp <conio.h>

_inpw <conio.h>

_inpd <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Ввод-вывод на консоль и порт

outp, outpw, _outp, _outpw, _outpd


inp , _inp , inpw , _inpw , _inpd
Статья • 03.04.2023

Входные данные из порта, байта ( inp , _inp ), слова ( inpw , _inpw ) или двойного
слова ( _inpd ).

) Важно!

Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.

Этот API нельзя использовать в приложениях, которые выполняются в среда


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C++

int _inp(

unsigned short port

);

unsigned short _inpw(

unsigned short port

);

unsigned long _inpd(

unsigned short port

);

Параметры
port

Номер порта ввода-вывода.

Возвращаемое значение
Эти функции возвращают байт, слово или двойное слово, прочитанное из порта
port . Ошибка не возвращается.

Комментарии
Функции _inp , _inpw и _inpd считывают из указанного порта байт, слово и двойное
слово соответственно. Входное значение может быть любым беззнаковым
коротким целым числом в диапазоне от 0 до 65535.

Так как эти функции считывают данные непосредственно из порта ввода-вывода,


их нельзя использовать в пользовательском коде.

Имена inp и inpw являются устаревшими именами для _inp функций и _inpw .
Дополнительные сведения см. в разделе Имена функций POSIX.

Требования
Подпрограмма Обязательный заголовок

_inp <conio.h>

_inpw <conio.h>

_inpd <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Ввод-вывод на консоль и порт

outp, outpw, _outp, _outpw, _outpd


_lock
Статья • 03.04.2023

Получает многопоточную блокировку.

) Важно!

Эта функция является устаревшей. Начиная с Visual Studio 2015 она недоступна
в CRT.

Синтаксис
C++

void __cdecl _lock

int locknum

);

Параметры
locknum

[in] Идентификатор блокировки, которую нужно получить.

Комментарии
Если блокировка уже была получена, этот метод все равно получает блокировку и
вызывает внутреннюю ошибку среды выполнения языка C (CRT). Если метод не
может получить блокировку, он завершает работу со неустранимой ошибкой и
задает для него код _RT_LOCK ошибки.

Требования
Источник: mlock.c

См. также раздел


Алфавитный указатель функций

_unlock
outp , outpw , _outp , _outpw , _outpd
Статья • 03.04.2023

Выводит на порт байт ( outp , _outp ), слово ( outpw , _outpw ) или двойное слово
( _outpd ).

) Важно!

Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C++

int _outp(

unsigned short port,


int data_byte

);

unsigned short _outpw(

unsigned short port,


unsigned short data_word

);

unsigned long _outpd(

unsigned short port,


unsigned long data_word

);

Параметры
port

Номер порта.

data_byte , data_word

Выходные значения.

Возвращаемое значение
Функции возвращают выходные данные. Ошибка не возвращается.
Комментарии
Функции _outp , _outpw и _outpd пишут байт, слово и двойное слово,
соответственно, на указанный порт вывода. Аргумент port может быть любым
целым числом без знака в диапазоне от 0 до 65 535. data_byte может быть любым
целым числом в диапазоне от 0 до 255. data_word может быть любым значением в
диапазоне целого числа, короткого целого числа без знака и длинного целого
числа без знака соответственно.

Поскольку эти функции записывают данные непосредственно в порт ввода-вывода,


их нельзя использовать в пользовательском коде Windows.

Сведения об использовании портов ввода-вывода в операционной системе


Windows см. в разделе Последовательные подключения.

Имена outp и outpw являются более старыми и нерекомендуемые _outp имена для
функций и _outpw . Дополнительные сведения см. в разделе Имена функций POSIX.

Требования
Подпрограмма Обязательный заголовок

_outp <conio.h>

_outpw <conio.h>

_outpd <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Ввод-вывод на консоль и порт

inp, inpw, _inp, _inpw, _inpd


outp , outpw , _outp , _outpw , _outpd
Статья • 03.04.2023

Выводит на порт байт ( outp , _outp ), слово ( outpw , _outpw ) или двойное слово
( _outpd ).

) Важно!

Эти функции устарели. Начиная с Visual Studio 2015 они недоступны в CRT.

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C++

int _outp(

unsigned short port,


int data_byte

);

unsigned short _outpw(

unsigned short port,


unsigned short data_word

);

unsigned long _outpd(

unsigned short port,


unsigned long data_word

);

Параметры
port

Номер порта.

data_byte , data_word

Выходные значения.

Возвращаемое значение
Функции возвращают выходные данные. Ошибка не возвращается.
Комментарии
Функции _outp , _outpw и _outpd пишут байт, слово и двойное слово,
соответственно, на указанный порт вывода. Аргумент port может быть любым
целым числом без знака в диапазоне от 0 до 65 535. data_byte может быть любым
целым числом в диапазоне от 0 до 255. data_word может быть любым значением в
диапазоне целого числа, короткого целого числа без знака и длинного целого
числа без знака соответственно.

Поскольку эти функции записывают данные непосредственно в порт ввода-вывода,


их нельзя использовать в пользовательском коде Windows.

Сведения об использовании портов ввода-вывода в операционной системе


Windows см. в разделе Последовательные подключения.

Имена outp и outpw являются более старыми и нерекомендуемые _outp имена для
функций и _outpw . Дополнительные сведения см. в разделе Имена функций POSIX.

Требования
Подпрограмма Обязательный заголовок

_outp <conio.h>

_outpw <conio.h>

_outpd <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Ввод-вывод на консоль и порт

inp, inpw, _inp, _inpw, _inpd


_set_output_format
Статья • 03.04.2023

Настраивает форматы вывода, которые используются форматированными


функциями ввода-вывода.

) Важно!

Эта функция является устаревшей. Начиная с Visual Studio 2015 она недоступна
в CRT.

Синтаксис
C

unsigned int _set_output_format(

unsigned int format

);

Параметры

format

[in] Значение, представляющее используемый формат.

Возвращаемое значение
Предыдущий формат вывода.

Комментарии
_set_output_format используется для настройки выходных данных
форматированных функций ввода-вывода, таких как printf_s. Единственное
соглашение о форматировании, которое может быть изменено этой функцией, —
это количество цифр, отображаемых в экспонентах в выходных данных чисел с
плавающей запятой.

По умолчанию выходные данные чисел с плавающей запятой для таких функций,


как printf_s , wprintf_s и связанные функции в стандартной библиотеке C Visual
C++ печатают три цифры для экспоненты, даже если для представления значения
экспоненты не требуется три цифры. Нули используются для заполнения значения
тремя цифрами. _set_output_format позволяет изменить это поведение, чтобы
только две цифры выводились в показателе степени, если только значение
показателя не требует третьей цифры.

Чтобы включить показатели степени с двумя цифрами, вызовите эту функцию с


параметром _TWO_DIGIT_EXPONENT , как показано в примере. Чтобы отключить
показатели степени с двумя цифрами, вызовите эту функцию с аргументом 0.

Требования
Подпрограмма Обязательный заголовок

_set_output_format <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility во


введении.

Пример
C

// crt_set_output_format.c

#include <stdio.h>

void printvalues(double x, double y)

printf_s("%11.4e %11.4e\n", x, y);

printf_s("%11.4E %11.4E\n", x, y);

printf_s("%11.4g %11.4g\n", x, y);

printf_s("%11.4G %11.4G\n", x, y);

int main()

double x = 1.211E-5;
double y = 2.3056E-112;

unsigned int old_exponent_format;

// Use the default format

printvalues(x, y);

// Enable two-digit exponent format

old_exponent_format = _set_output_format(_TWO_DIGIT_EXPONENT);

printvalues(x, y);

// Disable two-digit exponent format

_set_output_format( old_exponent_format );

printvalues(x, y);

Output

1.2110e-005 2.3056e-112

1.2110E-005 2.3056E-112

1.211e-005 2.306e-112

1.211E-005 2.306E-112

1.2110e-05 2.3056e-112

1.2110E-05 2.3056E-112

1.211e-05 2.306e-112

1.211E-05 2.306E-112

1.2110e-005 2.3056e-112

1.2110E-005 2.3056E-112

1.211e-005 2.306e-112

1.211E-005 2.306E-112

См. также раздел


printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

_get_output_format
_unlock
Статья • 03.04.2023

Снимает многопотоковую блокировку.

) Важно!

Эта функция является устаревшей. Начиная с Visual Studio 2015 она недоступна
в CRT.

Синтаксис
C++

void __cdecl _unlock(

int locknum

);

Параметры
locknum

[in] Идентификатор снимаемой блокировки.

Требования
Источник: mlock.c

См. также раздел


Алфавитный указатель функций

_lock
Справочник по алфавитной функции
UCRT
Статья • 03.04.2023

Справочная документация по библиотеке универсальной среды выполнения C


(UCRT, часто просто CRT) упорядочита по алфавиту по подпрограммам. Чтобы
найти подпрограмму CRT на основе функциональных возможностей, ознакомьтесь
со стандартными подпрограммами среды выполнения C по категориям.

Объект
abort

abs

_abs64

access

_access

_access_s

acos

acosf

acosh

acoshf

acoshl

acosl

_aligned_free

_aligned_free_dbg

_aligned_malloc

_aligned_malloc_dbg

_aligned_msize
_aligned_msize_dbg

_aligned_offset_malloc

_aligned_offset_malloc_dbg

_aligned_offset_realloc

_aligned_offset_realloc_dbg

_aligned_offset_recalloc

_aligned_offset_recalloc_dbg

_aligned_realloc

_aligned_realloc_dbg

_aligned_recalloc

_aligned_recalloc_dbg

_alloca

_amsg_exit

and

and_eq

asctime

asctime_s

asin

asinf

asinh

asinhf

asinhl

asinl

assert

_assert
_ASSERT

_ASSERT_EXPR

_ASSERTE

atan

atan2

atan2f

atan2l

atanf

atanh

atanhf

atanhl

atanl

atexit

_atodbl

_atodbl_l

atof

_atof_l

_atoflt

_atoflt_l

atoi

_atoi_l

_atoi64

_atoi64_l

atol

_atol_l
_atoldbl

_atoldbl_l

atoll

_atoll_l

B
_beginthread

_beginthreadex

bitand

bitor

bsearch

bsearch_s

btowc

_byteswap_uint64

_byteswap_ulong

_byteswap_ushort

C
_c_exit

c16rtomb

c32rtomb

_cabs

cabs

cabsf

cabsl

cacos
cacosf

cacosh

cacoshf

cacoshl

cacosl

_callnewh

calloc

_calloc_dbg

carg

cargf

cargl

casin

casinf

casinh

casinhf

casinhl

casinl

catan

catanf

catanh

catanhf

catanhl

catanl

cbrt

cbrtf
cbrtl

ccos

ccosf

ccosh

ccoshf

ccoshl

ccosl

ceil

ceilf

ceill

_cexit

cexp

cexpf

cexpl

cgets

_cgets_s

_cgetws_s

chdir

_chdir

_chdrive

_chgsign

_chgsignf

_chgsignl

chmod

_chmod
chsize

_chsize

_chsize_s

cimag

cimagf

cimagl

_clear87

clearerr

clearerr_s

_clearfp

clock

clog

clog10

clog10f

clog10l

clogf

clogl

close

_close

_commit

compl

_configthreadlocale

conj

conjf

conjl
_control87

__control87_2

_controlfp

_controlfp_s

copysign

_copysign

copysignf

_copysignf

copysignl

_copysignl

cos

cosf

cosh

coshf

coshl

cosl

_countof

cpow

cpowf

cpowl

cprintf

_cprintf

_cprintf_l

_cprintf_p

_cprintf_p_l
_cprintf_s

_cprintf_s_l

cproj

cprojf

cprojl

cputs

_cputs

_cputws

creal

crealf

creall

creat

_creat

_create_locale

_CrtCheckMemory

_CrtDbgBreak

_CrtDbgReport

_CrtDbgReportW

_CrtDoForAllClientObjects

_CrtDumpMemoryLeaks

_CrtGetAllocHook

_CrtGetDumpClient

_CrtGetReportHook

_CrtIsMemoryBlock

_CrtIsValidHeapPointer
_CrtIsValidPointer

_CrtMemCheckpoint

_CrtMemDifference

_CrtMemDumpAllObjectsSince

_CrtMemDumpStatistics

_CrtReportBlockType

_CrtSetAllocHook

_CrtSetBreakAlloc

_CrtSetDbgFlag

_CrtSetDebugFillThreshold

_CrtSetDumpClient

_CrtSetReportFile

_CrtSetReportHook

_CrtSetReportHook2

_CrtSetReportHookW2

_CrtSetReportMode

cscanf

_cscanf

_cscanf_l

_cscanf_s

_cscanf_s_l

csin

csinf

csinh

csinhf
csinhl

csinl

csqrt

csqrtf

csqrtl

ctan

ctanf

ctanh

ctanhf

ctanhl

ctanl

ctime

ctime_s

_ctime32

_ctime32_s

_ctime64

_ctime64_s

_cwait

cwait

_cwprintf

_cwprintf_l

_cwprintf_p

_cwprintf_p_l

_cwprintf_s

_cwprintf_s_l
_cwscanf

_cwscanf_l

_cwscanf_s

_cwscanf_s_l

_CxxThrowException

D
difftime

_difftime32

_difftime64

div

_dup

dup

_dup2

dup2

_dupenv_s

_dupenv_s_dbg

E
_ecvt

ecvt

_ecvt_s

_endthread

_endthreadex

eof

_eof
erf

erfc

erfcf

erfcl

erff

erfl

execl

_execl

execle

_execle

execlp

_execlp

execlpe

_execlpe

execv

_execv

execve

_execve

execvp

_execvp

execvpe

_execvpe

exit

_Exit

_exit
exp

exp2

exp2f

exp2l

_expand

_expand_dbg

expf

expm1

expm1f

expm1l

C
fabs

fabsf

fclose

_fclose_nolock

_fcloseall

fcloseall

_fcvt

fcvt

_fcvt_s

fdim

fdimf

fdiml

fdopen
_fdopen

feclearexcept

fegetenv

fegetexceptflag

fegetround

feholdexcept

feof

feraiseexcept

ferror

fesetenv

fesetexceptflag

fesetround

fetestexcept

feupdateenv

fflush

_fflush_nolock

fgetc

_fgetc_nolock

fgetchar

_fgetchar

fgetpos

fgets

fgetwc

_fgetwc_nolock

_fgetwchar
fgetws

filelength

_filelength

_filelengthi64

fileno

_fileno

_findclose

_findfirst

_findfirst32

_findfirst32i64

_findfirst64

_findfirst64i32

_findfirsti64

_findnext

_findnext32

_findnext32i64

_findnext64

_findnext64i32

_findnexti64

_finite

_finitef

floor

floorf

floorl

flushall
_flushall

fma

fmaf

fmal

fmax

fmaxf

fmaxl

fmin

fminf

fminl

fmod

fmodf

fopen

fopen_s

_fpclass

_fpclassf

fpclassify

_fpieee_flt

_fpreset

fprintf

_fprintf_l

_fprintf_p

_fprintf_p_l

fprintf_s

_fprintf_s_l
fputc

_fputc_nolock

fputchar

_fputchar

fputs

fputwc

_fputwc_nolock

_fputwchar

fputws

fread

_fread_nolock

_fread_nolock_s

fread_s

free

_free_dbg

_free_locale

_freea

freopen

freopen_s

frexp

fscanf

_fscanf_l

fscanf_s

_fscanf_s_l

fseek
_fseek_nolock

_fseeki64

_fseeki64_nolock

fsetpos

_fsopen

_fstat

_fstat32

_fstat32i64

_fstat64

_fstat64i32

_fstati64

ftell

_ftell_nolock

_ftelli64

_ftelli64_nolock

_ftime

_ftime_s

_ftime32

_ftime32_s

_ftime64

_ftime64_s

_fullpath

_fullpath_dbg

_futime

_futime32
_futime64

fwide

fwprintf

_fwprintf_l

_fwprintf_p

_fwprintf_p_l

fwprintf_s

_fwprintf_s_l

fwrite

_fwrite_nolock

fwscanf

_fwscanf_l

fwscanf_s

_fwscanf_s_l

G
gcvt

_gcvt

_gcvt_s

_get_current_locale

_get_daylight

_get_doserrno

_get_dstbias

_get_errno

_get_FMA3_enable
_get_fmode

_get_heap_handle

_get_invalid_parameter_handler

_get_osfhandle

_get_pgmptr

_get_printf_count_output

_get_terminate

_get_thread_local_invalid_parameter_handler

_get_timezone

_get_tzname

_get_unexpected

_get_wpgmptr

getc

_getc_nolock

getch

_getch

_getch_nolock

getchar

_getchar_nolock

getche

_getche

_getche_nolock

getcwd

_getcwd

_getcwd_dbg
_getdcwd

_getdcwd_dbg

_getdcwd_nolock

_getdiskfree

_getdrive

_getdrives

getenv

getenv_s

_getmaxstdio

_getmbcp

_getpid

getpid

gets_s

_getw

getw

getwc

_getwc_nolock

_getwch

_getwch_nolock

getwchar

_getwchar_nolock

_getwche

_getwche_nolock

_getws_s

gmtime
gmtime_s

_gmtime32

_gmtime32_s

_gmtime64

_gmtime64_s

H
_heapchk

_heapmin

_heapwalk

hypot

_hypot

hypotf

_hypotf

hypotl

_hypotl

I
_i64toa

_i64toa_s

_i64tow

_i64tow_s

ilogb

ilogbf

ilogbl

imaxabs
imaxdiv

_initterm

_initterm_e

_invalid_parameter

_invalid_parameter_noinfo

_invalid_parameter_noinfo_noreturn

_invoke_watson

isalnum

_isalnum_l

isalpha

_isalpha_l

isascii

__isascii

_isatty

isatty

isblank

_isblank_l

iscntrl

_iscntrl_l

__iscsym

iscsym

_iscsym_l

__iscsymf

iscsymf

_iscsymf_l
_isctype

_isctype_l

isdigit

_isdigit_l

isfinite

isgraph

_isgraph_l

isgreater

isgreaterequal

isinf

isleadbyte

_isleadbyte_l

isless

islessequal

islessgreater

islower

_islower_l

_ismbbalnum

_ismbbalnum_l

_ismbbalpha

_ismbbalpha_l

_ismbbblank

_ismbbblank_l

_ismbbgraph

_ismbbgraph_l
_ismbbkalnum

_ismbbkalnum_l

_ismbbkana

_ismbbkana_l

_ismbbkprint

_ismbbkprint_l

_ismbbkpunct

_ismbbkpunct_l

_ismbblead

_ismbblead_l

_ismbbprint

_ismbbprint_l

_ismbbpunct

_ismbbpunct_l

_ismbbtrail

_ismbbtrail_l

_ismbcalnum

_ismbcalnum_l

_ismbcalpha

_ismbcalpha_l

_ismbcblank

_ismbcblank_l

_ismbcdigit

_ismbcdigit_l

_ismbcgraph
_ismbcgraph_l

_ismbchira

_ismbchira_l

_ismbckata

_ismbckata_l

_ismbcl0

_ismbcl0_l

_ismbcl1

_ismbcl1_l

_ismbcl2

_ismbcl2_l

_ismbclegal

_ismbclegal_l

_ismbclower

_ismbclower_l

_ismbcprint

_ismbcprint_l

_ismbcpunct

_ismbcpunct_l

_ismbcspace

_ismbcspace_l

_ismbcsymbol

_ismbcsymbol_l

_ismbcupper

_ismbcupper_l
_ismbslead

_ismbslead_l

_ismbstrail

_ismbstrail_l

isnan

_isnan

_isnanf

isnormal

isprint

_isprint_l

ispunct

_ispunct_l

isspace

_isspace_l

isunordered

isupper

_isupper_l

iswalnum

_iswalnum_l

iswalpha

_iswalpha_l

iswascii

iswblank

_iswblank_l

iswcntrl
_iswcntrl_l

__iswcsym

_iswcsym_l

__iswcsymf

_iswcsymf_l

iswctype

_iswctype_l

iswdigit

_iswdigit_l

iswgraph

_iswgraph_l

iswlower

_iswlower_l

iswprint

_iswprint_l

iswpunct

_iswpunct_l

iswspace

_iswspace_l

iswupper

_iswupper_l

iswxdigit

_iswxdigit_l

isxdigit

_isxdigit_l
itoa

_itoa

_itoa_s

_itow

_itow_s

J
_j0

j0

_j1

j1

_jn

jn

K
_kbhit

kbhit

L
labs

ldexp

ldiv

_lfind

lfind

_lfind_s

lgamma
lgammaf

lgammal

llabs

lldiv

llrint

llrintf

llrintl

llround

llroundf

llroundl

localeconv

localtime

localtime_s

_localtime32

_localtime32_s

_localtime64

_localtime64_s

_lock_file

locking

_locking

log

log10

log10f

log1p

log1pf
log1pl

log2

log2f

log2l

logb

_logb

logbf

_logbf

logbl

logf

longjmp

lrint

lrintf

lrintl

_lrotl

_lrotr

lround

lroundf

lroundl

_lsearch

lsearch

_lsearch_s

lseek

_lseek

_lseeki64
ltoa

_ltoa

_ltoa_s

_ltow

_ltow_s

M
_makepath

_makepath_s

malloc

_malloc_dbg

_malloca

_matherr

__max

_mbbtombc

_mbbtombc_l

_mbbtype

_mbbtype_l

_mbccpy

_mbccpy_l

_mbccpy_s

_mbccpy_s_l

_mbcjistojms

_mbcjistojms_l

_mbcjmstojis
_mbcjmstojis_l

_mbclen

_mbclen_l

_mbctohira

_mbctohira_l

_mbctokata

_mbctokata_l

_mbctolower

_mbctolower_l

_mbctombb

_mbctombb_l

_mbctoupper

_mbctoupper_l

mblen

_mblen_l

mbrlen

mbrtoc16

mbrtoc32

mbrtowc

_mbsbtype

_mbsbtype_l

_mbscat

_mbscat_s

_mbscat_s_l

_mbschr
_mbschr_l

_mbscmp

_mbscmp_l

_mbscoll

_mbscoll_l

_mbscpy

_mbscpy_s

_mbscpy_s_l

_mbscspn

_mbscspn_l

_mbsdec

_mbsdec_l

_mbsdup

_mbsicmp

_mbsicmp_l

_mbsicoll

_mbsicoll_l

_mbsinc

_mbsinc_l

mbsinit

_mbslen

_mbslen_l

_mbslwr

_mbslwr_l

_mbslwr_s
_mbslwr_s_l

_mbsnbcat

_mbsnbcat_l

_mbsnbcat_s

_mbsnbcat_s_l

_mbsnbcmp

_mbsnbcmp_l

_mbsnbcnt

_mbsnbcnt_l

_mbsnbcoll

_mbsnbcoll_l

_mbsnbcpy

_mbsnbcpy_l

_mbsnbcpy_s

_mbsnbcpy_s_l

_mbsnbicmp

_mbsnbicmp_l

_mbsnbicoll

_mbsnbicoll_l

_mbsnbset

_mbsnbset_l

_mbsnbset_s

_mbsnbset_s_l

_mbsncat

_mbsncat_l
_mbsncat_s

_mbsncat_s_l

_mbsnccnt

_mbsnccnt_l

_mbsncmp

_mbsncmp_l

_mbsncoll

_mbsncoll_l

_mbsncpy

_mbsncpy_l

_mbsncpy_s

_mbsncpy_s_l

_mbsnextc

_mbsnextc_l

_mbsnicmp

_mbsnicmp_l

_mbsnicoll

_mbsnicoll_l

_mbsninc

_mbsninc_l

_mbsnlen

_mbsnlen_l

_mbsnset

_mbsnset_l

_mbsnset_s
_mbsnset_s_l

_mbspbrk

_mbspbrk_l

_mbsrchr

_mbsrchr_l

_mbsrev

_mbsrev_l

mbsrtowcs

mbsrtowcs_s

_mbsset

_mbsset_l

_mbsset_s

_mbsset_s_l

_mbsspn

_mbsspn_l

_mbsspnp

_mbsspnp_l

_mbsstr

_mbsstr_l

_mbstok

_mbstok_l

_mbstok_s

_mbstok_s_l

mbstowcs

_mbstowcs_l
mbstowcs_s

_mbstowcs_s_l

_mbstrlen

_mbstrlen_l

_mbstrnlen

_mbstrnlen_l

_mbsupr

_mbsupr_l

_mbsupr_s

_mbsupr_s_l

mbtowc

_mbtowc_l

memccpy

_memccpy

memchr

memcmp

memcpy

memcpy_s

memicmp

_memicmp

_memicmp_l

memmove

memmove_s

memset

__min
mkdir

_mkdir

_mkgmtime

_mkgmtime32

_mkgmtime64

mktemp

_mktemp

_mktemp_s

mktime

_mktime32

_mktime64

modf

modff

_msize

_msize_dbg

Нет
nan

nanf

nanl

nearbyint

nearbyintf

nearbyintl

nextafter

_nextafter
nextafterf

_nextafterf

nextafterl

nexttoward

nexttowardf

nexttowardl

norm

normf

norml

not

not_eq

O
offsetof

_onexit

_onexit_m

open

_open

_open_osfhandle

or

or_eq

P
_pclose

perror

_pipe
_popen

pow

powf

powl

printf

_printf_l

_printf_p

_printf_p_l

printf_s

_printf_s_l

_purecall

putc

_putc_nolock

putch

_putch

_putch_nolock

putchar

_putchar_nolock

putenv

_putenv

_putenv_s

puts

putw

_putw

putwc
_putwc_nolock

_putwch

_putwch_nolock

putwchar

_putwchar_nolock

_putws

Q
qsort

qsort_s

_query_new_handler

_query_new_mode

quick_exit

R
raise

rand

rand_s

read

_read

realloc

_realloc_dbg

_recalloc

_recalloc_dbg

remainder

remainderf
remainderl

remove

remquo

remquof

remquol

rename

_resetstkoflw

rewind

rint

rintf

rintl

rmdir

_rmdir

rmtmp

_rmtmp

_rotl

_rotl64

_rotr

_rotr64

round

roundf

roundl

_RPT

_RPTF

_RPTFW
_RPTW

_RTC_GetErrDesc

_RTC_NumErrors

_RTC_SetErrorFunc

_RTC_SetErrorFuncW

_RTC_SetErrorType

S
_scalb

scalbln

scalblnf

scalblnl

scalbn

scalbnf

scalbnl

scanf

_scanf_l

scanf_s

_scanf_s_l

_scprintf

_scprintf_l

_scprintf_p

_scprintf_p_l

_scwprintf

_scwprintf_l
_scwprintf_p

_scwprintf_p_l

_searchenv

_searchenv_s

__security_init_cookie

_seh_filter_dll

_seh_filter_exe

_set_abort_behavior

_set_controlfp

_set_doserrno

_set_errno

_set_error_mode

_set_FMA3_enable

_set_fmode

_set_invalid_parameter_handler

_set_new_handler

_set_new_mode

_set_printf_count_output

_set_purecall_handler

_set_se_translator

_set_SSE2_enable

set_terminate

_set_thread_local_invalid_parameter_handler

set_unexpected

setbuf
setjmp

setlocale

_setmaxstdio

_setmbcp

setmode

_setmode

setvbuf

signal

signbit

sin

sinf

sinh

sinhf

sinhl

sinl

snprintf

_snprintf

_snprintf_l

_snprintf_s

_snprintf_s_l

_snscanf

_snscanf_l

_snscanf_s

_snscanf_s_l

_snwprintf
_snwprintf_l

_snwprintf_s

_snwprintf_s_l

_snwscanf

_snwscanf_l

_snwscanf_s

_snwscanf_s_l

sopen

_sopen

_sopen_s

spawnl

_spawnl

spawnle

_spawnle

spawnlp

_spawnlp

spawnlpe

_spawnlpe

spawnv

_spawnv

spawnve

_spawnve

spawnvp

_spawnvp

spawnvpe
_spawnvpe

_splitpath

_splitpath_s

sprintf

_sprintf_l

_sprintf_p

_sprintf_p_l

sprintf_s

_sprintf_s_l

sqrt

sqrtf

sqrtl

srand

sscanf

_sscanf_l

sscanf_s

_sscanf_s_l

_stat

_stat32

_stat32i64

_stat64

_stat64i32

_stati64

_STATIC_ASSERT

_status87
_statusfp

_statusfp2

strcat

strcat_s

strchr

strcmp

strcmpi

strcoll

_strcoll_l

strcpy

strcpy_s

strcspn

_strdate

_strdate_s

_strdec

_strdup

strdup

_strdup_dbg

strerror

_strerror

strerror_s

_strerror_s

strftime

_strftime_l

_stricmp
stricmp

_stricmp_l

_stricoll

_stricoll_l

_strinc

strlen

_strlwr

strlwr

_strlwr_l

_strlwr_s

_strlwr_s_l

strncat

_strncat_l

strncat_s

_strncat_s_l

strncmp

_strncnt

_strncoll

_strncoll_l

strncpy

_strncpy_l

strncpy_s

_strncpy_s_l

_strnextc

_strnicmp
strnicmp

_strnicmp_l

_strnicoll

_strnicoll_l

_strninc

strnlen

strnlen_s

_strnset

strnset

_strnset_l

_strnset_s

_strnset_s_l

strpbrk

strrchr

_strrev

strrev

_strset

strset

_strset_l

_strset_s

_strset_s_l

strspn

_strspnp

strstr

_strtime
_strtime_s

strtod

_strtod_l

strtof

_strtof_l

_strtoi64

_strtoi64_l

strtoimax

_strtoimax_l

strtok

_strtok_l

strtok_s

_strtok_s_l

strtol

_strtol_l

strtold

_strtold_l

strtoll

_strtoll_l

_strtoui64

_strtoui64_l

strtoul

_strtoul_l

strtoull

_strtoull_l
strtoumax

_strtoumax_l

_strupr

strupr

_strupr_l

_strupr_s

_strupr_s_l

strxfrm

_strxfrm_l

swab

_swab

swprintf

_swprintf_l

__swprintf_l

_swprintf_p

_swprintf_p_l

swprintf_s

_swprintf_s_l

swscanf

_swscanf_l

swscanf_s

_swscanf_s_l

system

T
tan

tanf

tanh

tanhf

tanhl

tanl

tell

_tell

_telli64

tempnam

_tempnam

_tempnam_dbg

terminate

tgamma

tgammaf

tgammal

time

_time32

_time64

timespec_get

_timespec32_get

_timespec64_get

tmpfile

tmpfile_s

tmpnam
tmpnam_s

__toascii

toascii

tolower

_tolower

_tolower_l

toupper

_toupper

_toupper_l

towctrans

towlower

_towlower_l

towupper

_towupper_l

trunc

truncf

truncl

tzset

_tzset

U
_ui64toa

_ui64toa_s

_ui64tow

_ui64tow_s
ultoa

_ultoa

_ultoa_s

_ultow

_ultow_s

umask

_umask

_umask_s

__uncaught_exception

unexpected

ungetc

_ungetc_nolock

ungetch

_ungetch

_ungetch_nolock

ungetwc

_ungetwc_nolock

_ungetwch

_ungetwch_nolock

unlink

_unlink

_unlock_file

_utime

_utime32

_utime64
V
va_arg

va_copy

va_end

va_start

_vcprintf

_vcprintf_l

_vcprintf_p

_vcprintf_p_l

_vcprintf_s

_vcprintf_s_l

_vcwprintf

_vcwprintf_l

_vcwprintf_p

_vcwprintf_p_l

_vcwprintf_s

_vcwprintf_s_l

vfprintf

_vfprintf_l

_vfprintf_p

_vfprintf_p_l

vfprintf_s

_vfprintf_s_l

vfscanf

vfscanf_s
vfwprintf

_vfwprintf_l

_vfwprintf_p

_vfwprintf_p_l

vfwprintf_s

_vfwprintf_s_l

vfwscanf

vfwscanf_s

vprintf

_vprintf_l

_vprintf_p

_vprintf_p_l

vprintf_s

_vprintf_s_l

vscanf

vscanf_s

_vscprintf

_vscprintf_l

_vscprintf_p

_vscprintf_p_l

_vscwprintf

_vscwprintf_l

_vscwprintf_p

_vscwprintf_p_l

vsnprintf
_vsnprintf

_vsnprintf_l

vsnprintf_s

_vsnprintf_s

_vsnprintf_s_l

_vsnwprintf

_vsnwprintf_l

_vsnwprintf_s

_vsnwprintf_s_l

vsprintf

_vsprintf_l

_vsprintf_p

_vsprintf_p_l

vsprintf_s

_vsprintf_s_l

vsscanf

vsscanf_s

vswprintf

_vswprintf_l

__vswprintf_l

_vswprintf_p

_vswprintf_p_l

vswprintf_s

_vswprintf_s_l

vswscanf
vswscanf_s

vwprintf

_vwprintf_l

_vwprintf_p

_vwprintf_p_l

vwprintf_s

_vwprintf_s_l

vwscanf

vwscanf_s

W
_waccess

_waccess_s

_wasctime

_wasctime_s

_wassert

_wchdir

_wchmod

_wcreat

_wcreate_locale

wcrtomb

wcrtomb_s

wcscat

wcscat_s

wcschr
wcscmp

wcscoll

_wcscoll_l

wcscpy

wcscpy_s

wcscspn

_wcsdec

_wcsdup

wcsdup

_wcsdup_dbg

_wcserror

__wcserror

_wcserror_s

__wcserror_s

wcsftime

_wcsftime_l

_wcsicmp

wcsicmp

_wcsicmp_l

_wcsicoll

wcsicoll

_wcsicoll_l

_wcsinc

wcslen

_wcslwr
wcslwr

_wcslwr_l

_wcslwr_s

_wcslwr_s_l

wcsncat

_wcsncat_l

wcsncat_s

_wcsncat_s_l

wcsncmp

_wcsncnt

_wcsncoll

_wcsncoll_l

wcsncpy

_wcsncpy_l

wcsncpy_s

_wcsncpy_s_l

_wcsnextc

_wcsnicmp

wcsnicmp

_wcsnicmp_l

_wcsnicoll

_wcsnicoll_l

_wcsninc

wcsnlen

wcsnlen_s
_wcsnset

wcsnset

_wcsnset_l

_wcsnset_s

_wcsnset_s_l

wcspbrk

wcsrchr

_wcsrev

wcsrev

wcsrtombs

wcsrtombs_s

_wcsset

wcsset

_wcsset_l

_wcsset_s

_wcsset_s_l

wcsspn

_wcsspnp

wcsstr

wcstod

_wcstod_l

wcstof

_wcstof_l

_wcstoi64

_wcstoi64_l
wcstoimax

_wcstoimax_l

wcstok

_wcstok_l

wcstok_s

_wcstok_s_l

wcstol

_wcstol_l

wcstold

_wcstold_l

wcstoll

_wcstoll_l

wcstombs

_wcstombs_l

wcstombs_s

_wcstombs_s_l

_wcstoui64

_wcstoui64_l

wcstoul

_wcstoul_l

wcstoull

_wcstoull_l

wcstoumax

_wcstoumax_l

_wcsupr
wcsupr

_wcsupr_l

_wcsupr_s

_wcsupr_s_l

wcsxfrm

_wcsxfrm_l

_wctime

_wctime_s

_wctime32

_wctime32_s

_wctime64

_wctime64_s

wctob

wctomb

_wctomb_l

wctomb_s

_wctomb_s_l

wctrans

wctype

_wdupenv_s

_wdupenv_s_dbg

_wexecl

_wexecle

_wexeclp

_wexeclpe
_wexecv

_wexecve

_wexecvp

_wexecvpe

_wfdopen

_wfindfirst

_wfindfirst32

_wfindfirst32i64

_wfindfirst64

_wfindfirst64i32

_wfindfirsti64

_wfindnext

_wfindnext32

_wfindnext32i64

_wfindnext64

_wfindnext64i32

_wfindnexti64

_wfopen

_wfopen_s

_wfreopen

_wfreopen_s

_wfsopen

_wfullpath

_wfullpath_dbg

_wgetcwd
_wgetcwd_dbg

_wgetdcwd

_wgetdcwd_dbg

_wgetdcwd_nolock

_wgetenv

_wgetenv_s

_wmakepath

_wmakepath_s

wmemchr

wmemcmp

wmemcpy

wmemcpy_s

wmemmove

wmemmove_s

wmemset

_wmkdir

_wmktemp

_wmktemp_s

_wopen

_wperror

_wpopen

wprintf

_wprintf_l

_wprintf_p

_wprintf_p_l
wprintf_s

_wprintf_s_l

_wputenv

_wputenv_s

_wremove

_wrename

_write

write

_wrmdir

wscanf

_wscanf_l

wscanf_s

_wscanf_s_l

_wsearchenv

_wsearchenv_s

_wsetlocale

_wsopen

_wsopen_s

_wspawnl

_wspawnle

_wspawnlp

_wspawnlpe

_wspawnv

_wspawnve

_wspawnvp
_wspawnvpe

_wsplitpath

_wsplitpath_s

_wstat

_wstat32

_wstat32i64

_wstat64

_wstat64i32

_wstati64

_wstrdate

_wstrdate_s

_wstrtime

_wstrtime_s

_wsystem

_wtempnam

_wtempnam_dbg

_wtmpnam

_wtmpnam_s

_wtof

_wtof_l

_wtoi

_wtoi_l

_wtoi64

_wtoi64_l

_wtol
_wtol_l

_wtoll

_wtoll_l

_wunlink

_wutime

_wutime32

_wutime64

X
xor

xor_eq

Да
_y0

y0

_y1

y1

_yn

yn

См. также раздел


Справочник по библиотеке времени выполнения C
abort
Статья • 03.04.2023

Прерывает текущий процесс и возвращает код ошибки.

7 Примечание

Не используйте этот метод для завершения работы приложения Microsoft Store


или приложения универсальная платформа Windows (UWP), за исключением
сценариев тестирования или отладки. Программные или пользовательские
способы закрытия приложения Магазина не допускаются в соответствии с
политиками Microsoft Store. Дополнительные сведения см. в разделе
Жизненный цикл приложения UWP.

Синтаксис
C

void abort( void );

Возвращаемое значение
abort не возвращает управление вызывающему процессу. По умолчанию он
проверяет наличие обработчика прерывания сигнала и вызывает SIGABRT , если он
задан. Затем abort завершает текущий процесс и возвращает код выхода для
родительского процесса.

Примечания
Блок, относящийся только к системам Microsoft

По умолчанию при сборке приложения с использованием отладочной библиотеки


среды выполнения подпрограмма abort выдает сообщение об ошибке, прежде
чем появляется SIGABRT . Для консольных приложений, работающих в режиме
консоли, отправляется сообщение в STDERR . Классические приложения Windows и
консольные приложения, запускаемые в окнах, отображают сообщение в окне
сообщений. Чтобы отключить сообщение, используйте для _set_abort_behavior
очистки флага _WRITE_ABORT_MSG . Отображаемое сообщение зависит от версии
используемой среды выполнения. Для приложений, созданных с использованием
последних версий Visual C++, сообщение выглядит примерно так:

R6010 — вызван метод abort()

В предыдущих версиях библиотеки среды выполнения C отображается следующее


сообщение:

Это приложение запросило завершение среды выполнения необычным


способом. За дополнительной информацией обращайтесь в службу поддержки
приложения.

При компиляции программы в режиме отладки в окне сообщения отображаются


параметры Прервать, Повторить или Пропустить. Если пользователь выбирает
параметр Прервать, программа немедленно завершается и возвращает код выхода
3. Если пользователь выбирает параметр Повторить, вызывается отладчик (если он
доступен) для JIT-отладки. Если пользователь выбирает Игнорировать, abort
продолжится обычная обработка.

Затем и в окончательной, и в отладочной сборке abort проверяет, задает ли


обработчик прерывания сигнала. Если задан обработчик сигнала, не используемый
по умолчанию, abort вызывает raise(SIGABRT) . Используйте функцию signal ,
чтобы связать функцию обработчика сигнала прерывания с сигналом SIGABRT . Вы
можете выполнить пользовательские действия — например, освободить ресурсы
или записать данные сведений — и завершить работу приложения с кодом ошибки
в функции обработчика. Если пользовательский обработчик сигнала не определен,
abort не вызывает SIGABRT сигнал.

По умолчанию в неотладочных сборках классических или консольных приложений


abort затем вызывает механизм службы отчеты об ошибках Windows (прежнее
название — Доктор Уотсон), чтобы сообщить о сбоях в корпорацию Майкрософт.
Это поведение можно включить или отключить, вызвав _set_abort_behavior и
задав или замаскировав флаг _CALL_REPORTFAULT . При установке флага Windows
отображает окно сообщения с текстом вроде "Ошибка привела к тому, что
программа перестала работать правильно". Пользователь может вызвать отладчик
с помощью кнопки Отладка или кнопку Закрыть программу , чтобы завершить
работу приложения с кодом ошибки, определенным операционной системой.

Если обработчик отчетов об ошибках Windows не вызывается, вызывает abort _exit


для завершения процесса с кодом выхода 3 и возвращает управление
родительскому процессу или операционной системе. _exit не очищает буферы
потока и не выполняет обработку atexit / _onexit .

Для обеспечения совместимости Windows при abort вызове _exit он может


вызывать API Windows ExitProcess , что, в свою очередь, позволяет выполнять
процедуры завершения dll. Деструкторы не выполняются в исполняемом файле, но
это может быть не так и для библиотек DLL, загруженных в пространство
процессов исполняемого файла. Такое поведение не соответствует стандарту C++.
Чтобы немедленно завершить процесс, включающий все библиотеки DLL,
используйте API Windows TerminateProcess . Можно также зарегистрировать
обработчик сигнала прерывания, который вызывает TerminateProcess для
выполнения стандартного поведения. Совместимость Windows может привести к
некоторым затратам.

Дополнительные сведения об отладке CRT см. в разделе Методы отладки CRT.

Окончание конкретной службы Майкрософт

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

abort <process.h> или <stdlib.h>

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

// crt_abort.c

// compile with: /TC

// This program demonstrates the use of

// the abort function by attempting to open a file

// and aborts if the attempt fails.

#include <stdio.h>

#include <stdlib.h>

int main( void )

FILE *stream = NULL;

errno_t err = 0;

err = fopen_s(&stream, "NOSUCHF.ILE", "r" );

if ((err != 0) || (stream == NULL))

perror( "File could not be opened" );

abort();

else

fclose( stream );

Output

File could not be opened: No such file or directory

См. также раздел


Используя abort

Функция

Управление процессами и средой

_exec, _wexec функции

exit, _Exit, _exit

raise

signal

_spawn, _wspawn functions


_DEBUG

_set_abort_behavior
abs , labs , llabs , _abs64
Статья • 03.04.2023

Вычисляет абсолютное значение аргумента.

Синтаксис
C

int abs( int n );

long labs( long n );

long long llabs( long long n );

__int64 _abs64( __int64 n );

C++

long abs( long n ); // C++ only

long long abs( long long n ); // C++ only

double abs( double n ); // C++ only

long double abs( long double n ); // C++ only

float abs( float n ); // C++ only

Параметры
n

Числовое значение.

Возвращаемое значение
Функции abs и llabs , labs а _abs64 также возвращают абсолютное значение
параметра n . Ошибка не возвращается.

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки abs , которые
принимают и возвращают значения long , long long , float , double и long double .
Эти перегрузки определяются в заголовке <cmath> . В программе abs C всегда
принимает и возвращает значение int .
Для конкретной корпорации Майкрософт диапазон отрицательных целых чисел,
представленных в любом целочисленном типе, больше диапазона положительных
целых чисел, представляемых в этом типе. Таким образом, можно указать аргумент
для этих функций, которые нельзя преобразовать. Если абсолютное значение
аргумента не может быть представлено типом возвращаемого значения, abs
функции возвращают значение аргумента без изменений. В частности abs(INT_MIN)
возвращает INT_MIN , labs(LONG_MIN) возвращает LONG_MIN , llabs(LLONG_MIN)
возвращает LLONG_MIN , а _abs64(_I64_MIN) возвращает _I64_MIN . Фактически
функции abs нельзя использовать для гарантии положительного значения.

Требования
Подпрограмма Обязательный заголовок Обязательный заголовок C++
C

abs , labs , llabs <math.h> или <stdlib.h> <cmath> , <cstdlib> , <stdlib.h> или <math.h>

_abs64 <stdlib.h> <cstdlib> или <stdlib.h>

Чтобы использовать перегруженные abs версии C++, необходимо включить


<cmath> заголовок.

Пример
Эта программа вычисляет и отображает абсолютные значения несколько чисел.

// crt_abs.c

// Build: cl /W3 /TC crt_abs.c

// This program demonstrates the use of the abs function

// by computing and displaying the absolute values of

// several numbers.

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#include <limits.h>

int main( void )

int ix = -4;

long lx = -41567L;

long long llx = -9876543210LL;

__int64 wx = -1;

// absolute 32 bit integer value

printf_s("The absolute value of %d is %d\n", ix, abs(ix));

// absolute long integer value

printf_s("The absolute value of %ld is %ld\n", lx, labs(lx));

// absolute long long integer value

printf_s("The absolute value of %lld is %lld\n", llx, llabs(llx));

// absolute 64 bit integer value

printf_s("The absolute value of 0x%.16I64x is 0x%.16I64x\n", wx,

_abs64(wx));

// Integer error cases:

printf_s("Microsoft implementation-specific results:\n");

printf_s(" abs(INT_MIN) returns %d\n", abs(INT_MIN));

printf_s(" labs(LONG_MIN) returns %ld\n", labs(LONG_MIN));

printf_s(" llabs(LLONG_MIN) returns %lld\n", llabs(LLONG_MIN));

printf_s(" _abs64(_I64_MIN) returns 0x%.16I64x\n", _abs64(_I64_MIN));

Output

The absolute value of -4 is 4

The absolute value of -41567 is 41567

The absolute value of -9876543210 is 9876543210

The absolute value of 0xffffffffffffffff is 0x0000000000000001

Microsoft implementation-specific results:

abs(INT_MIN) returns -2147483648

labs(LONG_MIN) returns -2147483648

llabs(LLONG_MIN) returns -9223372036854775808

_abs64(_I64_MIN) returns 0x8000000000000000

См. также:
Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


_cabs

fabs, fabsf, fabsl

imaxabs
access (CRT)
Статья • 03.04.2023

Имя access функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _access для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _access или функцию с повышенным


_access_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".
_access , _waccess
Статья • 03.04.2023

Определяет, доступен ли файл только для чтения или нет. Доступны более
безопасные версии; see _access_s, _waccess_s.

Синтаксис
C

int _access(

const char *path,

int mode

);

int _waccess(

const wchar_t *path,


int mode

);

Параметры
path

Путь к файлу или каталогу.

mode

Атрибут чтения и записи.

Возвращаемое значение
Если файл имеет заданный режим, все функции возвращают значение 0. Функция
возвращает значение -1, если именованный файл не существует или не имеет
заданного режима; в этом случае устанавливается, errno как показано в
следующей таблице.

Значение Описание

EACCES Доступ запрещен: параметр разрешения файла не разрешает указанный доступ.

ENOENT Имя файла или путь не найдены.

EINVAL Недопустимый параметр.


Дополнительные сведения об этих и других кодах возврата см. в разделе errno,
_doserrnoи _sys_nerr_sys_errlist.

Комментарии
При использовании с файлами функция _access определяет, существует ли
указанный файл или каталог и имеет ли он атрибуты, указанные в значении mode .
При использовании с каталогами _access определяет, существует ли указанный
каталог; в операционных системах Windows 2000 и более поздних версий все
каталоги имеют доступ на чтение и запись.

Значение mode Проверяет файл на

00 Существование

02 Только на запись

04 Только для чтения

06 Чтение и запись

Эта функция проверяет, доступен ли файл и каталог только для чтения или нет, он
не проверяет параметры безопасности файловой системы. Для этого требуется
токен доступа. Дополнительные сведения о безопасности файловой системы см. в
разделе "Маркеры доступа". Для предоставления этой функции существует класс
ATL; См CAccessToken . класс.

_waccess — это версия _access с расширенными символами; аргумент path для


_waccess — строка расширенных символов. Поведение _waccess и _access

идентично в противном случае.

Эта функция проверяет свои параметры. Если path режим NULL является
допустимым или mode не указан, вызывается обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, функция устанавливает параметр errno в значение
EINVAL и возвращает –1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста


Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_taccess _access _access _waccess

Требования
Подпрограмма Обязательный заголовок Необязательные заголовки

_access <io.h> <errno.h>

_waccess <wchar.h> или <io.h> <errno.h>

Пример
Следующий пример используется _access для проверки именованного
crt_ACCESS.C файла, чтобы узнать, существует ли он и разрешено ли запись.

// crt_access.c

// compile with: /W1

// This example uses _access to check the file named

// crt_ACCESS.C to see if it exists and if writing is allowed.

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

int main( void )

// Check for existence.

if( (_access( "crt_ACCESS.C", 0 )) != -1 )

printf_s( "File crt_ACCESS.C exists.\n" );

// Check for write permission.

// Assume file is read-only.

if( (_access( "crt_ACCESS.C", 2 )) == -1 )

printf_s( "File crt_ACCESS.C does not have write permission.\n"


);

Output
File crt_ACCESS.C exists.

File crt_ACCESS.C does not have write permission.

См. также раздел


Обработка файлов

_chmod, _wchmod

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

_open, _wopen

_stat, _wstat функции


_access_s , _waccess_s
Статья • 03.04.2023

Определяет разрешения на чтение и запись файлов. Эти функции являются


версиями _accessс усовершенствованиями безопасности, _waccess описанными в
разделе Функции безопасности в CRT.

Синтаксис
C

errno_t _access_s(

const char *path,

int mode

);

errno_t _waccess_s(

const wchar_t *path,


int mode

);

Параметры
path

Путь к файлу или каталогу.

mode

Настройка разрешений.

Возвращаемое значение
Если файл имеет заданный режим, все функции возвращают значение 0. Функция
возвращает код ошибки, если именованный файл не существует или недоступен в
заданном режиме. Код ошибки выбирается из набора описанным ниже образом и
присваивает errno такое же значение.

Значение Условие
errno

EACCES Доступ запрещен. Параметр разрешений файла не разрешает указанный


доступ.
Значение Условие
errno

ENOENT Имя файла или путь не найдены.

EINVAL Недопустимый параметр.

Дополнительные сведения см. в разделах errno, _doserrno, _sys_errlistи _sys_nerr.

Комментарии
При использовании с файлами функция _access_s определяет, существует ли
указанный файл и можно ли получить к нему доступ согласно значению mode . При
использовании с каталогами функция _access_s определяет, существует ли
указанный каталог. В операционных системах Windows 2000 и более поздних
версий все каталоги имеют доступ на чтение и запись.

Значение mode Проверяет файл на

00 Существование.

02 Разрешение на запись.

04 Разрешение на чтение.

06 Разрешение на чтение и запись.

Разрешения на чтение или запись файла недостаточно, чтобы обеспечить


возможность открытия файла. Например, если файл заблокирован другим
процессом, он может оказаться недоступным, даже если _access_s возвращает
значение 0.

_waccess_s — это версия _access_s с расширенными символами, где аргумент path


для _waccess_s представляет собой строку расширенных символов. В противном
случае поведение _waccess_s и _access_s идентично.

Эти функции проверяют свои параметры. Если path параметр имеет NULL значение
или mode не указывает допустимый режим, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_taccess_s _access_s _access_s _waccess_s

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_access_s <io.h> <errno.h>

_waccess_s <wchar.h> или <io.h> <errno.h>

Пример
В этом примере для проверки файла с именем crt_access_s.на существование и
возможность записи используется _access_s .

// crt_access_s.c

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

int main( void )

errno_t err = 0;

// Check for existence.

if ((err = _access_s( "crt_access_s.c", 0 )) == 0 )

printf_s( "File crt_access_s.c exists.\n" );

// Check for write permission.

if ((err = _access_s( "crt_access_s.c", 2 )) == 0 )

printf_s( "File crt_access_s.c does have "

"write permission.\n" );

else

printf_s( "File crt_access_s.c does not have "

"write permission.\n" );

else

printf_s( "File crt_access_s.c does not exist.\n" );

Output

File crt_access_s.c exists.

File crt_access_s.c does not have write permission.

См. также раздел


Обработка файлов

_access, _waccess

_chmod, _wchmod

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

_open, _wopen

_stat, _wstat функции


acos , acosf , acosl
Статья • 03.04.2023

Вычисляет арккосинус.

Синтаксис
C

double acos( double x );

float acosf( float x );


long double acosl( long double x );

#define acos(X) // Requires C11 or higher

float acos( float x ); // C++ only

long double acos( long double x ); // C++ only

Параметры
x

Значение от -1 до 1, для которого вычисляется арккосинус (обратный косинус).

Возвращаемое значение
Функция acos возвращает арккосинус x в диапазоне от 0 до радиан π.

По умолчанию, если x значение меньше -1 или больше 1, acos возвращает


неопределенное значение.

Входные данные Исключение SEH _matherr Исключение

± INF INVALID _DOMAIN

± QNaN, IND нет _DOMAIN

|x| > 1 INVALID _DOMAIN

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции acos ,
принимающие и возвращающие типы float и long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, acos всегда
принимает и возвращает . double

Если вы используете acos макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок Необязательные заголовки

acos , acosf , acosl <math.h> <errno.h>

acos Макрос <tgmath.h>

Пример
Эта программа предлагает ввести значение в диапазоне от -1 до 1. Входные
значения вне этого диапазона вызывают сообщения об ошибке _DOMAIN . Если
введено допустимое значение, программа выводит на экран арксинус и арккосинус
этого значения.

// crt_asincos.c

// arguments: 0

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

int main( int ac, char* av[] )

double x,

y;

errno_t err;

// argument checking

if (ac != 2)

fprintf_s( stderr, "Usage: %s <number between -1 and 1>\n",

av[0]);

return 1;

// Convert argument into a double value

if ((err = sscanf_s( av[1], "%lf", &x )) != 1)

fprintf_s( stderr, "Error converting argument into ",

"double value.\n");

return 1;

// Arcsine of X

y = asin( x );

printf_s( "Arcsine of %f = %f\n", x, y );

// Arccosine of X

y = acos( x );

printf_s( "Arccosine of %f = %f\n", x, y );

Output

Arcsine of 0.000000 = 0.000000

Arccosine of 0.000000 = 1.570796

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
asin, asinf, asinl

atan, atanf, atanl, atan2, atan2f, atan2l

cos, cosf, cosl

_matherr

sin, sinf, sinl

tan, tanf, tanl


acosh , acoshf , acoshl
Статья • 03.04.2023

Вычисляет обратный гиперболический косинус.

Синтаксис
C

double acosh( double x );

float acoshf( float x );

long double acoshl( long double x );


#define acosh(X) // Requires C11 or higher

float acosh( float x ); // C++ only

long double acosh( long double x ); // C++ only

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функции acosh возвращают обратный гиперболический косинус (гиперболический
козинус дуги) из x . Эти функции допустимы в домене значений x ≥ 1. Если x
меньше 1, errno для параметра задано значение EDOM , а результатом является
тихий naN. Если x является несигнальным значением NaN, неопределенным или
бесконечным, возвращается то же значение.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND, INF нет нет

x< 1 нет нет

Комментарии
При использовании C++ можно вызывать перегрузки acosh , которые принимают
и возвращают значения float или long double . В программе на языке C, если вы
не используете <макрос tgmath.h> для вызова этой функции, acosh всегда
принимает и возвращает . double

Если вы используете <макрос tgmath.h> acosh() , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

acosh , acoshf , acoshl <math.h> <cmath>

acosh Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_acosh.c

// Compile by using: cl /W4 crt_acosh.c

// This program displays the hyperbolic cosine of pi / 4

// and the arc hyperbolic cosine of the result.

#include <math.h>

#include <stdio.h>

int main( void )

double pi = 3.1415926535;

double x, y;

x = cosh( pi / 4 );

y = acosh( x );

printf( "cosh( %f ) = %f\n", pi/4, x );

printf( "acosh( %f ) = %f\n", x, y );

Output
cosh( 0.785398 ) = 1.324609

acosh( 1.324609 ) = 0.785398

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
asinh, asinhf, asinhl

atanh, atanhf, atanhl


cosh, coshf, coshl

sinh, sinhf, sinhl

tanh, tanhf, tanhl


_aligned_free
Статья • 03.04.2023

Освобождает блок памяти, выделенный с _aligned_malloc или _aligned_offset_malloc.

Синтаксис
C

void _aligned_free (

void *memblock

);

Параметры
memblock

Указатель на блок памяти, возвращенный в функцию _aligned_malloc или


_aligned_offset_malloc .

Комментарии
Функция _aligned_free помечена как __declspec(noalias) ; это означает, что
функция гарантировано не изменяет глобальные переменные. Для получения
дополнительной информации см. noalias.

Эта функция не проверяет его параметр, в отличие от других _aligned функций CRT.
Если memblock представляет собой указатель NULL , эта функция просто не
выполняет никаких действий. Он не изменяется errno и не вызывает обработчик
недопустимых параметров. Если в функции произошла ошибка, так как _aligned
функции не использовались для выделения блока памяти или неправильного
распределения памяти возникает из-за непредвиденного бедствия, функция
создает отчет об отладке из _RPTмакросов , _RPTF_RPTW_RPTFW а также макросов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_free <malloc.h>

Пример
Для получения дополнительной информации см. _aligned_malloc.

См. также
Выравнивание данных
_aligned_free_dbg
Статья • 03.04.2023

Освобождает блок памяти, выделенный с помощью или _aligned_offset_malloc


(только для _aligned_malloc отладки).

Синтаксис
C

void _aligned_free_dbg(

void *memblock

);

Параметры
memblock

Указатель на блок памяти, возвращенный в функцию _aligned_malloc или


_aligned_offset_malloc.

Комментарии
Функция _aligned_free_dbg является отладочной версией _aligned_free функции.
Если _DEBUG параметр не определен, каждый вызов _aligned_free_dbg сводится к
вызову _aligned_free . И _aligned_free , и _aligned_free_dbg освобождают блок
памяти в основной куче, однако _aligned_free_dbg включает возможность отладки:
возможность хранить освободившиеся блоки в связанном списке кучи для
моделирования условий недостатка памяти.

_aligned_free_dbg выполняет проверку действительности для всех указанных

файлов и расположений блоков перед выполнением операции освобождения.


Приложение не должно предоставлять эти сведения. При освобождении блока
памяти диспетчер отладочной кучи автоматически проверяет целостность буферов
по обе стороны пользовательской части. Он выдает отчет об ошибках, если
произошла перезапись. _CRTDBG_DELAY_FREE_MEM_DF Если задано битовое _crtDbgFlag
поле флага, освобожденный блок заполняется значением, 0xDD, назначается
_FREE_BLOCK тип блока и сохраняется в связанном списке блоков памяти кучи.
В случае возникновения ошибки при освобождении памяти для errno задаются
сведения о характере сбоя, полученные от операционной системы.
Дополнительные сведения см. в разделах errno, _doserrno, _sys_errlistи _sys_nerr.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_free_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Подпрограммы отладки
_aligned_malloc
Статья • 03.04.2023

Размещение памяти на указанной границе выравнивания.

Синтаксис
C

void * _aligned_malloc(

size_t size,

size_t alignment

);

Параметры
size

Размер запрошенного выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

Возвращаемое значение
Указатель на выделенный блок памяти или значение NULL в случае сбоя операции.
Указатель делится на alignment .

Комментарии
Функция _aligned_malloc основана на функции malloc.

_aligned_malloc помечается __declspec(noalias) и __declspec(restrict) означает,

что функция гарантированно не будет изменять глобальные переменные, а


возвращаемый указатель не имеет псевдонима. Дополнительные сведения см. в
разделах noalias и restrict.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о errno см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr. Кроме того,
_aligned_malloc проверяет свои параметры. Если alignment значение не равно 2

или size равно нулю, эта функция вызывает обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эта функция возвращает NULL и задает для errno значение
EINVAL .

Используйте для _aligned_free освобождения памяти, полученной как, так


_aligned_malloc и _aligned_offset_malloc . Не используйте free , который не
освобождает выровненную память правильно и может привести к
труднодиагностируемым ошибкам.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок C Заголовок C++

_aligned_malloc <malloc.h> <cstdlib>

Пример
C

// crt_aligned_malloc.c

#include <malloc.h>

#include <stdio.h>

int main() {

void *ptr;

size_t alignment,

off_set;

// Note alignment should be 2^N where N is any positive int.

alignment = 16;

off_set = 5;

// Using _aligned_malloc

ptr = _aligned_malloc(100, alignment);

if (ptr == NULL)

printf_s( "Error allocation aligned memory.");

return -1;

if (((unsigned long long)ptr % alignment ) == 0)

printf_s( "This pointer, %p, is aligned on %zu\n",

ptr, alignment);

else

printf_s( "This pointer, %p, is not aligned on %zu\n",

ptr, alignment);

// Using _aligned_realloc

ptr = _aligned_realloc(ptr, 200, alignment);

if ( ((unsigned long long)ptr % alignment ) == 0)

printf_s( "This pointer, %p, is aligned on %zu\n",

ptr, alignment);

else

printf_s( "This pointer, %p, is not aligned on %zu\n",

ptr, alignment);

_aligned_free(ptr);

// Using _aligned_offset_malloc

ptr = _aligned_offset_malloc(200, alignment, off_set);

if (ptr == NULL)

printf_s( "Error allocation aligned offset memory.");

return -1;

if ( ( (((unsigned long long)ptr) + off_set) % alignment ) == 0)

printf_s( "This pointer, %p, is offset by %zu on alignment of


%zu\n",

ptr, off_set, alignment);

else

printf_s( "This pointer, %p, does not satisfy offset %zu "

"and alignment %zu\n",ptr, off_set, alignment);

// Using _aligned_offset_realloc

ptr = _aligned_offset_realloc(ptr, 200, alignment, off_set);

if (ptr == NULL)

printf_s( "Error reallocation aligned offset memory.");

return -1;

if ( ( (((unsigned long long)ptr) + off_set) % alignment ) == 0)

printf_s( "This pointer, %p, is offset by %zu on alignment of


%zu\n",

ptr, off_set, alignment);

else

printf_s( "This pointer, %p, does not satisfy offset %zu and "

"alignment %zu\n", ptr, off_set, alignment);

// Note that _aligned_free works for both _aligned_malloc

// and _aligned_offset_malloc. Using free is illegal.

_aligned_free(ptr);

Output
This pointer, 3280880, is aligned on 16

This pointer, 3280880, is aligned on 16

This pointer, 3280891, is offset by 5 on alignment of 16

This pointer, 3280891, is offset by 5 on alignment of 16

См. также раздел


Выравнивание данных
_aligned_malloc_dbg
Статья • 03.04.2023

Выделяет память на указанной границе выравнивания с дополнительным


пространством для заголовка отладки и буферов перезаписи (только для
отладочной версии).

Синтаксис
C

void * _aligned_malloc_dbg(

size_t size,

size_t alignment,

const char *filename,

int linenumber

);

Параметры
size

Размер запрошенного выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Указатель на выделенный блок памяти или значение NULL в случае сбоя операции.

Комментарии
_aligned_malloc_dbg — отладочная версия _aligned_malloc функции. Если _DEBUG

параметр не определен, каждый вызов _aligned_malloc_dbg сводится к вызову


_aligned_malloc . И _aligned_malloc , и _aligned_malloc_dbg выполняют выделение

блока памяти в основной куче, однако _aligned_malloc_dbg включает различные


возможности отладки: буферы на обеих сторонах пользовательской части блока
для тестирования утечек и сведения о filename / linenumber для определения
источника запросов на выделение. Отслеживание определенных типов выделения
с помощью параметра типа блока не поддерживает функцию отладки для
выровненных выделений. Выровненные выделения будут отображаться как
_NORMAL_BLOCK тип блока.

_aligned_malloc_dbg выделяет блок памяти, добавив немного больше пространства,

чем запрошено size . Дополнительное пространство используется диспетчером


отладочной кучи для связывания блоков отладочной памяти и предоставления
приложению сведений о заголовках отладки и перезаписи буферов. При
выделении блока пользовательская часть блока заполняется значением 0xCD, а
каждый буфер перезаписи заполняется 0xFD.

_aligned_malloc_dbg задает для errno значение ENOMEM в случае сбоя выделения


памяти или если необходимый объем памяти (включая ранее упомянутую
нагрузку) превышает _HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в
разделеerrno , _doserrno, _sys_errlistи _sys_nerr. Кроме того, _aligned_malloc_dbg
проверяет свои параметры. Если alignment значение не равно 2 или size равно
нулю, эта функция вызывает обработчик недопустимых параметров, как описано в
разделе Проверка параметров. Если продолжение выполнения разрешено, эта
функция возвращает NULL и задает для errno значение EINVAL .

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_malloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки
_aligned_msize
Статья • 03.04.2023

Возвращает размер блока памяти, выделенного в куче.

Синтаксис
C

size_t _aligned_msize(

void *memblock,

size_t alignment,

size_t offset

);

Параметры
memblock

Указатель на блок памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

Возвращаемое значение
Возвращает размер (в байтах) как целое число без знака.

Комментарии
Функция _aligned_msize возвращает размер (в байтах) блока памяти, выделенного
вызовом _aligned_malloc или _aligned_realloc. Значения alignment и offset должны
совпадать со значениями, которые были переданы функции, выделившей блок.

Если приложение связано с отладочной версией библиотек времени выполнения


C, _aligned_msize разрешается в _aligned_msize_dbg. Дополнительные сведения об
управлении кучи во время отладки см. в разделе Отладочная куча CRT.
Эта функция проверяет свои параметры. Если memblock является пустым указателем
или alignment не имеет значения 2, _aligned_msize вызывает обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
ошибка обработана, функция задает для параметра errno значение EINVAL и
возвращает -1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_msize <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Выделение памяти
_aligned_msize_dbg
Статья • 03.04.2023

Возвращает размер блока памяти, выделенного в куче (только в отладочной


версии).

Синтаксис
C

size_t _aligned_msize_dbg(

void *memblock,

size_t alignment,

size_t offset

);

Параметры
memblock

Указатель на блок памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

Возвращаемое значение
Возвращает размер (в байтах) как целое число без знака.

Комментарии
Значения alignment и offset должны совпадать со значениями, которые были
переданы функции, выделившей блок.

_aligned_msize_dbg — отладочная версия _aligned_msize функции. Если _DEBUG


параметр не определен, каждый вызов _aligned_msize_dbg сводится к вызову
_aligned_msize . Обе функции, _aligned_msize и _aligned_msize_dbg , вычисляют

размер блока памяти в основной куче, но _aligned_msize_dbg добавляет функцию


отладки: она включает в возвращаемый размер буферы с обеих сторон
пользовательской части блока памяти.

Эта функция проверяет свои параметры. Если memblock является пустым указателем
или alignment не имеет значения 2, _msize вызывает обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если ошибка
обработана, функция задает для параметра errno значение EINVAL и возвращает
-1.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_msize_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Выделение памяти
_aligned_offset_malloc
Статья • 03.04.2023

Размещение памяти на указанной границе выравнивания.

Синтаксис
C

void * _aligned_offset_malloc(

size_t size,

size_t alignment,

size_t offset

);

Параметры
size

Размер запрошенного выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

Возвращаемое значение
Указатель на выделенный блок памяти или значение NULL в случае сбоя операции.

Комментарии
_aligned_offset_malloc можно использовать в ситуациях, когда необходимо

выравнивание вложенного элемента, например, если требуется выравнивание


вложенного класса.

_aligned_offset_malloc основан на malloc ; дополнительные сведения см. в разделе


malloc.
_aligned_offset_malloc помечается __declspec(noalias) и

__declspec(restrict) означает, что функция гарантированно не изменяет


глобальные переменные и что возвращенный указатель не является псевдонимом.
Дополнительные сведения см. в разделах noalias и restrict.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о errno , см. в разделе errno, , _doserrno_sys_errlistи _sys_nerr. Кроме того,
_aligned_offset_malloc проверяет свои параметры. Если alignment значение не

равно 2 или offset не равно нулю и больше или равно size , эта функция вызывает
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, эта функция возвращает
NULL и задает для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_offset_malloc <malloc.h>

Пример
Для получения дополнительной информации см. _aligned_malloc.

См. также
Выравнивание данных
_aligned_offset_malloc_dbg
Статья • 03.04.2023

Размещение памяти на указанной границе выравнивания (только в отладочной


версии).

Синтаксис
C

void * _aligned_offset_malloc_dbg(

size_t size,

size_t alignment,

size_t offset,

const char *filename,

int linenumber

);

Параметры
size

Размер запрошенного выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Указатель на выделенный блок памяти или значение NULL в случае сбоя операции.
Комментарии
_aligned_offset_malloc_dbg — отладочная версия _aligned_offset_malloc функции.

Если _DEBUG параметр не определен, каждый вызов _aligned_offset_malloc_dbg


сводится к вызову _aligned_offset_malloc . И _aligned_offset_malloc , и
_aligned_offset_malloc_dbg выполняют выделение блока памяти в основной куче,

однако _aligned_offset_malloc_dbg включает различные возможности отладки:


буферы на обеих сторонах пользовательской части блока для тестирования утечек
и сведения о filename / linenumber для определения источника запросов на
выделение. Отслеживание определенных типов выделения с помощью параметра
типа блока не поддерживает функцию отладки для выровненных выделений.
Выровненные выделения будут отображаться как _NORMAL_BLOCK тип блока.

_aligned_offset_malloc_dbg выделяет блок памяти, добавив немного больше

пространства, чем запрошено size . Дополнительное пространство используется


диспетчером отладочной кучи для связывания блоков отладочной памяти и
предоставления приложению сведений о заголовках отладки и перезаписи
буферов. При выделении блока пользовательская часть блока заполняется
значением 0xCD, а каждый буфер перезаписи заполняется 0xFD.

_aligned_offset_malloc_dbg можно использовать в ситуациях, когда необходимо

выравнивание вложенного элемента, например, если требуется выравнивание


вложенного класса.

_aligned_offset_malloc_dbg основан на malloc ; дополнительные сведения см. в


разделе malloc.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о errno см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr. Кроме того,
_aligned_offset_malloc проверяет свои параметры. Если alignment значение не
равно 2 или offset значение не равно нулю и больше или равно size , эта функция
вызывает обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если продолжение выполнения разрешено, эта функция возвращает
NULL и задает для errno значение EINVAL .

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Сведения о типах блоков выделения и их использовании см. в разделе Типы


блоков в отладочной куче.
Требования
Подпрограмма Обязательный заголовок

_aligned_offset_malloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки
_aligned_offset_realloc
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_mallocвыделенного .

Синтаксис
C

void * _aligned_offset_realloc(

void *memblock,

size_t size,

size_t alignment,

size_t offset

);

Параметры
memblock

Указатель текущего блока памяти.

size

Размер выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

Возвращаемое значение
_aligned_offset_realloc возвращает указатель void на перераспределенный (и,
возможно, перемещенный) блок памяти. Возвращаемое значение — NULL если
размер равен нулю, а аргумент буфера — нет NULL , или если недостаточно
доступной памяти для расширения блока до заданного размера. В первом случае
исходный блок освобождается. Во втором случае исходный блок не изменяется.
Возвращаемое значение указывает на дисковое пространство, подходящее для
хранения любого типа объекта. Чтобы получить указатель на тип, отличный от
void , используйте приведение типов для возвращаемого значения.

_aligned_offset_realloc помечается __declspec(noalias) и

__declspec(restrict) означает, что функция гарантированно не изменяет


глобальные переменные и что возвращенный указатель не является псевдонимом.
Дополнительные сведения см. в разделах noalias и restrict.

Комментарии
Например _aligned_offset_malloc, _aligned_offset_realloc позволяет выровнять
структуру по смещениям в структуре.

Функция _aligned_offset_realloc основана на функции malloc . Дополнительные


сведения об использовании _aligned_offset_malloc см. в разделе malloc. Если
функция memblock имеет значение NULL , она вызывает _aligned_offset_malloc
внутри системы.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о , см. в errno разделе errno, _doserrnoи _sys_nerr_sys_errlist. Кроме того,
_aligned_offset_realloc проверяет свои параметры. Если alignment значение не

равно 2 или offset не равно нулю size , эта функция вызывает обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эта функция возвращает NULL и задает для
errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_offset_realloc <malloc.h>

Пример
Для получения дополнительной информации см. _aligned_malloc.
См. также
Выравнивание данных
_aligned_offset_realloc_dbg
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного с _aligned_malloc помощью или


_aligned_offset_malloc (только для отладочной версии).

Синтаксис
C

void * _aligned_offset_realloc_dbg(

void *memblock,

size_t size,

size_t alignment,

size_t offset,

const char *filename,

int linenumber

);

Параметры
memblock

Указатель текущего блока памяти.

size

Размер выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

filename

Указатель на имя исходного файла, запрашивающего aligned_offset_realloc


операцию, или NULL .

linenumber

Номер строки в исходном файле, в котором была запрошена


aligned_offset_realloc операция, или NULL .
Возвращаемое значение
_aligned_offset_realloc_dbg возвращает указатель void на перераспределенный (и,

возможно, перемещенный) блок памяти. Возвращаемое значение равно NULL ,


если размер равен нулю, а аргумент буфера не NULL равен , или если недостаточно
доступной памяти для расширения блока до заданного размера. В первом случае
исходный блок освобождается. Во втором случае исходный блок не изменяется.
Возвращаемое значение указывает на дисковое пространство, подходящее для
хранения объектов любого типа. Чтобы получить указатель на тип, отличающийся
от void, используйте приведение типа для возвращаемого значения.

Комментарии
_aligned_offset_realloc_dbg — отладочная версия _aligned_offset_realloc функции.
Если _DEBUG параметр не определен, каждый вызов _aligned_offset_realloc_dbg
сводится к вызову _aligned_offset_realloc . И _aligned_offset_realloc , и
_aligned_offset_realloc_dbg перераспределять блок памяти в базовой куче, но
_aligned_offset_realloc_dbg вмещает несколько функций отладки: буферы по обе

стороны от пользовательской части блока для проверки на наличие утечек и


filename / linenumber сведения для определения источника запросов на выделение.

Отслеживание определенных типов выделения с помощью параметра типа блока


не поддерживает функцию отладки для выровненных выделений. Выровненные
выделения будут отображаться как _NORMAL_BLOCK тип блока.

Как и _aligned_offset_malloc, _aligned_offset_realloc_dbg позволяет выровнять


структуру по смещению внутри структуры.

_realloc_dbg повторно выделяет указанный блок памяти, добавив немного больше


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

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о errno см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr. Кроме того,
_aligned_offset_realloc_dbg проверяет свои параметры. Если alignment значение
не равно 2 или значение offset не равно нулю и больше или равно size , эта
функция вызывает обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если продолжение выполнения разрешено, эта функция
возвращает NULL и задает для errno значение EINVAL .

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_offset_realloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки
_aligned_offset_recalloc
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc инициализирует память на 0.

Синтаксис
C

void * _aligned_offset_recalloc(

void *memblock,

size_t num,

size_t size,

size_t alignment,

size_t offset

);

Параметры
memblock

Указатель текущего блока памяти.

number

Число элементов.

size

Длина каждого элемента в байтах.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

Возвращаемое значение
_aligned_offset_recalloc возвращает указатель void на перераспределенный (и,

возможно, перемещенный) блок памяти. Возвращаемое значение — NULL если


размер равен нулю, а аргумент буфера — нет NULL , или если недостаточно
доступной памяти для расширения блока до заданного размера. В первом случае
исходный блок освобождается. Во втором случае исходный блок не изменяется.
Возвращаемое значение указывает на дисковое пространство, подходящее для
хранения любого типа объекта. Чтобы получить указатель на тип, отличающийся от
void, используйте приведение типа для возвращаемого значения.

_aligned_offset_recalloc помечается __declspec(noalias) и

__declspec(restrict) означает, что функция гарантированно не изменяет

глобальные переменные и что возвращенный указатель не является псевдонимом.


Дополнительные сведения см. в разделах noalias и restrict.

Комментарии
Например _aligned_offset_malloc, _aligned_offset_recalloc позволяет выровнять
структуру по смещениям в структуре.

Функция _aligned_offset_recalloc основана на функции malloc . Дополнительные


сведения об использовании _aligned_offset_malloc см. в разделе malloc. Если
функция memblock имеет значение NULL , она вызывает _aligned_offset_malloc
внутри системы.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти, а
также если запрошенный размер ( number * size ) был больше _HEAP_MAXREQ .
Дополнительные сведения о , см. в errno разделе errno, _doserrnoи
_sys_nerr_sys_errlist. Кроме того, _aligned_offset_recalloc проверяет свои
параметры. Если alignment значение не равно 2 или offset не равно нулю и
больше запрошенного size , эта функция вызывает обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, эта функция возвращает NULL и задает для errno значение
EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_offset_recalloc <malloc.h>
См. также раздел
Выравнивание данных

_recalloc

_aligned_recalloc
_aligned_offset_recalloc_dbg
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного с _aligned_malloc помощью или ,


_aligned_offset_malloc и инициализирует память на 0 (только для отладочной
версии).

Синтаксис
C

void * _aligned_offset_recalloc_dbg(

void *memblock,

size_t num,

size_t size,

size_t alignment,

size_t offset,

const char *filename,

int linenumber

);

Параметры
memblock

Указатель текущего блока памяти.

number

Число элементов.

size

Длина каждого элемента в байтах.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

offset

Смещение в выделение памяти для принудительного выполнения выравнивания.

filename

Указатель на имя исходного файла, который запросил операцию realloc или NULL .
linenumber

Номер строки в исходном файле, в котором была запрошена операция realloc, или
NULL .

Возвращаемое значение
_aligned_offset_recalloc_dbg возвращает указатель void на перераспределенный

(и, возможно, перемещенный) блок памяти. Возвращаемое значение равно NULL ,


если размер равен нулю, а аргумент буфера не NULL равен , или если недостаточно
доступной памяти для расширения блока до заданного размера. В первом случае
исходный блок освобождается. Во втором случае исходный блок не изменяется.
Возвращаемое значение указывает на дисковое пространство, подходящее для
хранения объектов любого типа. Чтобы получить указатель на тип, отличный от
void , используйте приведение типов для возвращаемого значения.

Комментарии
_aligned_offset_realloc_dbg — отладочная версия _aligned_offset_recalloc функции.
Если _DEBUG параметр не определен, каждый вызов _aligned_offset_recalloc_dbg
сводится к вызову _aligned_offset_recalloc . И _aligned_offset_recalloc , и
_aligned_offset_recalloc_dbg перераспределять блок памяти в базовой куче, но

_aligned_offset_recalloc_dbg вмещает несколько функций отладки: буферы по обе


стороны от пользовательской части блока для проверки на наличие утечек и
filename / linenumber сведения для определения источника запросов на выделение.

Отслеживание определенных типов выделения с помощью параметра типа блока


не поддерживает функцию отладки для выровненных выделений. Выровненные
выделения будут отображаться как _NORMAL_BLOCK тип блока.

_aligned_offset_realloc_dbg повторно выделяет указанный блок памяти, добавив

немного больше пространства, чем запрошено newSize . newSize может быть


больше или меньше размера первоначально выделенного блока памяти.
Дополнительное пространство используется диспетчером кучи отладки для
связывания блоков памяти отладки и предоставления приложению сведений о
заголовке отладки и перезаписи буферов. Перераспределение может как
переместить исходный блок памяти в другое место в куче, так и изменить размер
блока памяти. Если блок памяти перемещен, содержимое исходного блока
перезаписывается.
Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти, а
также если запрошенный размер ( number * size ) был больше _HEAP_MAXREQ .
Дополнительные сведения о errno см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr. Кроме того, _aligned_offset_recalloc_dbg проверяет свои параметры.
Если alignment значение не равно 2 или offset значение не равно нулю и больше
или равно запрошенному size , эта функция вызывает обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эта функция возвращает NULL и задает для errno значение
EINVAL .

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_offset_recalloc_dbg <malloc.h>

См. также раздел


Выравнивание данных
_aligned_realloc
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_mallocвыделенного .

Синтаксис
C

void * _aligned_realloc(

void *memblock,

size_t size,

size_t alignment

);

Параметры
memblock

Указатель текущего блока памяти.

size

Размер запрошенного выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

Возвращаемое значение
_aligned_realloc возвращает указатель void на перераспределенный (и, возможно,
перемещенный) блок памяти. Возвращаемое значение — NULL если размер равен
нулю, а аргумент буфера — нет NULL , или если недостаточно доступной памяти для
расширения блока до заданного размера. В первом случае исходный блок
освобождается. Во втором случае исходный блок не изменяется. Возвращаемое
значение указывает на дисковое пространство, подходящее для хранения любого
типа объекта. Чтобы получить указатель на тип, отличающийся от void, используйте
приведение типа для возвращаемого значения.

Это ошибка для перераспределения памяти и изменения выравнивания блока.


Комментарии
Функция _aligned_realloc основана на функции malloc . Дополнительные сведения
об использовании _aligned_offset_malloc см. в разделе malloc.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о , см. в errno разделе errno, _doserrnoи _sys_nerr_sys_errlist. Кроме того,
_aligned_realloc проверяет свои параметры. Если alignment значение не равно 2,

эта функция вызывает обработчик недопустимых параметров, как описано в


разделе "Проверка параметров". Если продолжение выполнения разрешено, эта
функция возвращает NULL и задает для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_realloc <malloc.h>

Пример
Для получения дополнительной информации см. _aligned_malloc.

См. также
Выравнивание данных
_aligned_realloc_dbg
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного с _aligned_malloc помощью или


_aligned_offset_malloc (только для отладочной версии).

Синтаксис
C

void * _aligned_realloc_dbg(

void *memblock,

size_t size,

size_t alignment,

const char *filename,

int linenumber

);

Параметры
memblock

Указатель текущего блока памяти.

size

Размер запрошенного выделения памяти.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

filename

Указатель на имя исходного файла, запрашивающего realloc операцию, или NULL .

linenumber

Номер строки в исходном файле, в котором была запрошена realloc операция,


или NULL .

Возвращаемое значение
_aligned_realloc_dbg возвращает указатель void на перераспределенный (и,
возможно, перемещенный) блок памяти. Возвращаемое значение равно NULL ,
если размер равен нулю, а аргумент буфера не NULL равен , или если недостаточно
доступной памяти для расширения блока до заданного размера. В первом случае
исходный блок освобождается. Во втором случае исходный блок не изменяется.
Возвращаемое значение указывает на дисковое пространство, подходящее для
хранения объектов любого типа. Чтобы получить указатель на тип, отличающийся
от void, используйте приведение типа для возвращаемого значения.

Перераспределение памяти и изменение выравнивания блока является ошибкой.

Комментарии
_aligned_realloc_dbg — отладочная версия _aligned_realloc функции. Если _DEBUG

параметр не определен, каждый вызов _aligned_realloc_dbg сводится к вызову


_aligned_realloc . И _aligned_realloc , и _aligned_realloc_dbg перераспределять

блок памяти в базовой куче, но _aligned_realloc_dbg вмещает несколько функций


отладки: буферы по обе стороны от пользовательской части блока для проверки на
наличие утечек и filename / linenumber сведения для определения источника
запросов на выделение. Отслеживание определенных типов выделения с
помощью параметра типа блока не поддерживает функцию отладки для
выровненных выделений. Выровненные выделения будут отображаться как
_NORMAL_BLOCK тип блока.

_aligned_realloc_dbg повторно выделяет указанный блок памяти, добавив немного

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

_aligned_realloc_dbg задает для errno значение ENOMEM в случае сбоя выделения


памяти или если необходимый объем памяти (включая ранее упомянутую
нагрузку) превышает _HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в
разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Кроме того, _aligned_realloc_dbg проверяет свои параметры. Если alignment не


является степенью 2, эта функция вызывает обработчик недопустимых параметров,
как описано в разделе Проверка параметров. Если продолжение выполнения
разрешено, эта функция возвращает NULL и задает для errno значение EINVAL .
Сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_realloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки
_aligned_recalloc
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного или


_aligned_malloc_aligned_offset_malloc инициализирует память на 0.

Синтаксис
C

void * _aligned_recalloc(

void *memblock,

size_t num,

size_t size,

size_t alignment

);

Параметры
memblock

Указатель текущего блока памяти.

number

Число элементов.

size

Размер каждого элемента в байтах.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

Возвращаемое значение
_aligned_recalloc возвращает указатель void на перераспределенный (и,
возможно, перемещенный) блок памяти. Возвращаемое значение заключается в
том NULL , что размер равен нулю, а аргумент буфера не NULL равен или если
недостаточно доступной памяти для расширения блока до заданного размера. В
первом случае исходный блок освобождается. Во втором случае исходный блок не
изменяется. Возвращаемое значение указывает на дисковое пространство,
подходящее для хранения любого типа объекта. Чтобы получить указатель на тип,
отличающийся от void, используйте приведение типа для возвращаемого значения.

Это ошибка при перераспределяции памяти и изменении выравнивания блока.

Комментарии
Функция _aligned_recalloc основана на функции malloc . Дополнительные
сведения об использовании _aligned_offset_malloc см. в разделе malloc.

Эта функция задает для errno значение ENOMEM в случае сбоя выделения памяти
или если запрошенный размер был больше _HEAP_MAXREQ . Дополнительные
сведения о errno , см. в разделе errno, , _doserrno_sys_errlistи _sys_nerr. Кроме того,
_aligned_recalloc проверяет свои параметры. Если alignment значение не равно 2,

эта функция вызывает обработчик недопустимых параметров, как описано в


разделе "Проверка параметров". Если продолжение выполнения разрешено, эта
функция возвращает NULL и задает для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_aligned_recalloc <malloc.h>

См. также раздел


Выравнивание данных

_recalloc

_aligned_offset_recalloc
_aligned_recalloc_dbg
Статья • 03.04.2023

Изменяет размер блока памяти, выделенного с _aligned_malloc помощью или ,


_aligned_offset_malloc и инициализирует память на 0 (только для отладочной
версии).

Синтаксис
C

void * _aligned_recalloc_dbg(

void * memblock,

size_t num,

size_t size,

size_t alignment,

const char *filename,

int linenumber

);

Параметры
memblock

Указатель текущего блока памяти.

number

Число элементов.

size

Размер каждого элемента в байтах.

alignment

Значение выравнивания, которое должно быть целой степенью числа 2.

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .
Возвращаемое значение
_aligned_recalloc_dbg возвращает указатель void в перераспределенном (и,

возможно, перемещенном) блоке памяти. Возвращаемое значение равно NULL ,


если размер равен нулю, а аргумент буфера не NULL равен , или если недостаточно
доступной памяти для расширения блока до заданного размера. В первом случае
исходный блок освобождается. Во втором случае исходный блок не изменяется.
Возвращаемое значение указывает на дисковое пространство, подходящее для
хранения объектов любого типа. Чтобы получить указатель на тип, отличный от
void , используйте приведение типов для возвращаемого значения.

Перераспределение памяти и изменение выравнивания блока является ошибкой.

Комментарии
_aligned_recalloc_dbg — отладочная версия _aligned_recalloc функции. Если _DEBUG

параметр не определен, каждый вызов _aligned_recalloc_dbg сводится к вызову


_aligned_recalloc . И _aligned_recalloc , и _aligned_recalloc_dbg перераспределять
блок памяти в базовой куче, но _aligned_recalloc_dbg вмещает несколько функций
отладки: буферы по обе стороны от пользовательской части блока для проверки на
наличие утечек и filename / linenumber сведения для определения источника
запросов на выделение. Отслеживание определенных типов выделения с
помощью параметра типа блока не поддерживает функцию отладки для
выровненных выделений. Выровненные выделения будут отображаться как
_NORMAL_BLOCK тип блока.

_aligned_recalloc_dbg перераспределяет указанный блок памяти, добавив немного

больше пространства, чем запрошено ( number * size ), что может быть больше или
меньше размера первоначально выделенного блока памяти. Дополнительное
пространство используется диспетчером кучи отладки для связывания блоков
памяти отладки и предоставления приложению сведений о заголовке отладки и
перезаписи буферов. Перераспределение может как переместить исходный блок
памяти в другое место в куче, так и изменить размер блока памяти.
Пользовательская часть блока заполняется значением 0xCD, а буферы перезаписи
заполняются 0xFD.

_aligned_recalloc_dbg задает для errno значение ENOMEM в случае сбоя выделения


памяти; значение EINVAL возвращается, если необходимый объем памяти (включая
ранее упомянутую нагрузку) превышает _HEAP_MAXREQ . Сведения об этом и других
кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.
Кроме того, _aligned_recalloc_dbg проверяет свои параметры. Если alignment не
является степенью 2, эта функция вызывает обработчик недопустимых параметров,
как описано в разделе Проверка параметров. Если продолжение выполнения
разрешено, эта функция возвращает NULL и задает для errno значение EINVAL .

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и их отладочными версиями см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_aligned_recalloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки
_alloca
Статья • 03.04.2023

Выделение памяти в стеке. Эта функция устарела, так как доступна более
безопасная версия; см. раздел _malloca.

Синтаксис
C

void *_alloca(

size_t size

);

Параметры
size

Байты, которые нужно выделить из стека.

Возвращаемое значение
Подпрограмма _alloca возвращает void указатель на выделенное пространство,
которое подходит для хранения любого типа объекта. Если значение size равно 0,
_alloca выделяет элемент нулевой длины и возвращает допустимый указатель на

этот элемент.

Исключение переполнения стека создается, если пространство не может быть


выделено. Исключение переполнения стека не является исключением C++; Это
структурированное исключение. Вместо обработки исключений C++ необходимо
использовать структурированную обработку исключений (SEH).

Комментарии
_alloca выделяет байты size из стека программ. Выделенное пространство

автоматически освобождается при выходе вызывающей функции (а не в том


случае, если выделение просто выходит за пределы области). Поэтому не
передайте значение указателя, возвращаемое _alloca в качестве аргумента free.
Существуют ограничения на явный вызов _alloca в обработчике исключений (EH).
Подпрограммы EH, работающие на процессорах класса x86, работают в
собственном кадре памяти: они выполняют свои задачи в пространстве памяти,
который не основан на текущем расположении указателя стека включающей
функции. Наиболее распространенными реализациями являются выражения
выражений предложений Catch для Windows с структурированной обработкой
исключений (SEH) и C++. Поэтому явный вызов _alloca в любом из следующих
сценариев приводит к сбою программы во время возврата к вызывающей
подпрограмме EH:

Выражение фильтра исключений SEH Для Windows: __except ( _alloca() )

Окончательный обработчик исключений Windows SEH: __finally { _alloca()


}

Выражение catch обработки исключений языка C++

Однако _alloca можно вызывать непосредственно из подпрограммы обработки


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

) Важно!

Если _alloca вызывается внутри блока try, необходимо вызвать _resetstkoflw


блок catch.

Помимо указанных выше ограничений при использовании/clr параметра


(компиляция среды CLR) нельзя использовать в __except блоках. _alloca
Дополнительные сведения см. в разделе /clr "Ограничения".

Требования
Подпрограмма Обязательный заголовок

_alloca <malloc.h>

Пример
C
// crt_alloca.c

// This program demonstrates the use of

// _alloca and trapping any exceptions

// that may occur.

#include <windows.h>

#include <stdio.h>

#include <malloc.h>

int main()

int size = 1000;

int errcode = 0;

void *pData = NULL;

// Note: Do not use try/catch for _alloca,

// use __try/__except, since _alloca throws

// Structured Exceptions, not C++ exceptions.

__try {

// An unbounded _alloca can easily result in a

// stack overflow.

// Checking for a size < 1024 bytes is recommended.

if (size > 0 && size < 1024)

pData = _alloca( size );

printf_s( "Allocated %d bytes of stack at 0x%p",

size, pData);

else

printf_s("Tried to allocate too many bytes.\n");

// If an exception occurred with the _alloca function

__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )

printf_s("_alloca failed!\n");

// If the stack overflows, use this function to restore.

errcode = _resetstkoflw();

if (errcode == 0) // _resetstkoflw() returns 0 on failure


{

printf_s("Could not reset the stack!\n");

_exit(1);

};

Output
Allocated 1000 bytes of stack at 0x0012FB50

См. также раздел


Выделение памяти

calloc

malloc

realloc

_resetstkoflw

_malloca
_amsg_exit
Статья • 03.04.2023

Создает указанное сообщение об ошибке времени выполнения, затем завершает


приложение с кодом ошибки 255.

Синтаксис
C++

void _amsg_exit ( int rterrnum );

Параметры
rterrnum

Идентификационный номер определяемого системой сообщения об ошибке


времени выполнения.

Комментарии
Эта функция выдает сообщение stderr об ошибке среды выполнения для
консольных приложений или отображает сообщение в окне сообщения для
приложений Windows. В режиме отладки перед выходом можно вызвать отладчик.

Требования
Подпрограмма Обязательный заголовок

_amsg_exit internal.h
and
Статья • 03.04.2023

Альтернатива оператору && .

Синтаксис
C

#define and &&

Remarks
Макрос возвращает оператор &&.

Пример
C++

// iso646_and.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

bool a = true, b = false, result;

boolalpha(cout);

result= a && b;

cout << result << endl;

result= a and b;

cout << result << endl;

Output

false

false

Требования
Заголовка:< iso646.h>
and_eq
Статья • 03.04.2023

Альтернатива оператору &=.

Синтаксис
C

#define and_eq &=

Remarks
Макрос возвращает оператор &=.

Пример
C++

// iso646_and_eq.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 3, b = 2, result;

result= a &= b;

cout << result << endl;

result= a and_eq b;

cout << result << endl;

Output

Требования
Заголовка:< iso646.h>
asctime , _wasctime
Статья • 03.04.2023

Преобразуют структуру времени tm в символьную строку. Доступны более


безопасные версии этих функций; См. разделasctime_s , _wasctime_s.

Синтаксис
C

char *asctime(

const struct tm *timeptr

);

wchar_t *_wasctime(

const struct tm *timeptr

);

Параметры
timeptr

Структура даты/времени.

Возвращаемое значение
asctime возвращает указатель на результирующую строку символов; _wasctime

возвращает указатель на результирующую строку расширенных символов.


Возвращаемое значение ошибки отсутствует.

Комментарии
Доступны более безопасные версии этих функций; См. разделasctime_s ,
_wasctime_s.

Функция asctime преобразует время, хранящееся в виде структуры, в символьную


строку. Значение timeptr обычно получается из вызова gmtime или localtime ,
которые возвращают указатель на структуру, определенную tm в TIME.H.

Член timeptr Значение

tm_hour Часы с полуночи (0-23)


Член timeptr Значение

tm_isdst Положительное значение, если действует переход на летнее время; 0, если


летнее время не действует; отрицательное значение, если состояние летнего
времени неизвестно. Библиотека времени выполнения C принимает правила
США для реализации проверки на летнее время (DST).

tm_mday День месяца (1-31)

tm_min Минут за часом (0–59)

tm_mon Месяц (0–11; Январь = 0)

tm_sec Секунды после минуты (0–59)

tm_wday День недели (0-6; Воскресенье = 0)

tm_yday День года (0-365; 1 января = 0)

tm_year Год (текущий год минус 1900)

Сведения о настройке местного времени см. в timeразделе Функции , _ftimeи


localtime . Сведения об определении среды часового пояса и глобальных
переменных см. в _tzset этой функции.

Итоговая строка, полученная с помощью asctime , содержит ровно 26 символов и


имеет вид Wed Jan 2 02:03:55 1980\n\0 . Время в 24-часовом формате. Все поля
имеют постоянную ширину. Символ новой строки и нуль-символ занимают две
последние позиции строки. asctime использует один статически выделяемый
буфер для хранения возвращаемой строки. Каждый вызов этой функции
уничтожает результат предыдущего вызова.

_wasctime — это версия для расширенных символов asctime , а в противном случае


поведение идентично asctime .

Эти функции проверяют свои параметры. Если timeptr является пустым указателем
или содержит значения вне диапазона, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, функция возвращает NULL и устанавливает для параметра errno
значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Сопоставление подпрограмм с универсальным
текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tasctime asctime asctime _wasctime

Требования
Подпрограмма Обязательный заголовок

asctime <time.h>

_wasctime <time.h> или <wchar.h>

Пример
Эта программа помещает системное время в длинное целое число aclock ,
преобразует его в структуру newtime , а затем преобразует в строковую форму для
вывода с помощью asctime функции .

// crt_asctime.c

// compile with: /W3

#include <time.h>

#include <stdio.h>

int main( void )

struct tm *newTime;

time_t szClock;

// Get time in seconds

time( &szClock );

// Convert time to struct tm form

newTime = localtime( &szClock );

// Print local time as a string.

printf_s( "Current date and time: %s", asctime( newTime ) ); // C4996

// Note: asctime is deprecated; consider using asctime_s instead

Output

Current date and time: Sun Feb 3 11:38:58 2002

См. также раздел


Управление временем

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

time, _time32, _time64

_tzset

asctime_s, _wasctime_s
asctime_s , _wasctime_s
Статья • 03.04.2023

Преобразуют структуру времени tm в символьную строку. Эти функции являются


версиями asctime, с улучшениями безопасности, _wasctime описанными в разделе
Функции безопасности в CRT.

Синтаксис
C

errno_t asctime_s(

char* buffer,

size_t numberOfElements,

const struct tm *tmSource

);

errno_t _wasctime_s(

wchar_t* buffer,

size_t numberOfElements

const struct tm *tmSource

);

template <size_t size>

errno_t asctime_s(

char (&buffer)[size],

const struct tm *tmSource

); // C++ only

template <size_t size>

errno_t _wasctime_s(

wchar_t (&buffer)[size],

const struct tm *tmSource

); // C++ only

Параметры
buffer

Указатель на буфер для хранения результата строки символов. Эта функция


принимает указатель на допустимое расположение в памяти, размер которого
указан в numberOfElements .

numberOfElements

Размер буфера, используемого для хранения результата.

tmSource

Структура даты/времени. Эта функция принимает указатель на допустимый объект


struct tm .

Возвращаемое значение
Нуль при успешном завершении. В случае сбоя вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
выполнение может быть продолжено, функция возвращает код ошибки. Коды
ошибок определенны в ERRNO.H. Дополнительные сведения см. в разделе errno
Константы. Фактические коды ошибок, возвращаемые для каждого условия
ошибки, приведены в следующей таблице.

Условия ошибок

buffer numberOfElements tmSource Возвращает Значение


в buffer

NULL Любой Любой EINVAL Без


изменений

Не NULL 0 Любой EINVAL Без


(указывает на изменений
допустимую
память)

Не NULL 0< numberOfElements < Любой EINVAL Пустая


26 строка.

Не NULL >= 26 NULL EINVAL Пустая


строка.

Не NULL >= 26 Недопустимая EINVAL Пустая


структура времени или строка.
компоненты времени
выходят за пределы
допустимого диапазона

7 Примечание

Условия ошибки для функции wasctime_s аналогичны таковым для функции


asctime_s , но ограничение размера измеряется в словах.

Комментарии
Функция asctime преобразует время, хранящееся в виде структуры, в символьную
строку. Значение tmSource обычно получается из вызова gmtime или localtime . Обе
функции могут использоваться для заполнения структуры tm , как определено в
файле TIME.H.

Член Значение
timeptr

tm_hour Часы с полуночи (0–23)

tm_isdst Положительный результат, если летнее время действует; 0, если летнее время не
действует; отрицательное значение, если состояние летнего времени неизвестно.
Библиотека времени выполнения C принимает правила США для реализации
проверки на летнее время (DST).

tm_mday День месяца (1-31)

tm_min Минуты после часа (0–59)

tm_mon Месяц (0–11; Январь = 0)

tm_sec Секунды за минутой (0–59)

tm_wday День недели (0–6; Воскресенье = 0)

tm_yday День года (0-365; 1 января = 0)

tm_year Год (текущий год минус 1900)

Преобразованная символьная строка также настраивается согласно параметрам


местного часового пояса. Сведения о настройке местного времени см. в
timeфункциях , _time32, _time64_ftime, _ftime32, _ftime64, и localtime_s.
_localtime32_s_localtime64_s Сведения об определении среды часового пояса и
глобальных переменных см. в разделе _tzset.

Итоговая строка, полученная с помощью asctime_s , содержит ровно 26 символов и


имеет вид Wed Jan 2 02:03:55 1980\n\0 . Время в 24-часовом формате. Все поля
имеют постоянную ширину. Символ новой строки и нуль-символ занимают две
последние позиции строки. Значение, передаваемое как numberOfElements , должно
быть не ниже этого размера. Если значение меньше, EINVAL возвращается код
ошибки , .

_wasctime_s  — это версия функции asctime_s для расширенных символов.

Поведение _wasctime_s и asctime_s идентично в противном случае.


Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.
Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставление подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tasctime_s asctime_s asctime_s _wasctime_s

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Требования
Подпрограмма Обязательный заголовок

asctime_s <time.h>

_wasctime_s <time.h> или <wchar.h>

Безопасность
Если указатель буфера не NULL указан, а указатель не указывает на допустимый
буфер, функция перезапишет все, что находится в расположении. Эта ошибка
также может привести к нарушению доступа.

Если переданный аргумент size превышает фактический размер буфера, может


возникать ошибка переполнения буфера.

Пример
Эта программа помещает системное время в длинное целое число aclock ,
преобразует его в структуру newtime , а затем преобразует его в строковую форму
для вывода с помощью asctime_s функции .
C

// crt_asctime_s.c

#include <time.h>

#include <stdio.h>

struct tm newtime;

__time32_t aclock;

int main( void )

char buffer[32];

errno_t errNum;

_time32( &aclock ); // Get time in seconds.

_localtime32_s( &newtime, &aclock ); // Convert time to struct tm form.

// Print local time as a string.

errNum = asctime_s(buffer, 32, &newtime);

if (errNum)

printf("Error code: %d", (int)errNum);

return 1;

printf( "Current date and time: %s", buffer );

return 0;

Output

Current date and time: Wed May 14 15:30:17 2003

См. также раздел


Управление временем

ctime_s, _ctime32_s, _ctime64_s, _wctime_s, _wctime32_s, _wctime64_s

_ftime, _ftime32, _ftime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime_s, _localtime32_s, _localtime64_s

time, _time32, _time64

_tzset
asin , asinf , asinl
Статья • 03.04.2023

Вычисляет арксинус.

Синтаксис
C

double asin( double x );

float asinf ( float x );

long double asinl( long double x );

#define asin(X) // Requires C11 or higher

float asin( float x ); // C++ only

long double asin( long double x ); // C++ only

Параметры
x

Значение, арксинус которого необходимо вычислить.

Возвращаемое значение
Функция asin возвращает арксинус (обратную функцию синуса) в x диапазоне
-π/2 до π/2 радиан.

По умолчанию, если x значение меньше -1 или больше 1, asin возвращает


неопределенное значение.

Входные данные Исключение SEH _matherr Исключение

± INF INVALID _DOMAIN

± QNaN, IND нет _DOMAIN

|x| > 1 INVALID _DOMAIN

Комментарии
Так как C++ допускает перегрузку, вы можете вызвать перегрузки asin с помощью
значений float и long double . В программе C, если вы не используете <tgmath.h>
макрос для вызова этой функции, asin всегда принимает и возвращает . double

Если вы используете asin макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

asin , asinf , asinl <math.h> <cmath> или <math.h>

asin Макрос <tgmath.h>

Пример
Дополнительные сведения см. в разделеacos , acosf, acosl.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acos, acosf, acosl

atan, atanf, atanl, atan2, atan2f, atan2l

cos, cosf, cosl

_matherr

sin, sinf, sinl

tan, tanf, tanl


asinh , asinhf , asinhl
Статья • 03.04.2023

Вычисляет обратный гиперболический синус.

Синтаксис
C

double asinh( double x );

float asinhf( float x );

long double asinhl( long double x );


#define asinh(X) // Requires C11 or higher

float asinh( float x ); // C++ only

long double asinh( long double x ); // C++ only

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функции asinh возвращают обратный гиперболический синус (гиперболический
синус дуги) из x . Эта функция допустима для домена чисел с плавающей запятой.
Если x является несигнальным значением NaN, неопределенным или
бесконечным, возвращается то же значение.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND, INF нет нет

Комментарии
При использовании C++ можно вызывать перегрузки asinh , которые принимают
и возвращают значения float или long double . В программе на языке C, если вы
не используете <макрос tgmath.h> для вызова этой функции, asinh всегда
принимает и возвращает . double
Если вы используете <макрос tgmath.h> asinh() , тип аргумента определяет, какая
версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это, см. раздел глобальное состояние в CRT.

Требования
Компонент Обязательный заголовок C Обязательный заголовок C++

asinh , asinhf , asinhl <math.h> <cmath> или <math.h>

Макрос asinh() <tgmath.h>

Дополнительные сведения о совместимости см. в статье Compatibility.

Пример
C

// crt_asinh.c

// Compile by using: cl /W4 crt_asinh.c

// This program displays the hyperbolic sine of pi / 4

// and the arc hyperbolic sine of the result.

#include <math.h>

#include <stdio.h>

int main( void )

double pi = 3.1415926535;

double x, y;

x = sinh( pi / 4 );

y = asinh( x );

printf( "sinh( %f ) = %f\n", pi/4, x );

printf( "asinh( %f ) = %f\n", x, y );

Output

sinh( 0.785398 ) = 0.868671

asinh( 0.868671 ) = 0.785398

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acosh, acoshf, acoshl

atanh, atanhf, atanhl


cosh, coshf, coshl

sinh, sinhf, sinhl

tanh, tanhf, tanhl


assert макрос, _assert , _wassert
Статья • 03.04.2023

Вычисляет выражение и, если результат false , выводит диагностическое


сообщение и прерывает выполнение программы.

Синтаксис
C

assert(

expression

);

void _assert(

char const* message,


char const* filename,

unsigned line

);

void _wassert(

wchar_t const* message,

wchar_t const* filename,

unsigned line

);

Параметры
expression

Скалярное выражение (включая выражения указателя), которое возвращает


ненулевое значение ( true ) или 0 ( false ).

message

Отображаемое сообщение.

filename

Имя файла исходного кода, в котором произошел сбой утверждения.

line

Номер строки в файле исходного кода, в которой произошел сбой утверждения.

Комментарии
Макрос assert обычно используется для выявления ошибок логики во время
разработки программы. Используйте его для остановки выполнения программы
при возникновении непредвиденных условий. Для этого реализуйте аргумент
expression так, чтобы он принимал значение false только в том случае, если
программа работает неправильно. Проверки утверждения можно отключить во
время компиляции, определив макрос NDEBUG . Макрос можно отключить assert ,
не изменяя исходные файлы, с помощью параметра командной /DNDEBUG строки.
Макрос assert можно отключить в исходном коде с помощью директивы #define
NDEBUG перед <assert.h> включением.

Макрос assert выводит диагностическое сообщение при expression оценке false


(0) и вызывает для abort остановки выполнения программы. Если значение
expression равно true (отлично от нуля), никаких действий не выполняется.
Диагностическое сообщение включает выражение, где произошел сбой, имя файла
исходного кода и номер строки, со сбоем утверждения.

Диагностическое сообщение выводится в виде расширенных символов ( wchar_t ).


Поэтому он будет работать должным образом, даже если в выражении есть
символы Юникода.

Назначение диагностического сообщения зависит от типа приложения, которое


вызвало подпрограмму. Консольные приложения получают сообщение через
stderr . В приложении windows вызывает функцию WindowsMessageBox, чтобы

создать окно сообщения для assert отображения сообщения с тремя кнопками:


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

Чтобы переопределить поведение вывода по умолчанию независимо от типа


приложения, вызовите _set_error_mode для выбора между поведением вывода в
stderr и display-dialog-box.

После assert отображения сообщения он вызывает abort, в котором отображается


диалоговое окно с кнопками "Прервать", "Повторить" и "Пропустить ". abort
завершает программу, поэтому кнопка Повторить и Пропустить не возобновляет
выполнение программы после assert вызова. Если assert отображается
диалоговое окно, диалоговое abort окно не отображается. Единственным случаем
отображения диалогового abort окна является assert отправка выходных данных в
stderr.

В результате приведенного выше поведения диалоговое окно всегда отображается


после assert вызова в режиме отладки. Поведение каждой кнопки запечатлено в
таблице ниже.

Режим Вывод в stderr Диалоговое окно отображения


ошибок (Консоль/ _OUT_TO_STDERR ) (Windows/ _OUT_TO_MSGBOX )

Abort Немедленное завершение Exit immediately with exit code 3


работы с кодом выхода 3

Retry Врваться в отладчик во Break into debugger during assert


время abort

Ignore Завершите выход через Продолжить программу, как будто assert не


abort сработала (может привести к неопределенному
поведению, так как предварительные условия
вызывающего кода не были выполнены)

Дополнительные сведения об отладке CRT см. в разделе Методы отладки CRT.

Функции _assert и _wassert являются внутренними функциями CRT. Они


позволяют свести к минимуму объем кода, требуемый в объектных файлах для
поддержки утверждений. Не рекомендуется вызывать эти функции напрямую.

Макрос assert включен как в выпусках, так и в отладочных версиях библиотек


времени выполнения C, если NDEBUG не определен. Если NDEBUG задано значение ,
макрос доступен, но не вычисляет его аргумент и не оказывает влияния. Если он
включен, assert макрос вызывает _wassert его реализацию. Доступны и
_ASSERT_EXPRдругие макросы утверждений, _ASSERT_ASSERTE и , но они оценивают
выражения, переданные им, только если _DEBUG макрос определен и находятся в
коде, связанном с отладочной версией библиотек времени выполнения C.

Требования
Подпрограмма Обязательный заголовок

assert , _wassert <assert.h>

_assert Подпись функции недоступна в файле заголовка. Сигнатура _wassert

функции доступна только в том случае, NDEBUG если макрос не определен.


Пример
В этой программе функция analyze_string использует макрос assert для проверки
нескольких условий, связанных со строкой и длиной. Если какое-либо из условий
не выполняется, программа выводит сообщение, указывающее на причину сбоя.

// crt_assert.c

// compile by using: cl /W4 crt_assert.c

#include <stdio.h>

#include <assert.h>

#include <string.h>

void analyze_string( char *string ); // Prototype

int main( void )

char test1[] = "abc", *test2 = NULL, test3[] = "";

printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );

analyze_string( test1 );

printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );

analyze_string( test2 );

printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );

analyze_string( test3 );

// Tests a string to see if it is NULL,

// empty, or longer than 0 characters.

void analyze_string( char * string )

assert( string != NULL ); // Cannot be NULL

assert( *string != '\0' ); // Cannot be empty

assert( strlen( string ) > 2 ); // Length must exceed 2

Программа создает следующие выходные данные:

Output

Analyzing string 'abc'

Analyzing string '(null)'

Assertion failed: string != NULL, file crt_assert.c, line 25

После сбоя утверждения в зависимости от версии операционной системы и


библиотеки времени выполнения может отображаться окно сообщения,
содержащее примерно следующее:
Output

A problem caused the program to stop working correctly. Windows will close
the program and notify you if a solution is available.

Если отладчик установлен, нажмите кнопку Отладка , чтобы запустить его, или
кнопку Закрыть программу , чтобы выйти.

См. также раздел


Обработка ошибок

Управление процессами и средой

abort

raise

signal

_ASSERT, _ASSERTE, _ASSERT_EXPR макросы

_DEBUG
_ASSERT , _ASSERTE , _ASSERT_EXPR
макросы
Статья • 03.04.2023

Вычисляют выражение и создают отчет об отладке, когда результат равен false


(только в отладочной версии).

Синтаксис
C

// Typical usage:

_ASSERT_EXPR( booleanExpression, message );

_ASSERT( booleanExpression );

_ASSERTE( booleanExpression );

Параметры
booleanExpression

Скалярное выражение (включая выражения указателя), которое возвращает


ненулевое значение ( true ) или 0 ( false ).

message

Расширенная строка, отображаемая в составе отчета.

Комментарии
Макросы _ASSERT_EXPR , _ASSERT и _ASSERTE представляют собой простой и четкий
механизм, с помощью которого приложение может проверять условия во время
процесса отладки. Они гибкие, так как их не нужно заключать в #ifdef инструкции,
чтобы предотвратить их вызов в розничной сборке приложения. Эта гибкость
достигается с помощью макроса _DEBUG . Макросы _ASSERT_EXPR , _ASSERT и
_ASSERTE доступны только тогда, когда макрос _DEBUG определен во время

компиляции. Если _DEBUG параметр не определен, вызовы этих макросов удаляются


во время предварительной обработки.

_ASSERT_EXPR , _ASSERT и _ASSERTE оценивают их booleanExpression аргументы, а


если результат равен false (0), они выводят диагностическое сообщение и
вызывают _CrtDbgReportW для создания отчета об отладке. Макрос _ASSERT
выводит простое диагностическое сообщение, _ASSERTE включает строковое
представление неудачного выражения в сообщении и _ASSERT_EXPR включает
message строку в диагностическом сообщении. Эти макросы не выполняют никаких
действий, если аргумент booleanExpression не равен нулю.

_ASSERT_EXPR , _ASSERT и _ASSERTE вызывают _CrtDbgReportW , благодаря чему

выходные данные содержат только расширенные символы. _ASSERTE надлежащим


образом выводит символы Юникода в booleanExpression , а _ASSERT_EXPR выводит
символы Юникода в message .

Так как макрос _ASSERTE указывает вызвавшее сбой выражение, а _ASSERT_EXPR


позволяет указать сообщение в создаваемом отчете, они позволяют определить
проблему без обращения к исходному коду приложения. Однако недостаток
состоит в том, что каждое message , выводимое _ASSERT_EXPR , и каждое выражение,
вычисляемое _ASSERTE , включается в файл вывода (в отладочной версии)
приложения как строковая константа. Поэтому при большом количестве вызовов
_ASSERT_EXPR или _ASSERTE эти выражения могут значительно увеличить размер

файла вывода.

Если в функциях и не _CrtSetReportFile указано иное_CrtSetReportMode, сообщения


отображаются во всплывающем диалоговом окне, эквивалентном параметру:

_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReportW создает отчет об отладке и определяет его место или места

назначения на основании текущего режима или режимов отчета и файла,


определенного для типа отчета _CRT_ASSERT . По умолчанию ошибки и сбои
проверочных утверждений направляются в окно сообщений отладчика.
_CrtSetReportMode Функции и _CrtSetReportFile используются для определения
назначений для каждого типа отчета.

Если назначением является окно сообщения отладки и пользователь нажимает


кнопку Повторить , _CrtDbgReportW возвращает значение 1, что приводит
_ASSERT_EXPR к запуску отладчика макросов и _ASSERT _ASSERTE при включенной JIT-

отладке.

Дополнительные сведения о процессе создания отчетов см. в


_CrtDbgReportразделе Функция , _CrtDbgReportW . Дополнительные сведения об
устранении сбоев утверждений и использовании этих макросов в качестве
механизма обработки ошибок отладки см. в разделе Макросы для создания
отчетов.

Помимо _ASSERT макросов, assert макрос можно использовать для проверки


логики программы. Этот макрос доступен и в отладочной, и в окончательной
версиях библиотек. Макросы _RPTотладки _RPTF также доступны для создания
отчета об отладке, но они не вычисляют выражение. Макросы _RPT создают
простой отчет. Макросы _RPTF включают в создаваемый отчет файл исходного
кода и номер строки, на которой был вызван макрос отчета. Доступны версии этих
макросов для расширенных символов ( _RPTW , _RPTFW ). Версии для расширенных
символов идентичны версиям для узких символов, за исключением того, что для
всех строковых параметров и вывода используются строки расширенных
символов.

Хотя _ASSERT_EXPR , _ASSERT и _ASSERTE являются макросами и доступны путем


включения <crtdbg.h> , приложение должно связаться с отладочной версией
библиотеки времени выполнения C, если _DEBUG определен, так как эти макросы
вызывают другие функции времени выполнения.

Requirements (Требования)
Макрос Обязательный заголовок

_ASSERT_EXPR , _ASSERT , _ASSERTE <crtdbg.h>

Пример
В этой программе макросы _ASSERT и _ASSERTE вызываются для проверки условия
string1 == string2 . Если условие не выполняется, эти макросы выводят
диагностическое сообщение. Группа макросов _RPT и _RPTF также используется в
этой программе — в качестве альтернативы функции printf .

// crt_ASSERT_macro.c

// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug

//

// This program uses the _ASSERT and _ASSERTE debugging macros.

//

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <crtdbg.h>

int main()

char *p1, *p2;

// The Reporting Mode and File must be specified

// before generating a debug report via an assert

// or report macro.

// This program sends all report types to STDOUT.

_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);

_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);

_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);

_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);

_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);

_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);

// Allocate and assign the pointer variables.

p1 = (char *)malloc(10);

strcpy_s(p1, 10, "I am p1");

p2 = (char *)malloc(10);

strcpy_s(p2, 10, "I am p2");

// Use the report macros as a debugging

// warning mechanism, similar to printf.

// Use the assert macros to check if the

// p1 and p2 variables are equivalent.

// If the expression fails, _ASSERTE will

// include a string representation of the

// failed expression in the report.

// _ASSERT does not include the

// expression in the generated report.

_RPT0(_CRT_WARN,

"Use the assert macros to evaluate the expression p1 == p2.\n");

_RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);

_ASSERT(p1 == p2);

_RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",

p1, p2);

_ASSERTE(p1 == p2);

_RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);

free(p2);

free(p1);

return 0;

Output
Use the assert macros to evaluate the expression p1 == p2.

crt_ASSERT_macro.c(54) :

Will _ASSERT find 'I am p1' == 'I am p2' ?

crt_ASSERT_macro.c(55) : Assertion failed!

crt_ASSERT_macro.c(58) :

Will _ASSERTE find 'I am p1' == 'I am p2' ?

crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2

'I am p1' != 'I am p2'

См. также раздел


Подпрограммы отладки

assert Макрос, _assert, _wassert

_RPT, _RPTF, _RPTW, Макросы _RPTFW


atan , atanf , atanl , atan2 , atan2f ,
atan2l
Статья • 03.04.2023

Вычисляет арктангенс x ( atan , atanf и atanl ) или арктангенс y / x ( atan2 , atan2f и


atan2l ).

Синтаксис
C

double atan( double x );

float atanf( float x );


long double atanl( long double x );

#define atan(X) // Requires C11 or higher

float atan( float x ); // C++ only

long double atan( long double x ); // C++ only

double atan2( double y, double x );

float atan2f( float y, float x );

long double atan2l( long double y, long double x );

#define atan2(Y, X) // Requires C11 or higher

float atan2( float y, float x ); // C++ only

long double atan2( long double y, long double x ); // C++ only

Параметры
x, y

Все числа.

Возвращаемое значение
atan возвращает арктангенс x в диапазоне -π/2 в π/2 радианы. atan2 возвращает
арктангенс y / x в диапазоне -π для π радианы. Если значение x равно 0, atan
возвращает 0. Если оба параметра atan2 равны 0, функция возвращает значение 0.
Все результаты даются в радианах.

Используя признаки обоих параметров, atan2 определяет квадрант


возвращаемого значения.
Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

Комментарии
Функция atan вычисляет арктангенс (функцию обратного тангенса) x . atan2
вычисляет арктангенс y / x (если x равно 0; atan2 возвращает π/2; если y
положительно, -π/2, если y отрицательно, или 0, если y равно 0).

Если вы используете atan макрос или atan2 из <tgmath.h> , тип аргумента


определяет, какая версия функции выбрана. Дополнительные сведения см. в
разделе Типообразная математика .

Функция atan содержит реализацию, которая использует Streaming SIMD Extensions


2 (SSE2). Сведения и ограничения по использованию реализации SSE2 см. в
разделе _set_SSE2_enable.

Так как C++ допускает перегрузку, можно вызывать перегрузки atan и atan2 ,
которые принимают float аргументы или long double . В программе на языке C,
если вы не используете <tgmath.h> макрос для вызова этой функции и atan2 atan
всегда принимаете double аргументы и возвращаете double .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный Обязательный заголовок
заголовок (C) (C++)

atan , atan2 , atanf , atan2f , atanl , <math.h> <cmath> или <math.h>


atan2l

atan , atan2 макросы <tgmath.h>

Пример
C

// crt_atan.c

// arguments: 5 0.5

#include <math.h>

#include <stdio.h>

#include <errno.h>

int main( int ac, char* av[] )

double x, y, theta;

if( ac != 3 ){

fprintf( stderr, "Usage: %s <x> <y>\n", av[0] );

return 1;

x = atof( av[1] );

theta = atan( x );

printf( "Arctangent of %f: %f\n", x, theta );

y = atof( av[2] );

theta = atan2( y, x );

printf( "Arctangent of %f / %f: %f\n", y, x, theta );

return 0;

Output

Arctangent of 5.000000: 1.373401

Arctangent of 0.500000 / 5.000000: 0.099669

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acos, acosf, acosl

asin, asinf, asinl

cos, cosf, cosl

_matherr

sin, sinf, sinl

tan, tanf, tanl

_CIatan

_CIatan2
atanh , atanhf , atanhl
Статья • 03.04.2023

Вычисляет обратный гиперболический тангенс.

Синтаксис
C

double atanh( double x );

float atanhf( float x );

long double atanhl( long double x );


#define atanh(X) // Requires C11 or higher

float atanh( float x ); // C++ only

long double atanh( long double x ); // C++ only

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функции atanh возвращают обратный гиперболический тангенс (гиперболический
тангенс дуги) объекта x . Если x значение больше 1 или меньше -1, errno то для
параметра задано значение EDOM , а результатом будет неявное значение NaN. Если
x равняется 1 или -1, возвращается положительная или отрицательная

бесконечность, а для errno задается значение ERANGE .

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет нет

X ≥ 1; x ≤ -1 нет нет

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки atanh , которые
принимают и возвращают значения float или long double . В программе на языке
C, если вы не используете <макрос tgmath.h> для вызова этой функции, atanh
всегда принимает и возвращает . double

При использовании <макроса tgmath.h> atanh() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

atanh , atanhf , atanhl <math.h> <cmath> или <math.h>

atanh Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_atanh.c

// This program displays the hyperbolic tangent of pi / 4

// and the arc hyperbolic tangent of the result.

//

#include <math.h>

#include <stdio.h>

int main( void )

double pi = 3.1415926535;

double x, y;

x = tanh( pi / 4 );

y = atanh( x );

printf( "tanh( %f ) = %f\n", pi/4, x );

printf( "atanh( %f ) = %f\n", x, y );

Output
tanh( 0.785398 ) = 0.655794

atanh( 0.655794 ) = 0.785398

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acosh, acoshf, acoshl

asinh, asinhf, asinhl

cosh, coshf, coshl

sinh, sinhf, sinhl

tanh, tanhf, tanhl


atexit
Статья • 03.04.2023

Обрабатывает указанную функцию на выходе.

Синтаксис
C

int atexit(

void (__cdecl *func )( void )

);

Параметры
func

Функция, которую требуется вызвать.

Возвращаемое значение
atexit возвращает 0 в случае успеха или ненулевое значение в случае ошибки.

Комментарии
Функция atexit передается адрес функции func , вызываемой при обычном
завершении программы. Последовательные вызовы функции atexit создают
регистр функций, которые выполняются в порядке LIFO (последним поступил —
первым обслужен). Переданные функции atexit не могут принимать параметры.
Для хранения регистра функций atexit и _onexit используют кучу. В связи с этим
количество функций, которое можно зарегистрировать, ограничивается только
памятью кучи.

Код в atexit функции не должен содержать никакой зависимости от любой


библиотеки DLL, которая могла быть уже выгружена при вызове atexit функции.

Чтобы создать приложение, соответствующее ANSI, используйте стандартную


atexit функцию ANSI (а не аналогичную _onexit ).
Требования
Подпрограмма Обязательный заголовок

atexit <stdlib.h>

Пример
Это программа отправляет четыре функции в стек функций, которые должны
выполняться при вызове atexit . При завершении работы программы эти
программы выполняются в обратном порядке.

// crt_atexit.c

#include <stdlib.h>

#include <stdio.h>

void fn1( void ), fn2( void ), fn3( void ), fn4( void );

int main( void )

atexit( fn1 );

atexit( fn2 );

atexit( fn3 );

atexit( fn4 );

printf( "This is executed first.\n" );

void fn1()

printf( "next.\n" );

void fn2()

printf( "executed " );

void fn3()

printf( "is " );

void fn4()

printf( "This " );

Output

This is executed first.

This is executed next.

См. также раздел


Управление процессами и средой

abort

exit, _Exit, _exit

_onexit, _onexit_m
_atodbl , _atodbl_l , _atoldbl ,
_atoldbl_l , _atoflt , _atoflt_l
Статья • 03.04.2023

Преобразует строку в двойное значение ( _atodbl ), длинное двойное значение


( _atoldbl ) или число с плавающей запятой ( _atoflt ).

Синтаксис
C

int _atodbl( _CRT_DOUBLE * value, char * str );

int _atodbl_l ( _CRT_DOUBLE * value, char * str, _locale_t locale );

int _atoldbl( _LDOUBLE * value, char * str );

int _atoldbl_l ( _LDOUBLE * value, char * str, _locale_t locale );

int _atoflt( _CRT_FLOAT * value, const char * str );

int _atoflt_l( _CRT_FLOAT * value, const char * str, _locale_t locale );

Параметры
value

Двойное и длинное двойное значение, а также число с плавающей запятой


формируются путем преобразования строки в значение с плавающей запятой. Эти
значения упаковываются в структуре.

str

Строка для синтаксического анализа, которую необходимо преобразовать в


значение с плавающей запятой.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает 0 в случае успеха. Возможные коды ошибок,
_UNDERFLOW _OVERFLOW которые определены в файле <заголовка math.h>.

Комментарии
Эти функции преобразуют строку в значение с плавающей запятой. Разница между
этими функциями и atof семейством функций заключается в том, что эти функции
не создают код с плавающей запятой и не вызывают аппаратных исключений.
Вместо этого условия ошибок помечаются как коды ошибок.

Если строка не имеет допустимой интерпретации в качестве значения с плавающей


запятой, value устанавливается равным нулю, а возвращаемое значение равно
нулю.

Версии этих функций с _l суффиксом идентичны версиям, у которых нет суффикса,


за исключением того, что они используют locale переданный параметр вместо
языкового стандарта текущего потока.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограммы Обязательный заголовок

_atodbl , _atoldbl , _atoflt


<stdlib.h>

_atodbl_l , _atoldbl_l , _atoflt_l

Пример
C

// crt_atodbl.c

// Uses _atodbl to convert a string to a double precision

// floating point value.

#include <stdlib.h>

#include <stdio.h>

int main()

char str1[256] = "3.141592654";

char abc[256] = "abc";

char oflow[256] = "1.0E+5000";

_CRT_DOUBLE dblval;

_CRT_FLOAT fltval;

int retval;

retval = _atodbl(&dblval, str1);

printf("Double value: %lf\n", dblval.x);

printf("Return value: %d\n\n", retval);

retval = _atoflt(&fltval, str1);

printf("Float value: %f\n", fltval.f);

printf("Return value: %d\n\n", retval);

// A non-floating point value: returns 0.

retval = _atoflt(&fltval, abc);

printf("Float value: %f\n", fltval.f);

printf("Return value: %d\n\n", retval);

// Overflow.

retval = _atoflt(&fltval, oflow);

printf("Float value: %f\n", fltval.f);

printf("Return value: %d\n\n", retval);

return 0;

Output

Double value: 3.141593

Return value: 0

Float value: 3.141593

Return value: 0

Float value: 0.000000

Return value: 0

Float value: inf

Return value: 3

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Локаль

atof, _atof_l, _wtof, _wtof_l


atof , _atof_l , _wtof , _wtof_l
Статья • 03.04.2023

Преобразуют строку в двойное значение.

Синтаксис
C

double atof(

const char *str

);

double _atof_l(

const char *str,

_locale_t locale

);

double _wtof(

const wchar_t *str

);

double _wtof_l(

const wchar_t *str,

_locale_t locale

);

Параметры
str

Строка для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая функция возвращает значение double , которое создается за счет
интерпретации входных символов как числа. Возвращаемое значение равно 0,0,
если входные данные не могут быть преобразованы в значение этого типа.

Во всех случаях, когда диапазон не соблюдается, errno принимает значение


ERANGE . Если параметр передается NULL в , вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают 0.

Комментарии
Эти функции преобразуют строку символов в значение двойной точности с
плавающей запятой.

Входная строка представляет собой последовательность символов, которые могут


обрабатываться как числовое значение указанного типа. Функция прекращает
чтение входной строки на первом символе, который она не может распознать как
часть числа. Этот символ может быть нуль-символом ("\0" или L"\0"), которым
завершается строка.

Аргумент str для atof и _wtof принимает следующую форму:

[ whitespace ] [ sign ] [ digits ] [ . digits ] [ { e | E }[ sign ] digits ]

Состоит whitespace из пробелов или символов табуляции, которые игнорируются;


sign имеет значение "плюс" (+) или "минус" (-) и digits представляет собой одну
или несколько десятичных цифр. Если перед десятичной запятой никаких цифр нет,
после нее должен отображаться хотя бы один символ. За десятичными цифрами
может следовать показатель степени, который состоит из вводной буквы ( e или E ),
и, при необходимости, целого десятичного числа со знаком.

Версии UCRT этих функций не поддерживают преобразование экспонентных букв в


стиле Fortran ( d или D ). Это нестандартное расширение поддерживалось в более
ранних версиях CRT и может оказаться критическим изменением для вашего кода.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный locale параметр вместо текущего языкового стандарта.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tstof atof atof _wtof

_ttof atof atof _wtof


Требования
Routine(s) Обязательный заголовок

atof , _atof_l C: <math.h> или <stdlib.h> C++: <cstdlib> , <stdlib.h> или <cmath> <math.h>

_wtof , _wtof_l C: <stdlib.h> или <wchar.h> C++: <cstdlib> , <stdlib.h> или <wchar.h>

Пример
Эта программа показывает, как числа, хранящиеся в виде строки, можно
преобразовать в числовые значения с помощью функции atof и _atof_l .

// crt_atof.c

//

// This program shows how numbers stored as

// strings can be converted to numeric

// values using the atof and _atof_l functions.

#include <stdlib.h>

#include <stdio.h>

#include <locale.h>

int main(void)

char *str = NULL;

double value = 0;

_locale_t fr = _create_locale(LC_NUMERIC, "fr-FR");

// An example of the atof function

// using leading and training spaces.

str = " 3336402735171707160320 ";

value = atof(str);

printf("Function: atof(\"%s\") = %e\n", str, value);

// Another example of the atof function

// using the 'E' exponential formatting keyword.

str = "3.1412764583E210";

value = atof(str);

printf("Function: atof(\"%s\") = %e\n", str, value);

// An example of the atof and _atof_l functions

// using the 'e' exponential formatting keyword

// and showing different decimal point interpretations.

str = " -2,309e-25";

value = atof(str);

printf("Function: atof(\"%s\") = %e\n", str, value);


value = _atof_l(str, fr);

printf("Function: _atof_l(\"%s\", fr)) = %e\n", str, value);

Output

Function: atof(" 3336402735171707160320 ") = 3.336403e+21

Function: atof("3.1412764583E210") = 3.141276e+210

Function: atof(" -2,309e-25") = -2.000000e+00

Function: _atof_l(" -2,309e-25", fr)) = -2.309000e-25

См. также:
Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Локаль

_ecvt

_fcvt

_gcvt

setlocale, _wsetlocale

_atodbl, _atodbl_l, _atoldbl, _atoldbl_l, _atoflt, _atoflt_l


atoi , _atoi_l , _wtoi , _wtoi_l
Статья • 03.04.2023

Преобразуют строку в целое число.

Синтаксис
C

int atoi(

const char *str

);

int _wtoi(

const wchar_t *str

);

int _atoi_l(

const char *str,

_locale_t locale

);

int _wtoi_l(

const wchar_t *str,

_locale_t locale

);

Параметры
str

Строка для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая функция возвращает значение int , которое создается за счет
интерпретации входных символов как числа. Возвращаемое значение равно 0 для
atoi и _wtoi , если входные данные не могут быть преобразованы в значение этого
типа.

Когда функции переполнены большими отрицательными целочисленными


значениями, LONG_MIN возвращается значение . В подобных условиях atoi и _wtoi
возвращают INT_MAX и INT_MIN . Во всех случаях, когда диапазон не соблюдается,
errno принимает значение ERANGE . Если параметр передается NULL в , вызывается

обработчик недопустимых параметров, как описано в разделе Проверка


параметров. Если продолжение выполнения разрешено, эти функции
устанавливают для errno значение EINVAL и возвращают 0.

Комментарии
Эти функции преобразуют символьную строку в целое значение ( atoi и _wtoi ).
Входная строка представляет собой последовательность символов, которые могут
обрабатываться как числовое значение указанного типа. Функция прекращает
чтение входной строки на первом символе, который она не может распознать как
часть числа. Этот символ может быть нуль-символом ("\0" или L"\0"), которым
завершается строка.

Аргумент str для atoi и _wtoi принимает следующую форму:

[ whitespace ] [ sign ] [ digits ]]

Состоит whitespace из пробелов или символов табуляции, которые игнорируются;


sign имеет значение плюс (+) или минус (-); и digits представляет собой одну или

несколько цифр.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта. Для получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tstoi atoi atoi _wtoi

_ttoi atoi atoi _wtoi

Требования
Подпрограммы Обязательный заголовок

atoi <stdlib.h>

_atoi_l , _wtoi , _wtoi_l <stdlib.h> или <wchar.h>

Пример
Эта программа показывает, как числа, хранящиеся в виде строки, можно
преобразовать в числовые значения с помощью функции atoi .

// crt_atoi.c

// This program shows how numbers


// stored as strings can be converted to

// numeric values using the atoi functions.

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

int main( void )

char *str = NULL;

int value = 0;

// An example of the atoi function.

str = " -2309 ";

value = atoi( str );

printf( "Function: atoi( \"%s\" ) = %d\n", str, value );

// Another example of the atoi function.

str = "31412764";

value = atoi( str );

printf( "Function: atoi( \"%s\" ) = %d\n", str, value );

// Another example of the atoi function

// with an overflow condition occurring.

str = "3336402735171707160320";

value = atoi( str );

printf( "Function: atoi( \"%s\" ) = %d\n", str, value );

if (errno == ERANGE)

printf("Overflow condition occurred.\n");

Output
Function: atoi( " -2309 " ) = -2309

Function: atoi( "31412764" ) = 31412764

Function: atoi( "3336402735171707160320" ) = 2147483647

Overflow condition occurred.

См. также:
Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Локаль

_ecvt

_fcvt

_gcvt

setlocale, _wsetlocale

_atodbl, _atodbl_l, _atoldbl, _atoldbl_l, _atoflt, _atoflt_l


_atoi64 , _atoi64_l , _wtoi64 , _wtoi64_l
Статья • 03.04.2023

Преобразует строку в 64-разрядное целое число.

Синтаксис
C

__int64 _atoi64(

const char *str

);

__int64 _wtoi64(

const wchar_t *str

);

__int64 _atoi64_l(

const char *str,

_locale_t locale

);

__int64 _wtoi64_l(

const wchar_t *str,

_locale_t locale

);

Параметры
str

Строка для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая функция возвращает значение __int64 , которое создается за счет
интерпретации входных символов как числа. Возвращаемое значение равно 0,
если _atoi64 входные данные не могут быть преобразованы в значение этого типа.

Если функции переполнены большими положительными целочисленными


значениями, они возвращаются I64_MAX . Функции возвращаются I64_MIN , если они
переполнены большими отрицательными целочисленными значениями.
Во всех случаях, когда диапазон не соблюдается, errno принимает значение
ERANGE . Если переданный параметр имеет значение NULL , вызывается обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эти функции устанавливают для errno
значение EINVAL и возвращают 0.

Комментарии
Эти функции преобразуют символьную строку в 64-разрядное целое значение.

Входная строка представляет собой последовательность символов, которые могут


обрабатываться как числовое значение указанного типа. Функция перестает
считывать входную строку на первом символе, который не может распознать как
часть числа. Этот символ может быть нуль-символом ("\0" или L"\0"), которым
завершается строка.

Аргумент str для _atoi64 принимает следующую форму:

[ whitespace ] [ sign ] [ digits ]

A whitespace состоит из пробелов или символов табуляции, которые игнорируются,


sign либо плюс (+) или минус (-); и digits являются одной или несколькими

цифрами.

Функция _wtoi64 идентична функции _atoi64 за тем исключением, что принимает


в качестве параметра строку расширенных символов.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта. Для получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tstoi64 _atoi64 _atoi64 _wtoi64


Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_ttoi64 _atoi64 _atoi64 _wtoi64

Требования
Подпрограммы Обязательный заголовок

_atoi64 , _atoi64_l <stdlib.h>

_wtoi64 , _wtoi64_l <stdlib.h> или <wchar.h>

Пример
Эта программа показывает, как числа, хранящиеся в виде строки, можно
преобразовать в числовые значения с помощью функции _atoi64 .

// crt_atoi64.c

// This program shows how numbers stored as

// strings can be converted to numeric values

// using the _atoi64 functions.

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

int main( void )

char *str = NULL;

__int64 value = 0;

// An example of the _atoi64 function

// with leading and trailing white spaces.

str = " -2309 ";

value = _atoi64( str );

printf( "Function: _atoi64( \"%s\" ) = %d\n", str, value );

// Another example of the _atoi64 function

// with an arbitrary decimal point.

str = "314127.64";

value = _atoi64( str );

printf( "Function: _atoi64( \"%s\" ) = %d\n", str, value );

// Another example of the _atoi64 function

// with an overflow condition occurring.

str = "3336402735171707160320";

value = _atoi64( str );

printf( "Function: _atoi64( \"%s\" ) = %d\n", str, value );

if (errno == ERANGE)

printf("Overflow condition occurred.\n");

Output

Function: _atoi64( " -2309 " ) = -2309

Function: _atoi64( "314127.64" ) = 314127

Function: _atoi64( "3336402735171707160320" ) = -1

Overflow condition occurred.

См. также:
Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Локаль

_ecvt

_fcvt

_gcvt

setlocale, _wsetlocale

_atodbl, _atodbl_l, _atoldbl, _atoldbl_l, _atoflt, _atoflt_l


atol , _atol_l , _wtol , _wtol_l
Статья • 03.04.2023

Преобразует строку в длинное целое число.

Синтаксис
C

long atol(

const char *str

);

long _atol_l(

const char *str,

_locale_t locale

);

long _wtol(

const wchar_t *str

);

long _wtol_l(

const wchar_t *str,

_locale_t locale

);

Параметры
str

Строка для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая функция возвращает значение long , которое создается за счет
интерпретации входных символов как числа. Возвращаемое значение
предназначено 0L для atol того, если входные данные не могут быть
преобразованы в значение этого типа.

Если эти функции переполнены большими положительными целочисленными


значениями, они возвращаются LONG_MAX . Если функции переполнены большими
отрицательными целочисленными значениями, LONG_MIN возвращается. Во всех
случаях, когда диапазон не соблюдается, errno принимает значение ERANGE . Если
переданный параметр имеет значение NULL , вызывается обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают 0.

Комментарии
Эти функции преобразуют символьную строку в длинное целое значение ( atol ).

Входная строка представляет собой последовательность символов, которые могут


обрабатываться как числовое значение указанного типа. Функция перестает
считывать входную строку на первом символе, который не может распознать как
часть числа. Этот символ может быть символом NULL ( \0 или L\0 ), завершающим
строку.

Аргумент str для atol принимает следующую форму:

[ whitespace ] [ sign ] [ digits ]]

A whitespace состоит из пробелов или символов табуляции, которые игнорируются;


sign либо плюс ( + ) или минус ( - ); и digits являются одной или несколькими

цифрами.

Функция _wtol идентична функции atol за тем исключением, что принимает


строку расширенных символов.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта. Для получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tstol atol atol _wtol


TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_ttol atol atol _wtol

Требования
Подпрограммы Обязательный заголовок

atol <stdlib.h>

_atol_l , _wtol , _wtol_l <stdlib.h> и <wchar.h>

Пример
Эта программа показывает, как числа, хранящиеся в виде строки, можно
преобразовать в числовые значения с помощью функции atol .

// crt_atol.c

// This program shows how numbers stored as

// strings can be converted to numeric values

// using the atol functions.

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

int main( void )

char *str = NULL;

long value = 0;

// An example of the atol function

// with leading and trailing white spaces.

str = " -2309 ";

value = atol( str );

printf( "Function: atol( \"%s\" ) = %d\n", str, value );

// Another example of the atol function

// with an arbitrary decimal point.

str = "314127.64";

value = atol( str );

printf( "Function: atol( \"%s\" ) = %d\n", str, value );

// Another example of the atol function

// with an overflow condition occurring.

str = "3336402735171707160320";

value = atol( str );

printf( "Function: atol( \"%s\" ) = %d\n", str, value );

if (errno == ERANGE)

printf("Overflow condition occurred.\n");

Output

Function: atol( " -2309 " ) = -2309

Function: atol( "314127.64" ) = 314127

Function: atol( "3336402735171707160320" ) = 2147483647

Overflow condition occurred.

См. также:
Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Локаль

_ecvt

_fcvt

_gcvt

setlocale, _wsetlocale

_atodbl, _atodbl_l, _atoldbl, _atoldbl_l, _atoflt, _atoflt_l


atoll , _atoll_l , _wtoll , _wtoll_l
Статья • 03.04.2023

Преобразует строку в целое число long long .

Синтаксис
C

long long atoll(

const char *str

);

long long _wtoll(

const wchar_t *str

);

long long _atoll_l(

const char *str,

_locale_t locale

);

long long _wtoll_l(

const wchar_t *str,

_locale_t locale

);

Параметры
str

Строка для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая функция возвращает значение long long , которое создается за счет
интерпретации входных символов как числа. Возвращаемое значение равно atoll
0, если входные данные не могут быть преобразованы в значение этого типа.

При переполнении большими положительными целыми значениями функция


atoll возвращает LLONG_MAX , при переполнении большими отрицательными

целыми значениями — LLONG_MIN .


Во всех случаях, когда диапазон не соблюдается, errno принимает значение
ERANGE . Если переданный параметр имеет значение NULL , вызывается обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эти функции устанавливают для errno
значение EINVAL и возвращают 0.

Комментарии
Эти функции преобразуют символьную строку в целое значение long long .

Входная строка представляет собой последовательность символов, которые могут


обрабатываться как числовое значение указанного типа. Функция перестает
считывать входную строку на первом символе, который не может распознать как
часть числа. Этот символ может быть нуль-символом ("\0" или L"\0"), которым
завершается строка.

Аргумент str для atoll принимает следующую форму:

[ whitespace ] [ sign ] [ digits ]

A whitespace состоит из пробелов или символов табуляции, которые игнорируются,


sign либо плюс (+) или минус (-); и digits являются одной или несколькими

цифрами.

Функция _wtoll идентична функции atoll за тем исключением, что принимает в


качестве параметра строку расширенных символов.

Версии этих функций с суффиксом _l идентичны версиям без суффикса, за


исключением того, что они используют переданный параметр языкового стандарта
вместо языкового стандарта текущего потока. Для получения дополнительной
информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_tstoll atoll atoll _wtoll

_tstoll_l _atoll_l _atoll_l _wtoll_l

_ttoll _atoll _atoll _wtoll

Требования
Подпрограммы Обязательный заголовок

atoll , _atoll_l <stdlib.h>

_wtoll , _wtoll_l <stdlib.h> или <wchar.h>

Пример
Эта программа показывает, как преобразовывать числа, хранящиеся в виде строк, в
числовые значения с помощью функции atoll .

// crt_atoll.c

// Build with: cl /W4 /Tc crt_atoll.c

// This program shows how to use the atoll

// functions to convert numbers stored as

// strings to numeric values.

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

int main(void)

char *str = NULL;

long long value = 0;

// An example of the atoll function

// with leading and trailing white spaces.

str = " -27182818284 ";

value = atoll(str);

printf("Function: atoll(\"%s\") = %lld\n", str, value);

// Another example of the atoll function

// with an arbitrary decimal point.

str = "314127.64";

value = atoll(str);

printf("Function: atoll(\"%s\") = %lld\n", str, value);

// Another example of the atoll function

// with an overflow condition occurring.

str = "3336402735171707160320";

value = atoll(str);

printf("Function: atoll(\"%s\") = %lld\n", str, value);

if (errno == ERANGE)

printf("Overflow condition occurred.\n");

Output

Function: atoll(" -27182818284 ") = -27182818284

Function: atoll("314127.64") = 314127

Function: atoll("3336402735171707160320") = 9223372036854775807

Overflow condition occurred.

См. также:
Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Локаль

_ecvt

_fcvt

_gcvt

setlocale, _wsetlocale

_atodbl, _atodbl_l, _atoldbl, _atoldbl_l, _atoflt, _atoflt_l


_beginthread , _beginthreadex
Статья • 03.04.2023

Создает поток.

Синтаксис
C++

uintptr_t _beginthread( // NATIVE CODE

void( __cdecl *start_address )( void * ),

unsigned stack_size,

void *arglist

);

uintptr_t _beginthread( // MANAGED CODE

void( __clrcall *start_address )( void * ),

unsigned stack_size,

void *arglist

);

uintptr_t _beginthreadex( // NATIVE CODE

void *security,

unsigned stack_size,

unsigned ( __stdcall *start_address )( void * ),

void *arglist,

unsigned initflag,

unsigned *thrdaddr

);

uintptr_t _beginthreadex( // MANAGED CODE

void *security,

unsigned stack_size,

unsigned ( __clrcall *start_address )( void * ),

void *arglist,

unsigned initflag,

unsigned *thrdaddr

);

Параметры
start_address

Начальный адрес процедуры, который начинает выполнение нового потока. Для


_beginthread этого используется __cdecl соглашение о вызовах (для машинного
кода) или __clrcall (для управляемого кода). Для _beginthreadex этого используется
__stdcall соглашение о вызовах (для машинного кода) или __clrcall (для
управляемого кода).
stack_size

Размер стека нового потока или 0.

arglist

Список аргументов, передаваемый в новый поток или NULL .

Security

Указатель на структуру SECURITY_ATTRIBUTES , которая определяет, может ли


возвращаемый дескриптор наследоваться дочерними процессами. Если Security
это NULL так, дескриптор нельзя наследовать.

initflag

Флаги, управляющие начальным состоянием нового потока. Задайте initflag


значение 0 для немедленного запуска или CREATE_SUSPENDED для создания потока в
приостановленном состоянии; используется ResumeThread для выполнения потока.
STACK_SIZE_PARAM_IS_A_RESERVATION Установите initflag для флага, который будет

использоваться stack_size в качестве начального размера резерва стека в байтах;


если этот флаг не указан, stack_size указывает размер фиксации.

thrdaddr

Указывает на 32-разрядную переменную, которая получает идентификатор потока.


Если это NULL так, он не используется.

Возвращаемое значение
В случае успеха каждая из этих функций возвращает дескриптор во вновь
созданный поток; однако если вновь созданный поток выполняет выход слишком
быстро, _beginthread может не возвращать допустимый дескриптор. (См.
обсуждение в разделе "Примечания".) При ошибке _beginthread возвращает
значение -1L и errno устанавливается значение EAGAIN , если слишком много
потоков, если EINVAL аргумент недопустим или размер стека неправильный, или
EACCES если недостаточно ресурсов (например, памяти). При возникновении
ошибки _beginthreadex возвращает 0, а errno и _doserrno заданы.

В start_address противном NULL случае вызывается обработчик недопустимых


параметров, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают -1.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.
Дополнительные сведения см. в uintptr_t разделе "Стандартные типы".

Комментарии
Функция _beginthread создает поток, который начинает выполнение процедуры в
start_address . В процедуре start_address необходимо использовать __cdecl (для
машинного кода) или соглашение о вызовах __clrcall (для управляемого кода);
там не должно быть возвращаемого значения. Когда поток возвращается из этой
подпрограммы, он завершается автоматически. Дополнительные сведения о
потоках см. в статье о поддержке многопоточности для более старого кода (Visual
C++).

_beginthreadex напоминает API Win32 CreateThread более тесно, чем _beginthread

это делает. _beginthreadex имеет следующие отличия от _beginthread :

_beginthreadex имеет еще три параметра: initflag , Security и threadaddr .

Новый поток можно создать в приостановленном состоянии (с заданной


безопасностью), а доступ к нему можно осуществлять с помощью thrdaddr ,
который является идентификатором потока.

Процедура в start_address , передаваемая атрибуту _beginthreadex , должна


использовать __stdcall (для машинного кода) или соглашение о вызовах
__clrcall (для управляемого кода) и должна возвращать код завершения

потока.

_beginthreadex возвращает при ошибке 0, а не -1L.

Поток, созданный с помощью вызова _beginthreadex _endthreadex.

Функция _beginthreadex обеспечивает большую подконтрольность создания


потока, чем _beginthread . Функция _endthreadex также является более гибкой.
Например, с помощью _beginthreadex можно использовать сведения о
безопасности, задавать исходное состояние потока (выполняемого или
приостановленного) и получить идентификатор только что созданного потока. Вы
также можете использовать дескриптор потока, возвращаемый API-интерфейсами
_beginthreadex синхронизации, с которыми вы не можете работать _beginthread .

_beginthreadex безопаснее использовать, чем _beginthread . Если поток, созданный


_beginthread , выполняет выход быстро, маркер, возвращаемый вызывающему

объекту _beginthread , может быть недопустим или указывать на другой поток.


Однако дескриптор, возвращаемый вызывающим элементом _beginthreadex ,
должен быть закрыт вызывающим _beginthreadex элементом, поэтому он
гарантированно будет допустимым дескриптором, если _beginthreadex не вернул
ошибку.

Вы можете вызывать _endthread или _endthreadex явно завершать поток; однако


или _endthreadex вызывается автоматически, когда поток возвращается из
подпрограммы, _endthread передаваемой в качестве параметра. Остановка потока
вызовом метода _endthread или _endthreadex помогает обеспечить правильное
восстановление ресурсов, выделяемых для потока.

_endthread автоматически закрывает дескриптор потока, в то время как


_endthreadex не выполняется. Поэтому при использовании _beginthread и

_endthread не закрывайте дескриптор потока явным образом путем вызова API

Win32 CloseHandle . Это поведение отличается от API Win32 ExitThread .

7 Примечание

Для исполняемого файла, связанного с Libcmt.lib, не следует вызывать


функцию API Win32 ExitThread , чтобы не помешать системе времени
выполнения освобождать выделенные ресурсы. _endthread и _endthreadex
освобождают выделенные ресурсы потока и затем вызывают метод
ExitThread .

Операционная система обрабатывает выделение стека, если _beginthread или


_beginthreadex вызываются; не следует передавать адрес стека потоков любой из

этих функций. Кроме того, аргумент stack_size может быть 0, в случае чего
операционная система использует то же значение, что и стек, указанный для
основного потока.

arglist — это параметр для передачи только что созданному потоку. Как правило,
это адрес элемента данных, например символьной строки. arglist может быть
NULL , если оно не требуется, но _beginthread _beginthreadex должно быть
предоставлено некоторое значение для передачи в новый поток. Все потоки
завершаются, если какой-либо поток вызывает метод abort, exit , _exit или
ExitProcess .

Языковой стандарт нового потока инициализируется с помощью глобальных


глобальных текущих сведений о языковом стандарте для каждого процесса. Если
языковой стандарт для каждого потока включен вызовом _configthreadlocale
(глобально или только для новых потоков), поток может изменить языковой
стандарт независимо от других потоков, вызвав setlocale или _wsetlocale . Потоки,
у которых нет набора флагов языкового стандарта для каждого потока, могут
повлиять на сведения о языковом стандарте во всех остальных потоках, которые
также не имеют набора флагов языкового стандарта для каждого потока, а также
всех вновь созданных потоков. Для получения дополнительной информации см.
Locale.

Для /clr кода _beginthread и _beginthreadex каждая из них имеет две перегрузки.
Один принимает собственный указатель функции соглашения о вызовах, а другой
— __clrcall указатель функции. Первая перегрузка не является безопасной для
домена приложения и никогда не будет. При написании /clr кода необходимо
убедиться, что новый поток входит в правильный домен приложения, прежде чем
он будет обращаться к управляемым ресурсам. Это можно сделать, например, с
помощью call_in_appdomain. Вторая перегрузка является доменобезопасной;
только что созданный поток всегда завершается в домене приложения
вызывающего объекта _beginthread или _beginthreadex .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_beginthread <process.h>

_beginthreadex <process.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только многопоточные версии библиотек времени выполнения языка C .

Чтобы использовать _beginthread или _beginthreadex , приложение необходимо


связать с одной из многопотоковых библиотек времени выполнения C.

Примеры
В следующем примере используются _beginthread и _endthread .
C

// crt_BEGTHRD.C

// compile with: /MT /D "_X86_" /c

// processor: x86

#include <windows.h>

#include <process.h> /* _beginthread, _endthread */

#include <stddef.h>

#include <stdlib.h>

#include <conio.h>

void Bounce( void * );

void CheckKey( void * );

// GetRandom returns a random integer between min and max.

#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) +


(min))

// GetGlyph returns a printable ASCII character value

#define GetGlyph( val ) ((char)((val + 32) % 93 + 33))

BOOL repeat = TRUE; // Global repeat flag

HANDLE hStdOut; // Handle for console window

CONSOLE_SCREEN_BUFFER_INFO csbi; // Console information structure

int main()

int param = 0;

int * pparam = &param;

// Get display screen's text row and column information.

hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );

GetConsoleScreenBufferInfo( hStdOut, &csbi );

// Launch CheckKey thread to check for terminating keystroke.

_beginthread( CheckKey, 0, NULL );

// Loop until CheckKey terminates program or 1000 threads created.

while( repeat && param < 1000 )

// launch another character thread.

_beginthread( Bounce, 0, (void *) pparam );

// increment the thread parameter

param++;

// Wait one second between loops.

Sleep( 1000L );

// CheckKey - Thread to wait for a keystroke, then clear repeat flag.

void CheckKey( void * ignored )

_getch();

repeat = 0; // _endthread implied

// Bounce - Thread to create and control a colored letter that moves

// around on the screen.

//

// Params: parg - the value to create the character from

void Bounce( void * parg )

char blankcell = 0x20;

CHAR_INFO ci;

COORD oldcoord, cellsize, origin;

DWORD result;

SMALL_RECT region;

cellsize.X = cellsize.Y = 1;

origin.X = origin.Y = 0;

// Generate location, letter and color attribute from thread argument.

srand( _threadid );

oldcoord.X = region.Left = region.Right =

GetRandom(csbi.srWindow.Left, csbi.srWindow.Right - 1);

oldcoord.Y = region.Top = region.Bottom =

GetRandom(csbi.srWindow.Top, csbi.srWindow.Bottom - 1);

ci.Char.AsciiChar = GetGlyph(*((int *)parg));

ci.Attributes = GetRandom(1, 15);

while (repeat)

// Pause between loops.

Sleep( 100L );

// Blank out our old position on the screen, and draw new letter.

WriteConsoleOutputCharacterA(hStdOut, &blankcell, 1, oldcoord,


&result);

WriteConsoleOutputA(hStdOut, &ci, cellsize, origin, &region);

// Increment the coordinate for next placement of the block.

oldcoord.X = region.Left;
oldcoord.Y = region.Top;

region.Left = region.Right += GetRandom(-1, 1);

region.Top = region.Bottom += GetRandom(-1, 1);

// Correct placement (and beep) if about to go off the screen.

if (region.Left < csbi.srWindow.Left)

region.Left = region.Right = csbi.srWindow.Left + 1;

else if (region.Right >= csbi.srWindow.Right)

region.Left = region.Right = csbi.srWindow.Right - 2;

else if (region.Top < csbi.srWindow.Top)

region.Top = region.Bottom = csbi.srWindow.Top + 1;

else if (region.Bottom >= csbi.srWindow.Bottom)

region.Top = region.Bottom = csbi.srWindow.Bottom - 2;

// If not at a screen border, continue, otherwise beep.

else

continue;

Beep((ci.Char.AsciiChar - 'A') * 100, 175);

// _endthread given to terminate

_endthread();

Чтобы закрыть приложение-пример, нажмите любую клавишу.

В следующем примере кода показано, как использовать дескриптор потока,


возвращаемый с помощью _beginthreadex API WaitForSingleObjectсинхронизации.
Основной поток ожидает завершения другого потока, прежде чем продолжить.
При вызове _endthreadex второго потока объект потока переходит в сигнальное
состояние, что позволяет основному потоку продолжать работу. Его невозможно
выполнить с _beginthread помощью вызовов, _endthread так как _endthread вызовы
CloseHandle уничтожают объект потока, прежде чем его можно будет установить в

сигнальное состояние.

C++

// crt_begthrdex.cpp

// compile with: /MT

#include <windows.h>

#include <stdio.h>

#include <process.h>

unsigned Counter;

unsigned __stdcall SecondThreadFunc( void* pArguments )

printf( "In second thread...\n" );

while ( Counter < 1000000 )

Counter++;

_endthreadex( 0 );

return 0;

int main()

HANDLE hThread;

unsigned threadID;

printf( "Creating second thread...\n" );

// Create the second thread.

hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0,


&threadID );

// Wait until second thread terminates. If you comment out the line

// below, Counter will not be correct because the thread has not

// terminated, and Counter most likely has not been incremented to

// 1000000 yet.

WaitForSingleObject( hThread, INFINITE );

printf( "Counter should be 1000000; it is-> %d\n", Counter );

// Destroy the thread object.


CloseHandle( hThread );

Output

Creating second thread...

In second thread...

Counter should be 1000000; it is-> 1000000

См. также раздел


Управление процессами и средой
_endthread, _endthreadex
abort
exit, _Exit, _exit
GetExitCodeThread
Функции Bessel: _j0 , _j1 , , _y0 _jn ,
_y1 , _yn
Статья • 03.04.2023

Вычисляют функцию Бесселя первого или второго типа порядка 0, 1 и n. Функции


Бесселя часто используются в математике теории электромагнитных волн.

Синтаксис
C

double _j0(

double x

);

double _j1(

double x

);

double _jn(

int n,

double x

);

double _y0(

double x

);

double _y1(

double x

);

double _yn(

int n,

double x

);

Параметры
x

Значение с плавающей запятой.

Целочисленный порядок функции Бесселя.

Возвращаемое значение
Каждая из этих процедур возвращает функцию Бесселя x . Если x имеет
отрицательное значение в функции _y0 , _y1 или _yn , процедура устанавливает
errno в значение EDOM , выводит сообщение об ошибке _DOMAIN в stderr и

возвращает HUGE_VAL . Изменить способ обработки ошибок можно с помощью


_matherr .

Комментарии
Процедуры _j0 , _j1 и _jn возвращают функции Бесселя первого типа: порядка 0, 1
и n соответственно.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND INVALID _DOMAIN

Процедуры _y0 , _y1 и _yn возвращают функции Бесселя второго типа: порядка 0, 1
и n соответственно.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND INVALID _DOMAIN

±0 ZERODIVIDE _SING

|x| < 0.0 INVALID _DOMAIN

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_j0 , _j1 , _jn , _y0 , _y1 , _yn <cmath> (C++), <math.h> (C, C++)

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_bessel1.c

#include <math.h>

#include <stdio.h>

int main( void )

double x = 2.387;

int n = 3, c;

printf( "Bessel functions for x = %f:\n", x );

printf( " Kind Order Function Result\n\n" );


printf( " First 0 _j0( x ) %f\n", _j0( x ) );

printf( " First 1 _j1( x ) %f\n", _j1( x ) );

for( c = 2; c < 5; c++ )

printf( " First %d _jn( %d, x ) %f\n", c, c, _jn( c, x ) );

printf( " Second 0 _y0( x ) %f\n", _y0( x ) );

printf( " Second 1 _y1( x ) %f\n", _y1( x ) );

for( c = 2; c < 5; c++ )

printf( " Second %d _yn( %d, x ) %f\n", c, c, _yn( c, x ) );

Output

Bessel functions for x = 2.387000:

Kind Order Function Result

First 0 _j0( x ) 0.009288

First 1 _j1( x ) 0.522941

First 2 _jn( 2, x ) 0.428870

First 3 _jn( 3, x ) 0.195734

First 4 _jn( 4, x ) 0.063131

Second 0 _y0( x ) 0.511681

Second 1 _y1( x ) 0.094374

Second 2 _yn( 2, x ) -0.432608

Second 3 _yn( 3, x ) -0.819314

Second 4 _yn( 4, x ) -1.626833

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_matherr
bitand
Статья • 03.04.2023

Альтернатива оператору & .

Синтаксис
C

#define bitand &

Remarks
Макрос создает оператор

Пример
C++

// iso646_bitand.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 1, b = 2, result;

result = a & b;

cout << result << endl;

result= a bitand b;

cout << result << endl;

Output

Требования
Заголовка:< iso646.h>
bitor
Статья • 03.04.2023

Альтернатива оператору | .

Синтаксис
C

#define bitor |

Remarks
Макрос возвращает оператор | .

Пример
C++

// iso646_bitor.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 1, b = 2, result;

result = a | b;

cout << result << endl;

result= a bitor b;

cout << result << endl;

Output

Требования
Заголовка:< iso646.h>
bsearch
Статья • 03.04.2023

Выполняет двоичный поиск по отсортированному массиву. Доступна более


безопасная версия этой функции; см bsearch_s.

Синтаксис
C

void *bsearch(

const void *key,

const void *base,

size_t num,

size_t width,

int ( __cdecl *compare ) (const void *key, const void *datum)

);

Параметры
key

Указатель на ключ для поиска.

base

Указатель на базу данных поиска.

number

Число элементов.

width

Ширина элементов.

compare

Функция обратного вызова, которая сравнивает два элемента. Первый — указатель


на ключ для поиска, а второй — указатель на элемент массива, который будет
сравниваться с ключом.

Возвращаемое значение
Функция bsearch возвращает указатель на вхождение key в массиве, на который
указывает base . Если key не найдено, функция возвращает . NULL Если массив не
находится в порядке сортировки по возрастанию или содержит повторяющиеся
записи с идентичными ключами, результат будет непредсказуемым.

Комментарии
Функция bsearch выполняет двоичный поиск по отсортированному массиву,
состоящему из number элементов размером width байт каждый. Значение base —
это указатель на начало массива, в котором должен производиться поиск, а key —
искомое значение. Параметр compare — это указатель на предоставленную
пользователем подпрограмму, которая сравнивает запрошенный ключ с
элементом массива. Он возвращает одно из следующих значений, указывающих их
связь:

Значение, возвращаемое подпрограммой compare Описание

< 0 Ключ меньше, чем элемент массива.

0 Ключ равен элементу массива.

> 0 Ключ больше, чем элемент массива.

Эта функция проверяет свои параметры. Если compare значение равно или
key number равно или ненулевое base NULL number NULL значение или width равно

нулю, функция вызывает обработчик недопустимых параметров, как описано в


разделе "Проверка параметров". Если выполнение может быть продолжено,
параметр errno устанавливается в значение EINVAL , и функция возвращает
значение NULL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

bsearch <stdlib.h> и <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Программа сортирует массив строк с помощью qsort, а затем использует bsearch
для поиска слова "cat".

// crt_bsearch.c

#include <search.h>

#include <string.h>

#include <stdio.h>

int compare( char **arg1, char **arg2 )

/* Compare all of both strings: */

return _strcmpi( *arg1, *arg2 );

int main( void )

char *arr[] = {"dog", "pig", "horse", "cat", "human", "rat", "cow",


"goat"};

char **result;

char *key = "cat";

int i;

/* Sort using Quicksort algorithm: */

qsort( (void *)arr, sizeof(arr)/sizeof(arr[0]), sizeof( char * ), (int


(*)(const

void*, const void*))compare );

for( i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i ) /* Output sorted


list */

printf( "%s ", arr[i] );

/* Find the word "cat" using a binary search algorithm: */

result = (char **)bsearch( (char *) &key, (char *)arr,


sizeof(arr)/sizeof(arr[0]),

sizeof( char * ), (int (*)(const void*, const


void*))compare );

if( result )

printf( "\n%s found at %Fp\n", *result, result );

else

printf( "\nCat not found!\n" );

Output

cat cow dog goat horse human pig rat

cat found at 002F0F04

См. также раздел


Сортировка и поиск

_lfind

_lsearch

qsort
bsearch_s
Статья • 03.04.2023

Выполняет двоичный поиск по отсортированному массиву. Эта функция


представляет собой версию bsearch с усовершенствованиями безопасности, как
описано в разделе "Функции безопасности" в CRT.

Синтаксис
C

void *bsearch_s(

const void *key,

const void *base,

size_t number,

size_t width,

int ( __cdecl *compare ) ( void *, const void *key, const void *datum),

void * context

);

Параметры
key

Указатель на ключ для поиска.

base

Указатель на базу данных поиска.

number

Число элементов.

width

Ширина элементов.

compare

Функция обратного вызова, которая сравнивает два элемента. Первый аргумент —


это указатель context . Второй аргумент — указатель на ключ key для поиска.
Третий аргумент — указатель на элемент массива, который будет сравниваться со
значением key .

context

Указатель на объект, доступ к которому может получить функция сравнения.


Возвращаемое значение
Функция bsearch_s возвращает указатель на вхождение key в массиве, на который
указывает base . Если key функция не найдена, функция возвращает . NULL Если
массив не находится в порядке сортировки по возрастанию или содержит
повторяющиеся записи с идентичными ключами, результат будет
непредсказуемым.

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


недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, параметр errno устанавливается в значение
EINVAL , и функция возвращает значение NULL . Дополнительные сведения см. в

разделе errno, а _doserrno_sys_errlistтакже ._sys_nerr

Условия ошибок

key base compare number width Значение errno

NULL any any any any EINVAL

any NULL any != 0 any EINVAL

any any any any =0 EINVAL

any any NULL любой any EINVAL

Комментарии
Функция bsearch_s выполняет двоичный поиск по отсортированному массиву,
состоящему из number элементов размером width байт каждый. Значение base —
это указатель на начало массива, в котором должен производиться поиск, а key —
искомое значение. Параметр compare — это указатель на предоставляемую
пользователем подпрограмму, которая сравнивает заданный ключ с элементом
массива и возвращает одно из следующих значений, показывающих, как
соотносятся значения ключа и элемента массива:

Значение, возвращаемое подпрограммой compare Описание

<0 Ключ меньше, чем элемент массива.

0 Ключ равен элементу массива.


Значение, возвращаемое подпрограммой compare Описание

>0 Ключ больше, чем элемент массива.

Указатель context может быть полезен, если структура данных, в которой


производится поиск, является частью объекта, и функции сравнения требуется
доступ к членам этого объекта. Функция compare может привести указатель void к
соответствующему типу объекта и получить доступ к членам этого объекта.
Добавление параметра делает bsearch_s более безопасным, так как контекст
может использоваться, чтобы избежать ошибок повторного context входа,
связанных с использованием статических переменных, чтобы сделать данные
доступными для compare функции.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

bsearch_s <stdlib.h> и <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа сортирует строковый массив, qsort_sа затем использует bsearch_s
для поиска слова "cat".

C++

// crt_bsearch_s.cpp

// This program uses bsearch_s to search a string array,

// passing a locale as the context.

// compile with: /EHsc

#include <stdlib.h>

#include <stdio.h>

#include <search.h>

#include <process.h>

#include <locale.h>

#include <locale>

#include <windows.h>

using namespace std;

// The sort order is dependent on the code page. Use 'chcp' at the

// command line to change the codepage. When executing this application,

// the command prompt codepage must match the codepage used here:

#define CODEPAGE_850

#ifdef CODEPAGE_850

#define ENGLISH_LOCALE "English_US.850"

#endif

#ifdef CODEPAGE_1252

#define ENGLISH_LOCALE "English_US.1252"

#endif

// The context parameter lets you create a more generic compare.

// Without this parameter, you would have stored the locale in a

// static variable, thus making it vulnerable to thread conflicts

// (if this were a multithreaded program).

int compare( void *pvlocale, char **str1, char **str2)

char *s1 = *str1;

char *s2 = *str2;

locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

return use_facet< collate<char> >(loc).compare(

s1, s1+strlen(s1),

s2, s2+strlen(s2) );

int main( void )

char *arr[] = {"dog", "pig", "horse", "cat", "human", "rat", "cow",


"goat"};

char *key = "cat";

char **result;

int i;

/* Sort using Quicksort algorithm: */

qsort_s( arr,

sizeof(arr)/sizeof(arr[0]),

sizeof( char * ),

(int (*)(void*, const void*, const void*))compare,

&locale(ENGLISH_LOCALE) );

for( i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i ) /* Output sorted


list */

printf( "%s ", arr[i] );

/* Find the word "cat" using a binary search algorithm: */

result = (char **)bsearch_s( &key,

arr,

sizeof(arr)/sizeof(arr[0]),

sizeof( char * ),

(int (*)(void*, const void*, const


void*))compare,

&locale(ENGLISH_LOCALE) );

if( result )

printf( "\n%s found at %Fp\n", *result, result );

else

printf( "\nCat not found!\n" );

Output

cat cow dog goat horse human pig rat

cat found at 002F0F04

См. также раздел


Сортировка и поиск

_lfind

_lsearch

qsort
btowc
Статья • 03.04.2023

Определяет, представляет ли целое число допустимый однобайтовый символ в


начальном состоянии сдвига.

Синтаксис
C

wint_t btowc(

int character

);

Параметры
character

Проверяемое целое число.

Возвращаемое значение
Возвращает представление символа в виде расширенного символа, если целое
число представляет допустимый однобайтовый символ в начальном состоянии
сдвига. Возвращает значение WEOF , если целое число является EOF допустимым
однобайтовый символ в начальном состоянии сдвига. Выходные данные этой
функции зависят от текущего языкового стандарта LC_TYPE .

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

btowc <stdio.h> или <wchar.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


mbtowc, _mbtowc_l
_byteswap_uint64 , _byteswap_ulong ,
_byteswap_ushort
Статья • 03.04.2023

Меняет порядок байтов в целом числе.

Синтаксис
C

unsigned short _byteswap_ushort ( unsigned short val );

unsigned long _byteswap_ulong ( unsigned long val );

unsigned __int64 _byteswap_uint64 ( unsigned __int64 val );

Параметры
val

Целое число со знаком, меняющим порядок байтов.

Требования
Подпрограмма Обязательный заголовок

_byteswap_ushort <stdlib.h>

_byteswap_ulong <stdlib.h>

_byteswap_uint64 <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_byteswap.c

#include <stdlib.h>

int main()

unsigned __int64 u64 = 0x0102030405060708;

unsigned long ul = 0x01020304;

printf("byteswap of %I64x = %I64x\n", u64, _byteswap_uint64(u64));

printf("byteswap of %Ix = %Ix", ul, _byteswap_ulong(ul));

Output

byteswap of 102030405060708 = 807060504030201

byteswap of 1020304 = 4030201

См. также раздел


Подпрограммы универсальной среды выполнения C по категориям
c16rtomb , c32rtomb
Статья • 03.04.2023

Преобразуйте расширенный символ UTF-16 или UTF-32 в многобайтовый символ


UTF-8.

Синтаксис
C

size_t c16rtomb(

char *mbchar,

char16_t wchar,

mbstate_t *state

);

size_t c32rtomb(

char *mbchar,

char32_t wchar,

mbstate_t *state

);

Параметры
mbchar

Указатель на массив для хранения преобразованного многобайтового символа


UTF-8.

wchar

Расширенный символ для преобразования.

state

Указатель на объект mbstate_t .

Возвращаемое значение
Число байтов, сохраняемых в объекте массива mbchar , включая все
последовательности сдвигов. Если wchar не является допустимым расширенным
символом, возвращается значение ( size_t -1) и errno EILSEQ значение state не
указано.
Комментарии
Функция c16rtomb преобразует символ wchar UTF-16 LE в эквивалентную
многобайтовую узкую последовательность символов UTF-8. Если mbchar не
является пустым указателем, функция сохраняет преобразованную
последовательность в объекте массива, на который указывает mbchar . До
MB_CUR_MAX байтов сохраняется в mbchar , а state устанавливается в итоговое
состояние многобайтового сдвига.

Если wchar это широкий символ NULL, то сохраняется последовательность,


необходимая для восстановления начального состояния сдвига, а затем — символ
NULL. state имеет начальное состояние преобразования. Функция c32rtomb
идентична, но преобразует символ в формате UTF-32.

Если mbchar является пустым указателем, поведение аналогично вызову функции,


которая заменяет внутренний буфер на mbchar , а расширенный пустой символ —
на wchar .

Объект состояния преобразования state позволяет выполнять последующие


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

Чтобы преобразовать символы UTF-16 в многобайтовые символы, отличные от


UTF-8, используйте wcstombsфункции , _wcstombs_lwcstombs_s или _wcstombs_s_l.

Требования
Подпрограмма Обязательный заголовок

c16rtomb , c32rtomb C, C++: <uchar.h>

Сведения о совместимости см. в разделе Совместимость.

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

mbrtoc16, mbrtoc32

wcrtomb

wcrtomb_s
cabs , cabsf , cabsl
Статья • 03.04.2023

Извлекает абсолютное значение комплексного числа.

Синтаксис
C

double cabs(

_Dcomplex z

);

float cabs(

_Fcomplex z

); // C++ only

long double cabs(

_Lcomplex z

); // C++ only

float cabsf(

_Fcomplex z

);

long double cabsl(

_Lcomplex z

);

Параметры
z

Комплексное число.

Возвращаемое значение
Абсолютное значение параметра z .

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки cabs , которые
принимают значения _Fcomplex или _Lcomplex и возвращают значения float или
long double . В программе на языке C cabs всегда принимает значение _Dcomplex и
возвращает значение double .
Требования
Подпрограмма Заголовок C Заголовок C++

cabs , cabsf , cabsl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

norm, normf, norml

creal, crealf, creall

cproj, cprojf, cprojl

conj, conjf, conjl

cimag, cimagf, cimagl

carg, cargf, cargl


_cabs
Статья • 03.04.2023

Вычисляет абсолютное значение комплексного числа.

Синтаксис
C

double _cabs(

struct _complex z

);

Параметры
z

Комплексное число.

Возвращаемое значение
При успешном выполнении функция _cabs возвращает абсолютное значение
своего аргумента. При переполнении _cabs возвращает HUGE_VAL и задает errno в
ERANGE . Вы можете изменить обработку ошибок с помощью _matherr.

Комментарии
Функция _cabs вычисляет абсолютное значение комплексного числа, которое
должно быть структурой типа _complex. Структура z состоит из вещественной
части x и мнимой части y . Вызов, который _cabs создает значение, эквивалентное
выражению sqrt( z.x * z.x + z.y * z.y ) .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_cabs <math.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_cabs.c

// Using _cabs, this program calculates

// the absolute value of a complex number.

#include <math.h>

#include <stdio.h>

int main( void )

struct _complex number = { 3.0, 4.0 };

double d;

d = _cabs( number );

printf( "The absolute value of %f + %fi is %f\n",

number.x, number.y, d );

Output

The absolute value of 3.000000 + 4.000000i is 5.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
abs, labs, llabs, _abs64

fabs, fabsf, fabsl


cacos , cacosf , cacosl
Статья • 03.04.2023

Извлекает арккосин комплексного числа, при этом ветвь вырезается за пределами


интервала [-1, +1] вдоль реальной оси.

Синтаксис
C

_Dcomplex cacos( _Dcomplex z );

_Fcomplex cacosf( _Fcomplex z );

_Lcomplex cacosl( _Lcomplex z );

C++

_Fcomplex cacos( _Fcomplex z ); // C++ only

_Lcomplex cacos( _Lcomplex z ); // C++ only

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Арка косиана z , в радианах. Результат несвязан вдоль мнимой оси и ограничен
интервалом [0, π] вдоль реальной оси. Если z не попадает в интервал [−1, +1],
возникает ошибка домена.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cacos , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C cacos всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

cacos , cacosf , cacosl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


cacosh , cacoshf , cacoshl
Статья • 03.04.2023

Извлекает обратный гиперболический косинус комплексного числа, ветви


которого заканчиваются раньше значения 1 на реальной оси.

Синтаксис
C

_Dcomplex cacosh(

_Dcomplex z

);

_Fcomplex cacosh(

_Fcomplex z

); // C++ only

_Lcomplex cacosh(

_Lcomplex z

); // C++ only

_Fcomplex cacoshf(

_Fcomplex z

);

_Lcomplex cacoshl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Обратный гиперболический косинус аргумента z в радианах. Результат
необязательный и неотрицательный вдоль реальной оси и в интервале [-iπ, +iπ]
вдоль мнимой оси.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cacosh ,
которые принимают и возвращают значения _Fcomplex и _Lcomplex . В программе
на языке C cacosh всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

cacosh , cacoshf , cacoshl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


_callnewh
Статья • 03.04.2023

Вызывает установленный new в данный момент обработчик.

Синтаксис
C++

int _callnewh(

size_t size

Параметры
size

Объем памяти, который new оператор пытался выделить.

Возвращаемое значение
Значение Описание

0 Сбой. Либо обработчик не new установлен, либо обработчик не new активен.

1 Успешно. new Обработчик установлен и активен. Выделение памяти можно


повторить.

Исключения
Эта функция вызывает bad_alloc исключение, new если не удается найти
обработчик.

Комментарии
Обработчик new вызывается, если операторуnew не удается выделить память.
Затем new обработчик может инициировать какое-либо соответствующее
действие, например освободить память, чтобы последующие выделения были
успешными.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_callnewh internal.h

См. также раздел


_set_new_handler

_set_new_mode
calloc
Статья • 03.04.2023

Выделяет массив в памяти и инициализирует его элементы значением 0.

Синтаксис
C

void *calloc(

size_t number,

size_t size

);

Параметры
number

Число элементов.

size

Длина каждого элемента в байтах.

Возвращаемое значение
calloc возвращает указатель на выделенную память. Пространство хранилища, на
которое указывает возвращаемое значение, хорошо выравнивается для хранения
объектов любого типа. Чтобы получить указатель на тип, отличный от void ,
используйте приведение типов для возвращаемого значения.

Комментарии
Функция calloc выделяет пространство для хранения массива из number
элементов, каждый из которых имеет размер size . Каждый элемент
инициализируется значением 0.

Функция calloc задает для параметра errno в значение ENOMEM , если выделение
памяти завершается сбоем или количество запрошенной памяти превышает
_HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделе errno,
_doserrno, _sys_errlistи _sys_nerr.
В реализации Майкрософт, если number или size равно нулю, calloc возвращает
указатель на выделенный блок ненулевых размеров. Попытка чтения или записи с
помощью возвращаемого указателя приводит к неопределенному поведению.

calloc использует функцию C++ _set_new_mode , чтобы задать новый режим


обработчика. Новый режим обработки указывает, должна ли функция calloc при
сбое вызывать новую подпрограмму обработчика, заданную функцией
_set_new_handler. По умолчанию calloc не вызывает новую подпрограмму
обработчика при сбое выделения памяти. Это поведение по умолчанию можно
переопределить, чтобы при calloc сбое выделения памяти он вызывает новую
подпрограмму обработчика так же, как new оператор при сбое по той же причине.
Чтобы переопределить значение по умолчанию, вызовите

_set_new_mode(1);

на ранних этапах программы или с помощью NEWMODE.OBJ ссылки (см. раздел


Параметры связи).

Если приложение связано с отладочной версией библиотек времени выполнения


C, calloc разрешается в _calloc_dbg. Дополнительные сведения об управлении
кучей в процессе отладки см. в разделе Куча отладки CRT.

calloc помечается __declspec(noalias) и __declspec(restrict) означает, что

функция гарантированно не будет изменять глобальные переменные, а


возвращаемый указатель не является псевдонимом. Дополнительные сведения см.
в разделах noalias и restrict.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

calloc <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_calloc.c

// This program uses calloc to allocate space for

// 40 long integers. It initializes each element to zero.

#include <stdio.h>

#include <malloc.h>

int main( void )

long *buffer;

buffer = (long *)calloc( 40, sizeof( long ) );

if( buffer != NULL )


printf( "Allocated 40 long integers\n" );

else

printf( "Can't allocate memory\n" );

free( buffer );

Output

Allocated 40 long integers

См. также раздел


Выделение памяти

free

malloc

realloc\
_calloc_dbg
Статья • 03.04.2023

Выделяет блоки памяти в куче с дополнительным пространством для заголовка


отладки и перезаписи буферов (только для отладочной версии).

Синтаксис
C

void *_calloc_dbg(

size_t num,

size_t size,

int blockType,

const char *filename,

int linenumber

);

Параметры
number

Запрошенное число блоков памяти.

size

Запрошенный размер каждого блока памяти (байт).

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

Сведения о типах блоков выделения и их использовании см. в разделеТипы блоков


в отладочной куче.

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Параметры filename и linenumber доступны только при _calloc_dbg явном вызове


или определении _CRTDBG_MAP_ALLOC константы препроцессора.
Возвращаемое значение
При успешном выполнении эта функция возвращает указатель на
пользовательскую часть выделенного блока памяти, вызывает новую функцию
обработчика или возвращает значение NULL . Полное описание поведения
возвращения см. в разделе "Примечания". Дополнительные сведения об
использовании новой функции обработчика см. в calloc этой функции.

Комментарии
_calloc_dbg — отладочная версия calloc функции. Если _DEBUG параметр не

определен, каждый вызов _calloc_dbg сводится к вызову calloc . Обе функции,


calloc и _calloc_dbg , выделяют блоки памяти number в основной куче, но

_calloc_dbg предлагает несколько функций отладки:

Буферы с обеих сторон пользовательской части блока, которые необходимо


проверить на наличие утечек.

Параметр типа блока для отслеживания конкретных типов выделения.

Данные filename / linenumber , определяющие источник запросов на


выделение памяти.

_calloc_dbg выделяет каждый блок памяти, добавляя немного больше

пространства, чем запрошено size . Дополнительное пространство используется


диспетчером кучи отладки для связывания блоков памяти отладки и
предоставления приложению сведений о заголовке отладки и перезаписи
буферов. При выделении блока пользовательская часть блока заполняется
значением 0xCD, а каждый буфер перезаписи заполняется 0xFD.

_calloc_dbg задает для errno значение ENOMEM в случае сбоя выделения памяти;
значение EINVAL возвращается, если необходимый объем памяти (включая ранее
упомянутую нагрузку) превышает _HEAP_MAXREQ . Сведения об этом и других кодах
ошибок см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о различиях между вызовом стандартной функции кучи и отладочной
версией см. в разделе Отладка версий функций выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_calloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_callocd.c

// This program uses _calloc_dbg to allocate space for

// 40 long integers. It initializes each element to zero.

#include <stdio.h>

#include <malloc.h>

#include <crtdbg.h>

int main( void )

long *bufferN, *bufferC;

// Call _calloc_dbg to include the filename and line number

// of our allocation request in the header and also so we can

// allocate CLIENT type blocks specifically

bufferN = (long *)_calloc_dbg( 40, sizeof(long), _NORMAL_BLOCK,


__FILE__, __LINE__ );

bufferC = (long *)_calloc_dbg( 40, sizeof(long), _CLIENT_BLOCK,


__FILE__, __LINE__ );

if( bufferN != NULL && bufferC != NULL )

printf( "Allocated memory successfully\n" );

else

printf( "Problem allocating memory\n" );

/ _free_dbg must be called to free CLIENT type blocks

free( bufferN );

_free_dbg( bufferC, _CLIENT_BLOCK );

Output

Allocated memory successfully

См. также раздел


Подпрограммы отладки

calloc

_malloc_dbg

_DEBUG
carg , cargf , cargl
Статья • 03.04.2023

Извлекает аргумент комплексного числа с вырезанной ветвью вдоль


отрицательной реальной оси.

Синтаксис
C

double carg(

_Dcomplex z

);

float carg(

_Fcomplex z

); // C++ only

long double carg(

_Lcomplex z

); // C++ only

float cargf(

_Fcomplex z

);

long double cargl(

_Lcomplex z

);

#define carg(X) // Requires C11 or higher

Параметры
z

Комплексное число.

Возвращаемое значение
Аргумент (или "этап") функции z . Результатом является интервал [-π, +π].

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки carg , которые
принимают значения _Fcomplex или _Lcomplex и возвращают значения float или
long double . В программе C, если вы не используете <макрос tgmath.h> для вызова
этой функции, carg всегда принимает _Dcomplex значение и возвращает double
значение.

При использовании <макроса tgmath.h> carg() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

Требования
Подпрограмма Заголовок C Заголовок C++

carg , cargf , cargl <complex.h> <ccomplex>

carg Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

norm, normf, norml

creal, crealf, creall

cproj, cprojf, cprojl

conj, conjf, conjl

cimag, cimagf, cimagl

cabs, cabsf, cabsl


casin , casinf , casinl
Статья • 03.04.2023

Извлекает арксинус комплексного числа, при этом ветвь вырезается за пределами


интервала [-1, +1] вдоль реальной оси.

Синтаксис
C

_Dcomplex casin(

_Dcomplex z

);

_Fcomplex casin(

_Fcomplex z

); // C++ only

_Lcomplex casin(

_Lcomplex z

); // C++ only

_Fcomplex casinf(

_Fcomplex z

);

_Lcomplex casinl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Арксинус z в радианах. Результат несвязан вдоль мнимой оси и в интервале [-π/2,
+π/2] вдоль реальной оси.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки casin , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C casin всегда принимает и возвращает значение _Dcomplex .
Требования
Подпрограмма Заголовок C Заголовок C++

casin , casinf , casinl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


casinh , casinhf , casinhl
Статья • 03.04.2023

Извлекает обратный гиперболический синус комплексного числа, при этом ветвь


вырезается за пределами интервала [-i, +i] вдоль мнимой оси.

Синтаксис
C

_Dcomplex casinh(

_Dcomplex z

);

_Fcomplex casinh(

_Fcomplex z

); // C++ only

_Lcomplex casinh(

_Lcomplex z

); // C++ only

_Fcomplex casinhf(

_Fcomplex z

);

_Lcomplex casinhl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Обратный гиперболический синус аргумента z в радианах. Результат несвязан
вдоль реальной оси и в интервале [-iπ/2, +iπ/2] вдоль мнимой оси.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки casinh ,
которые принимают и возвращают значения _Fcomplex и _Lcomplex . В программе
на языке C casinh всегда принимает и возвращает значение _Dcomplex .
Требования
Подпрограмма Заголовок C Заголовок C++

casinh , casinhf , casinhl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


catan , catanf , catanl
Статья • 03.04.2023

Извлекает арктангенс комплексного числа с вырезанными ветвями за пределами


интервала [-1; +1] вдоль мнимой оси.

Синтаксис
C

_Dcomplex catan( _Dcomplex z );

_Fcomplex catanf( _Fcomplex z );

_Lcomplex catanl( _Lcomplex z );

C++

_Fcomplex catan( _Fcomplex z ); // C++ only

_Lcomplex catan( _Lcomplex z ); // C++ only

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Арктангенс z в радианах. Результат несвязан вдоль мнимой оси и в интервале [-
π/2; +π/2] вдоль реальной оси.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки catan , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C catan всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++
Подпрограмма Заголовок C Заголовок C++

catan , catanf , catanl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


catanh , catanhf , catanhl
Статья • 03.04.2023

Извлекает обратный гиперболический тангенс комплексного числа с вырезанными


ветвями за пределами интервала [-1; +1] вдоль реальной оси.

Синтаксис
C

_Dcomplex catanh(

_Dcomplex z

);

_Fcomplex catanh(

_Fcomplex z

); // C++ only

_Lcomplex catanh(

_Lcomplex z

); // C++ only

_Fcomplex catanhf(

_Fcomplex z

);

_Lcomplex catanhl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Обратный гиперболический тангенс аргумента z в радианах. Результат несвязан
вдоль реальной оси и в интервале [-iπ/2; +iπ/2] вдоль мнимой оси. Если z не
попадает в интервал [−1, +1], возникает ошибка домена. Если z имеет значение −1
или +1, возникает ошибка полюса.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки catanh ,
которые принимают и возвращают значения _Fcomplex и _Lcomplex . В программе
на языке C catanh всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

catanh , catanhf , catanhl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


cbrt , cbrtf , cbrtl
Статья • 03.04.2023

Вычисляет кубический корень.

Синтаксис
C

double cbrt(

double x

);

float cbrt(

float x

); // C++ only

long double cbrt(

long double x

); // C++ only

float cbrtf(

float x

);

long double cbrtl(

long double x

);

#define cbrt(X) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой

Возвращаемое значение
Функции cbrt возвращают кубический корень x .

Входные данные Исключение SEH _matherr Исключение

± INF, QNaN, IND нет нет

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cbrt , которые
принимают типы float или long double . В программе на языке C, если вы не
используете <макрос tgmath.h> для вызова этой функции, cbrt всегда принимает и
возвращает . double

При использовании <макроса tgmath.h> cbrt() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

cbrt , cbrtf , cbrtl <math.h> <cmath>

cbrt Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_cbrt.c

// Compile using: cl /W4 crt_cbrt.c

// This program calculates a cube root.

#include <math.h>

#include <stdio.h>

int main( void )

double question = -64.64;

double answer;

answer = cbrt(question);

printf("The cube root of %.2f is %.6f\n", question, answer);

Output

The cube root of -64.64 is -4.013289

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
exp, expf, expl

log, logf, log10, log10f

pow, powf, powl


_Cbuild , _FCbuild , _LCbuild
Статья • 03.04.2023

Создает комплексное число из реальных и мнимых частей.

Синтаксис
C

_Dcomplex _Cbuild( double real, double imaginary );

_Fcomplex _FCbuild( float real, float imaginary );

_Lcomplex _LCbuild( long double real, long double imaginary );

Параметры
real

Реальная часть комплексного числа для создания.

imaginary

Мнимая часть комплексного числа для построения.

Возвращаемое значение
, _Dcomplex или _Lcomplex структура, представляющая комплексное число ( real *
imaginary i) для значений указанного типа с плавающей _Fcomplex запятой.

Комментарии
_FCbuild Функции _Cbuild и _LCbuild функции упрощают создание сложных типов.
Используйте функции , creallcrealfчтобы получить реальные и воображаемые части
представленных сложных чисел.crealcimagcimagfcimagl

Требования
Подпрограмма Заголовок C Заголовок C++

_Cbuild , _FCbuild , _LCbuild <complex.h> <ccomplex>


Эти функции зависят от Корпорации Майкрософт. Типы _Dcomplex , _Fcomplex и
_Lcomplex являются эквивалентами майкрософт для неимплированных
собственных типов double _Complex float _Complex C99 и long double
_Complex соответственно. Дополнительные сведения о совместимости см. в разделе
Compatibility.

См. также раздел


Алфавитный указатель функций

_Cmulcc, _FCmulcc, _LCmulcc

_Cmulcr, _FCmulcr, _LCmulcr

norm, normf, norml

cproj, cprojf, cprojl

conj, conjf, conjl

creal, crealf, creall

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


ccos , ccosf , ccosl
Статья • 03.04.2023

Возвращает косинус комплексного числа.

Синтаксис
C

_Dcomplex ccos(

_Dcomplex z

);

_Fcomplex ccos(

_Fcomplex z

); // C++ only

_Lcomplex ccos(

_Lcomplex z

); // C++ only

_Fcomplex ccosf(

_Fcomplex z

);

_Lcomplex ccosl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Косинус z в радианах.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки ccos , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C ccos всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

ccos , ccosf , ccosl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

csqrt, csqrtf, csqrtl


ccosh , ccoshf , ccoshl
Статья • 03.04.2023

Извлекает гиперболический косинус комплексного числа.

Синтаксис
C

_Dcomplex ccosh(

_Dcomplex z

);

_Fcomplex ccosh(

_Fcomplex z

); // C++ only

_Lcomplex ccosh(

_Lcomplex z

); // C++ only

_Fcomplex ccoshf(

_Fcomplex z

);

_Lcomplex ccoshl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Гиперболический косинус аргумента z в радианах.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки ccosh , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C ccosh всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

ccosh , ccoshf , ccoshl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


ceil , ceilf , ceill
Статья • 03.04.2023

Рассчитывает верхний предел значения.

Синтаксис
C

double ceil(

double x

);

float ceil(

float x

); // C++ only

long double ceil(

long double x

); // C++ only

float ceilf(

float x

);

long double ceill(

long double x

);

#define ceil(X) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функции ceil возвращают значение с плавающей запятой, которое представляет
наименьшее целое число, большее или равное x . Ошибка не возвращается.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

Функция ceil содержит реализацию, которая использует Streaming SIMD Extensions


2 (SSE2). Сведения и ограничения по использованию реализации SSE2 см. в
разделе _set_SSE2_enable.
Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки ceil , которые
принимают типы float или long double . В программе на языке C, если вы не
используете <макрос tgmath.h> для вызова этой функции, ceil всегда принимает и
возвращает double .

При использовании <макроса tgmath.h> ceil() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого состояния см. в статье Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

ceil , ceilf , ceill <math.h>

ceil Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для floor.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
floor, floorf, floorl

fmod, fmodf

round, roundf, roundl


_cexit , _c_exit
Статья • 03.04.2023

Выполняет операции очистки и возвращает значение, не прерывая процесс.

Синтаксис
C

void _cexit( void );

void _c_exit( void );

Remarks
Функция _cexit вызывает функции, зарегистрированные atexit и _onexit , в
обратном порядке. Перед возвратом _cexit очищает все буферы ввода-вывода и
закрывает все открытые потоки. Функция _c_exit аналогична функции _exit , но
возвращается к вызывающему процессу без обработки atexit или _onexit либо
очистки буферов потоков. Поведение exit , _exit _cexit и _c_exit показано в
следующей таблице.

Функция Поведение

exit Выполняет полные процедуры завершения библиотеки C, завершает процесс и


завершается с предоставленным кодом состояния.

_exit Выполняет быстрые процедуры завершения библиотеки C, завершает процесс и


завершается с предоставленным кодом состояния.

_cexit Выполняет полные процедуры завершения библиотеки C и возвращается


вызывающему объекту, но не завершает процесс.

_c_exit Выполняет быстрые процедуры завершения библиотеки C и возвращается


вызывающему объекту, но не завершает процесс.

При вызове _cexit или _c_exit функции деструкторы для любых временных или
автоматических объектов, существующих во время вызова, не вызываются.
Автоматический объект — это объект, определенный в функции, в которой объект
не объявлен как статический. Временный объект — это объект, созданный
компилятором. Чтобы удалить автоматический объект перед вызовом _cexit или
_c_exit , явным образом вызовите деструктор объекта следующим образом:
C++

myObject.myClass::~myClass( );

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_cexit <process.h>

_c_exit <process.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Управление процессами и средой

abort

atexit

_exec, _wexec функции

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
cexp , cexpf , cexpl
Статья • 03.04.2023

Вычисляет экспоненту комплексного числа с основанием e.

Синтаксис
C

_Dcomplex cexp( _Dcomplex z );

_Fcomplex cexpf( _Fcomplex z );

_Lcomplex cexpl( _Lcomplex z );

_Fcomplex cexp( _Fcomplex z ); // C++ only

_Lcomplex cexp( _Lcomplex z ); // C++ only

Параметры
z

Комплексное число, представляющее экспоненту.

Возвращаемое значение
Значение e , возведенное в степень z .

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cexp , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C cexp всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

cexp , cexpf , cexpl <complex.h> <complex.h>

Сведения о совместимости см. в разделе Совместимость.


См. также раздел
Алфавитный указатель функций

cpow, cpowf, cpowl

clog10, clog10f, clog10l

clog, clogf, clogl


cgets
Статья • 03.04.2023

Имя cgets функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _cgets функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать функцию с повышенным уровнем


_cgets_s безопасности. Вы также можете продолжать использовать это имя
функции и отключить предупреждение. Дополнительные сведения см. в разделе
"Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_cgets_s , _cgetws_s
Статья • 03.04.2023

Возвращает строку символов из консоли. Эти версии и _cgetwsулучшения


безопасности, как описано в функциях_cgetsбезопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _cgets_s(

char *buffer,

size_t numberOfElements,

size_t *pSizeRead

);

errno_t _cgetws_s(

wchar_t *buffer

size_t numberOfElements,

size_t *pSizeRead

);

template <size_t size>

errno_t _cgets_s(

char (&buffer)[size],

size_t *pSizeRead

); // C++ only

template <size_t size>

errno_t _cgetws_s(

wchar_t (&buffer)[size],

size_t *pSizeRead

); // C++ only

Параметры
buffer

Место хранения данных.


numberOfElements

Размер буфера в однобайтовых или расширенных символах, который также


представляет максимальное число символов для чтения.

pSizeRead

Число фактически прочитанных символов.

Возвращаемое значение
При успешном выполнении возвращается ноль, в противном случае возвращается
код ошибки.

Условия ошибок

buffer numberOfElements pSizeRead Возвращает Содержимое buffer

NULL any any EINVAL Недоступно

не NULL нуль any EINVAL не изменено

не NULL any NULL EINVAL строка нулевой длины

Комментарии
_cgets_s и _cgetws_s читают строки из консоли и копируют ее (с нулевым

признаком конца) в buffer . _cgetws_s — версия функции для расширенных


символов. За исключением размера символа, поведение этих двух функций
идентично. Максимальный размер строки для чтения передается в качестве
параметра numberOfElements . Размер должен учитывать дополнительный символ
для конечного нуля. Число фактически считанных символов помещается в
pSizeRead .

Если во время операции или при проверке параметров возникает ошибка,


вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение разрешено продолжать, errno
установлено значение EINVAL и EINVAL возвращается.

В C++ использование этих функций упрощается перегрузками шаблонов.


Перегрузки могут автоматически определять длину буфера, что устраняет
необходимость указания аргумента размера. Кроме того, они могут автоматически
заменять более старые и менее безопасные функции более новыми, более
безопасными аналогами. Дополнительные сведения см. в разделе "Безопасные
перегрузки шаблонов".

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_cgetts_s _cgets_s _cgets_s _cgetws_s

Требования
Подпрограмма Обязательный заголовок

_cgets_s <conio.h>

_cgetws_s <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Ввод-вывод на консоль и порт

_getch, _getwch
chdir
Статья • 03.04.2023

Имя chdir функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _chdir для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _chdir . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_chdir , _wchdir
Статья • 03.04.2023

Изменяет текущий рабочий каталог.

Синтаксис
C

int _chdir(

const char *dirname

);

int _wchdir(

const wchar_t *dirname

);

Параметры
dirname

Путь к новому рабочему каталогу.

Возвращаемое значение
В случае успешного выполнения эти функции возвращают значение 0.
Возвращаемое значение -1 указывает на сбой. Если не удалось найти указанный
путь, errno задается значение ENOENT . В dirname противном NULL случае вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, параметр errno
устанавливается в значение EINVAL и функция возвращает –1.

Комментарии
Функция _chdir изменяет текущий рабочий каталог на каталог, указанный в
dirname . Параметр dirname должен ссылаться на существующий каталог. Эта

функция может изменить текущий рабочий каталог на любом диске. Если в


параметре dirname указана новая буква диска, буква диска по умолчанию также
изменяется. Например, предположим A , что это буква диска по умолчанию и \BIN
является текущим рабочим каталогом. Следующий вызов изменяет текущий
рабочий каталог для диска C \temp и устанавливает C его в качестве нового диска
по умолчанию:

_chdir("c:\\temp");

Если в путях используется необязательная обратная косая черта ( \ ), в строковом


литерале С необходимо задавать две обратные косые черты ( \\ ) для
представления одной обратной косой черты ( \ ).

_wchdir — это версия _chdir с расширенными символами; аргумент dirname для

_wchdir — строка расширенных символов. Поведение _wchdir и _chdir идентично


в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставление подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tchdir _chdir _chdir _wchdir

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_chdir <direct.h> <errno.h>

_wchdir <direct.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_chdir.c

// arguments: C:\WINDOWS

/* This program uses the _chdir function to verify

that a given directory exists. */

#include <direct.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

int main( int argc, char *argv[] )

if(_chdir( argv[1] ) )

switch (errno)

case ENOENT:

printf( "Unable to locate the directory: %s\n", argv[1] );

break;

case EINVAL:

printf( "Invalid buffer.\n");

break;

default:

printf( "Unknown error.\n");

else

system( "dir *.exe");

Output

Volume in drive C has no label.

Volume Serial Number is 2018-08A1

Directory of c:\windows

08/29/2002 04:00 AM 1,004,032 explorer.exe

12/17/2002 04:43 PM 10,752 hh.exe

03/03/2003 09:24 AM 33,792 ieuninst.exe

10/29/1998 04:45 PM 306,688 IsUninst.exe

08/29/2002 04:00 AM 66,048 NOTEPAD.EXE

03/03/2003 09:24 AM 33,792 Q330994.exe

08/29/2002 04:00 AM 134,144 regedit.exe

02/28/2003 06:26 PM 46,352 setdebug.exe

08/29/2002 04:00 AM 15,360 TASKMAN.EXE

08/29/2002 04:00 AM 49,680 twunk_16.exe

08/29/2002 04:00 AM 25,600 twunk_32.exe

08/29/2002 04:00 AM 256,192 winhelp.exe

08/29/2002 04:00 AM 266,752 winhlp32.exe

13 File(s) 2,249,184 bytes

0 Dir(s) 67,326,029,824 bytes free

См. также раздел


Управление каталогами

_mkdir, _wmkdir

_rmdir, _wrmdir

system, _wsystem
_chdrive
Статья • 03.04.2023

Изменяет текущий рабочий диск.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _chdrive(

int drive

);

Параметры
drive

Целое число от 1 до 26, указывающее текущий рабочий диск (1 = A, 2 = B и т. д.).

Возвращаемое значение
Ноль (0), если текущий рабочий диск был успешно изменен; в противном случае
возвращается −1.

Комментарии
Если drive значение не находится в диапазоне от 1 до 26, обработчик
недопустимых параметров вызывается, как описано в разделе "Проверка
параметров". Если выполнение разрешено продолжить, _chdrive функция
возвращает значение -1, errno имеет значение EACCES , и _doserrno имеет значение
ERROR_INVALID_DRIVE .
Функция _chdrive не является потокобезопасной, так как она зависит от
SetCurrentDirectory функции, которая сама по себе не является потокобезопасной.
Чтобы безопасно использовать _chdrive в многопотоковом приложении,
необходимо обеспечить собственную синхронизацию потоков. Для получения
дополнительной информации см. SetCurrentDirectory.

Функция _chdrive изменяет только текущий рабочий диск; _chdir изменяет


текущий рабочий каталог.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_chdrive <direct.h>

Дополнительные сведения см. в разделе Совместимость.

Пример
См. пример для _getdrive.

См. также раздел


Управление каталогами

_chdir, _wchdir

_fullpath, _wfullpath

_getcwd, _wgetcwd

_getdrive

_mkdir, _wmkdir

_rmdir, _wrmdir

system, _wsystem
_chgsign , _chgsignf , _chgsignl
Статья • 03.04.2023

Меняет знак аргумента с плавающей запятой.

Синтаксис
C

double _chgsign(

double x

);

float _chgsignf(

float x

);

long double _chgsignl(

long double x

);

Параметры
x

Значение с плавающей запятой, которое необходимо изменить.

Возвращаемое значение
Функции _chgsign возвращают значение, равное аргументу с плавающей запятой
x , но с противоположным знаком. Ошибка не возвращается.

Требования
Подпрограмма Обязательный заголовок

_chgsign <float.h>

_chgsignf , _chgsignl <math.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
fabs, fabsf, fabsl

copysign, copysignf, copysignl, _copysign, _copysignf, _copysignl


chmod
Статья • 03.04.2023

Имя chmod функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _chmod для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _chmod . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_chmod , _wchmod
Статья • 03.04.2023

Изменяет параметры разрешений файла.

Синтаксис
C

int _chmod( const char *filename, int pmode );


int _wchmod( const wchar_t *filename, int pmode );

Параметры
filename

Имя существующего файла.

pmode

Настройка разрешений для файла.

Возвращаемое значение
Эти функции возвращают 0, если параметр разрешений успешно изменен.
Возвращаемое значение -1 указывает на сбой. Если не удалось найти указанный
файл, errno задано значение ENOENT ; если параметр недопустим, errno задано
значение EINVAL .

Комментарии
Функция _chmod изменяет параметр разрешений для файла, указанный с помощью
функции filename . Параметр разрешений управляет чтением и записью в файл.
Целочисленное выражение pmode содержит одну или обе из следующих констант
манифеста, определенных в файле SYS\Stat.h.

pmode Значение

_S_IREAD Разрешено только чтение.

_S_IWRITE Разрешена запись. (Если действует, разрешает чтение и запись.)


pmode Значение

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

При указании обеих констант они объединяются с побитовой или оператором ( | ).


Если разрешение на запись не задано, файл доступен только для чтения. Обратите
внимание, что все файлы всегда доступны для чтения; невозможно предоставить
разрешение только на запись. Таким образом, режимы _S_IWRITE и _S_IREAD |
_S_IWRITE эквивалентны.

_wchmod — это версия _chmod с расширенными символами; аргумент filename для

_wchmod — строка расширенных символов. Поведение _wchmod и _chmod идентично


в противном случае.

Эта функция проверяет свои параметры. Если pmode не является сочетанием одной
из констант манифеста или включает альтернативный набор констант, функция
просто игнорирует их. В filename противном NULL случае вызывается обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, параметр errno устанавливается в значение
EINVAL и функция возвращает –1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе "Глобальное состояние" в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tchmod _chmod _chmod _wchmod

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_chmod <io.h> <sys/types.h>, <sys/stat.h>, <errno.h>

_wchmod <io.h> или <wchar.h> <sys/types.h>, <sys/stat.h>, <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_chmod.c

// This program uses _chmod to

// change the mode of a file to read-only.

// It then attempts to modify the file.

//

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

// Change the mode and report error or success

void set_mode_and_report(char * filename, int mask)

// Check for failure

if( _chmod( filename, mask ) == -1 )

// Determine cause of failure and report.

switch (errno)

case EINVAL:

fprintf( stderr, "Invalid parameter to chmod.\n");

break;

case ENOENT:

fprintf( stderr, "File %s not found\n", filename );

break;

default:

// Should never be reached

fprintf( stderr, "Unexpected error in chmod.\n" );

else

if (mask == _S_IREAD)

printf( "Mode set to read-only\n" );

else if (mask & _S_IWRITE)

printf( "Mode set to read/write\n" );

fflush(stderr);

int main( void )

// Create or append to a file.

system( "echo /* End of file */ >> crt_chmod.c_input" );

// Set file mode to read-only:

set_mode_and_report("crt_chmod.c_input ", _S_IREAD );

system( "echo /* End of file */ >> crt_chmod.c_input " );

// Change back to read/write:

set_mode_and_report("crt_chmod.c_input ", _S_IWRITE );

system( "echo /* End of file */ >> crt_chmod.c_input " );

Output

A line of text.

Output

A line of text.Mode set to read-only

Access is denied.

Mode set to read/write

См. также раздел


Обработка файлов

_access, _waccess

_creat, _wcreat

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

_open, _wopen

_stat, _wstat функции


chsize
Статья • 03.04.2023

Имя chsize функции, зависят от Майкрософт, является устаревшим псевдонимом


_chsize для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _chsize или функцию с повышенным


_chsize_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".
_chsize
Статья • 03.04.2023

Изменяет размер файла. Доступна более безопасная версия; см _chsize_s.

Синтаксис
C

int _chsize(

int fd,

long size

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

size

Новая длина файла в байтах.

Возвращаемое значение
_chsize возвращает значение 0, если размер файла успешно изменен.
Возвращаемое значение -1 указывает на ошибку: errno задано значение EACCES ,
если указанный файл доступен только для чтения или указанный файл
заблокирован для доступа, если EBADF дескриптор недопустим, ENOSPC если на
устройстве не осталось места или EINVAL size меньше нуля.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrnoи


_sys_nerr_sys_errlist.

Комментарии
Функция _chsize расширяет или усекает файл, связанный с fd , до длины,
указанной size . Файл должен быть открыт в режиме, позволяющем выполнять
запись. Если файл доступен для расширения, к нему добавляются нули ('\0'). Если
файл усекается, все данные в конце сокращенного файла усекаются до длины
исходного файла.

Эта функция проверяет свои параметры. Если size значение меньше нуля или fd
является недопустимым дескриптором файла, вызывается обработчик
недопустимых параметров, как описано в разделе "Проверка параметров".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_chsize <io.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_chsize.c

// This program uses _filelength to report the size

// of a file before and after modifying it with _chsize.

#include <io.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

#include <share.h>

int main( void )

int fh, result;

unsigned int nbytes = BUFSIZ;

// Open a file

if( _sopen_s( &fh, "data", _O_RDWR | _O_CREAT, _SH_DENYNO,

_S_IREAD | _S_IWRITE ) == 0 )

printf( "File length before: %ld\n", _filelength( fh ) );

if( ( result = _chsize( fh, 329678 ) ) == 0 )

printf( "Size successfully changed\n" );

else

printf( "Problem in changing the size\n" );

printf( "File length after: %ld\n", _filelength( fh ) );

_close( fh );

Output

File length before: 0

Size successfully changed

File length after: 329678

См. также раздел


Обработка файлов

_close

_sopen, _wsopen

_open, _wopen
_chsize_s
Статья • 03.04.2023

Изменяет размер файла. Эта функция представляет собой версию _chsize с


усовершенствованиями безопасности, как описано в разделе "Функции
безопасности" в CRT.

Синтаксис
C

errno_t _chsize_s(

int fd,

__int64 size

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

size

Новая длина файла в байтах.

Возвращаемое значение
_chsize_s возвращает значение 0, если размер файла успешно изменен. Ненулевое

возвращаемое значение указывает на ошибку: возвращается значение EACCES , если


доступ к указанному файлу заблокирован, EBADF , если указанный файл доступен
только для чтения или используется недопустимый дескриптор, ENOSPC , если места
на устройстве недостаточно, или EINVAL , если размер файла меньше нуля. errno
принимает такое же значение.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция _chsize_s расширяет или усекает файл, связанный с fd , до длины,
указанной size . Файл должен быть открыт в режиме, позволяющем выполнять
запись. Если файл доступен для расширения, к нему добавляются нули ('\0'). Если
файл усекается, все данные в конце сокращенного файла усекаются до длины
исходного файла.

_chsize_s принимает размер файла, выраженный 64-разрядным целым числом, и,

таким образом, позволяет обрабатывать размеры файлов больше 4 ГБ. _chsize


ограничивается 32-разрядными размерами файлов.

Эта функция проверяет свои параметры. Если fd недопустимый дескриптор файла


или размер меньше нуля, вызывается обработчик недопустимых параметров, как
описано в разделе "Проверка параметров".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_chsize_s <io.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Обработка файлов

_chsize

_close

_creat, _wcreat

_open, _wopen
cimag , cimagf , cimagl
Статья • 03.04.2023

Извлекает мнимую часть комплексного числа.

Синтаксис
C

double cimag( _Dcomplex z );

float cimagf( _Fcomplex z );

long double cimagl( _Lcomplex z );

#define cimag(X) // Requires C11 or higher

float cimag( _Fcomplex z ); // C++ only

long double cimag( _Lcomplex z ); // C++ only

Параметры
z

Комплексное число.

Возвращаемое значение
Мнимая часть z .

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки cimag , которые
принимают значения _Fcomplex или _Lcomplex и возвращают значения float или
long double . В программе C, если вы не используете <макрос tgmath.h> для вызова
этой функции, cimag всегда принимает _Dcomplex значение и возвращает double
значение.

При использовании <макроса tgmath.h> cimag() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

Требования
Подпрограмма Заголовок C Заголовок C++

cimag , cimagf , cimagl <complex.h> <ccomplex>

cimag Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

norm, normf, norml

creal, crealf, creall

cproj, cprojf, cprojl

conj, conjf, conjl

carg, cargf, cargl

cabs, cabsf, cabsl


_clear87 , _clearfp
Статья • 03.04.2023

Получает и очищает слово состояния модуля операций с плавающей запятой.

Синтаксис
C

unsigned int _clear87( void );

unsigned int _clearfp( void );

Возвращаемое значение
Биты в возвращаемом значении указывают состояние модуля операций с
плавающей запятой до вызова функций _clear87 и _clearfp . Полные определения
битов, возвращаемых функцией _clear87 , см. в файле Float.h. Многие
математические библиотечные функции изменяют слово состояния 8087/80287 с
непредсказуемыми результатами. Чем меньше операций с плавающей запятой
выполняется между известными значениями слова состояния модуля операций с
плавающей запятой, тем надежнее возвращаемые из функций _clear87 и
_status87 значения.

Комментарии
Функция _clear87 очищает флаги исключения в слове состояния операций с
плавающей запятой, устанавливает бит занятости в 0 и возвращает слово
состояния. Слово состояния — это сочетание слова состояния 8087/80287 и других
условий, обнаруженных обработчиком исключений 8087/80287, таких как
переполнение стека или потеря точности.

_clearfp  — независимая от платформы, переносимая версия функции _clear87 . Он


идентичен _clear87 платформам Intel (x86), а также поддерживается платформами
x64 и ARM. Чтобы код, выполняющий операции с плавающей запятой, был
переносимым на архитектуры x64 и ARM, используйте функцию _clearfp . Если вы
ориентированы только на платформы x86, можно использовать либо
_clear87 _clearfp .
Эти функции не рекомендуется использовать при компиляции с помощью /clr
(компиляция clr), так как среда CLR поддерживает только точность с плавающей
запятой по умолчанию.

Требования
Подпрограмма Обязательный заголовок

_clear87 <float.h>

_clearfp <float.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_clear87.c

// compile with: /Od

// This program creates various floating-point

// problems, then uses _clear87 to report on these problems.

// Compile this program with Optimizations disabled (/Od).

// Otherwise the optimizer will remove the code associated with

// the unused floating-point values.

//

#include <stdio.h>

#include <float.h>

int main( void )

double a = 1e-40, b;
float x, y;

printf( "Status: %.4x - clear\n", _clear87() );

// Store into y is inexact and underflows:

y = a;

printf( "Status: %.4x - inexact, underflow\n", _clear87() );

// y is denormal:

b = y;

printf( "Status: %.4x - denormal\n", _clear87() );

Output

Status: 0000 - clear

Status: 0003 - inexact, underflow


Status: 80000 - denormal

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_control87, _controlfp, __control87_2

_status87, _statusfp, _statusfp2


clearerr
Статья • 03.04.2023

Сбрасывает индикатор ошибки для потока. Доступна более безопасная версия этой
функции; см clearerr_s.

Синтаксис
C

void clearerr(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Комментарии
Функция clearerr сбрасывает индикатор ошибки и индикатор конечного файла
для stream . Индикаторы ошибок не очищаются автоматически; После установки
индикатора ошибки для указанного потока операции с этим потоком продолжают
возвращать значение ошибки до тех пор, fsetpos пока clearerr fseekне вызывается
или rewind не вызывается.

В stream противном NULL случае вызывается обработчик недопустимых


параметров, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, эта функция задает для errno значение EINVAL и
возвращает его. Дополнительные сведения о errno кодах ошибок см errno . в
константах.

Доступна более безопасная версия этой функции; см clearerr_s.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

clearerr <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_clearerr.c

// This program creates an error

// on the standard input stream, then clears

// it so that future reads won't fail.

#include <stdio.h>

int main( void )

int c;

// Create an error by writing to standard input.

putc( 'c', stdin );

if( ferror( stdin ) )

perror( "Write error" );

clearerr( stdin );

// See if read causes an error.

printf( "Will input cause an error? " );

c = getc( stdin );

if( ferror( stdin ) )

perror( "Read error" );

clearerr( stdin );

else

printf( "No read error\n" );

Входные данные
Input

Вывод
Output

Write error: No error

Will input cause an error? n

No read error

См. также
Обработка ошибок

Потоковый ввод-вывод

_eof

feof

ferror

perror, _wperror
clearerr_s
Статья • 03.04.2023

Сбрасывает индикатор ошибки для потока. Эта функция представляет собой


версию clearerr с усовершенствованиями безопасности, как описано в разделе
"Функции безопасности" в CRT.

Синтаксис
C

errno_t clearerr_s(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE

Возвращаемое значение
Ноль в случае успешного выполнения; EINVAL If stream is NULL .

Комментарии
Функция clearerr_s сбрасывает индикатор ошибки и индикатор конечного файла
для stream . Индикаторы ошибок не очищаются автоматически; После установки
индикатора ошибки для указанного потока операции с этим потоком продолжают
возвращать значение ошибки до тех пор, пока clearerr_s , clearerr , fseekили
rewind fsetpos не вызывается.

В противном stream случае NULL вызывается обработчик недопустимых


параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, эта функция задает для errno значение EINVAL и
возвращает EINVAL .
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

clearerr_s <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_clearerr_s.c

// This program creates an error

// on the standard input stream, then clears

// it so that future reads won't fail.

#include <stdio.h>

int main( void )

int c;

errno_t err;

// Create an error by writing to standard input.

putc( 'c', stdin );

if( ferror( stdin ) )

perror( "Write error" );

err = clearerr_s( stdin );

if (err != 0)

abort();

// See if read causes an error.

printf( "Will input cause an error? " );

c = getc( stdin );

if( ferror( stdin ) )

perror( "Read error" );

err = clearerr_s( stdin );

if (err != 0)

abort();

Входные данные
Input

Вывод
Output

Write error: Bad file descriptor

Will input cause an error? n

См. также
Обработка ошибок

Потоковый ввод-вывод

clearerr

_eof

feof

ferror

perror, _wperror
clock
Статья • 03.04.2023

Вычисляет реальное прошедшее время для процесса.

Синтаксис
C

clock_t clock( void );

Возвращаемое значение
Время, прошедшее с момента инициализации CRT в начале процесса,
составляющее CLOCKS_PER_SEC единиц в секунду. Если прошедшее время
недоступно или превышает максимальное положительное время, которое может
быть записано как тип clock_t , функция возвращает значение (clock_t)(-1) .

Комментарии
Функция clock сообщает реальное время, прошедшее с момента инициализации
CRT при запуске процесса. Эта функция не соответствует стандарту ISO C, который
указывает чистое время ЦП в качестве возвращаемого значения. Чтобы получить
время ЦП, используйте функцию Win32 GetProcessTimes . Чтобы определить
прошедшее время в секундах, разделите значение, возвращаемое функцией clock ,
на макрос CLOCKS_PER_SEC .

Если времени достаточно, значение, возвращаемое функцией clock , может


превышать максимальное положительное значение clock_t . Если процесс
выполняется дольше, значение, возвращаемое функций clock , всегда равно
(clock_t)(-1) в соответствии со стандартами ISO C99 (7.23.2.1) и ISO C11 (7.27.2.1).
Корпорация Майкрософт реализует clock_t как long , 32-разрядное целое число со
знаком, а макрос CLOCKS_PER_SEC определяется как 1000. Этот макрос предоставляет
максимальное возвращаемое clock значение функции 2147483,647 секунд или
около 24,8 дня. Не используйте значение, возвращаемое clock в процессах,
которые выполняются дольше, чем это время. Вы можете использовать 64-
разрядную time функцию или функцию Windows QueryPerformanceCounter для
записи процесса, прошедшего много лет.

Требования
Подпрограмма Обязательный заголовок

clock <time.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_clock.c

// This sample uses clock() to 'sleep' for three

// seconds, then determines how long it takes

// to execute an empty loop 600000000 times.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

// Pauses for a specified number of clock cycles.

void do_sleep( clock_t wait )

clock_t goal;

goal = wait + clock();

while( goal > clock() )

const long num_loops = 600000000L;

int main( void )

long i = num_loops;

clock_t start, finish;

double duration;

// Delay for a specified time.

printf( "Delay for three seconds\n" );

do_sleep( (clock_t)3 * CLOCKS_PER_SEC );

printf( "Done!\n" );

// Measure the duration of an event.

start = clock();

while( i-- )

finish = clock();

duration = (double)(finish - start) / CLOCKS_PER_SEC;

printf( "Time to do %ld empty loops is ", num_loops );

printf( "%2.3f seconds\n", duration );

Output

Delay for three seconds

Done!

Time to do 600000000 empty loops is 1.354 seconds

См. также раздел


Управление временем

difftime, _difftime32, _difftime64

time, _time32, _time64


clog , clogf , clogl
Статья • 03.04.2023

Извлекает натуральный логарифм комплексного числа, ветви которого


заканчиваются в отрицательной части реальной оси.

Синтаксис
C

_Dcomplex clog(

_Dcomplex z

);

_Fcomplex clog(

_Fcomplex z

); // C++ only

_Lcomplex clog(

_Lcomplex z

); // C++ only

_Fcomplex clogf(

_Fcomplex z

);

_Lcomplex clogl(

_Lcomplex z

);

Параметры
z

Основание логарифма.

Возвращаемое значение
Натуральный логарифм числа z . Результат несвязан по реальной оси и в интервале
[-iπ, +iπ] вдоль мнимой оси.

Возможны следующие возвращаемые значения:

Параметр z Возвращаемое значение

Положительное число Логарифм (основание 10) z

Ноль -INF
Параметр z Возвращаемое значение

Отрицательное число Не число

Не число Не число

+ INF + INF

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки clog , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C clog всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

clog , clogf , clogl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

cexp, cexpf, cexpl

cpow, cpowf, cpowl

clog10, clog10f, clog10l


clog10 , clog10f , clog10l
Статья • 03.04.2023

Извлекает логарифм (основание 10) комплексного числа.

Синтаксис
C

_Dcomplex clog10( _Dcomplex z );

_Fcomplex clog10f( _Fcomplex z );

_Lcomplex clog10l( _Lcomplex z );

C++

_Fcomplex clog10( _Fcomplex z ); // C++ only

_Lcomplex clog10( _Lcomplex z ); // C++ only

Параметры
z

Основание логарифма.

Возвращаемое значение
Возможны следующие возвращаемые значения:

Параметр z Возвращаемое значение

Положительное число Логарифм (основание 10) z

Ноль -INF

Отрицательное число Не число

Не число Не число

+ INF + INF

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки clog10 ,
которые принимают и возвращают значения _Fcomplex и _Lcomplex . В программе
на языке C clog10 всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

clog10 , clog10f , clog10l <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

cexp, cexpf, cexpl

cpow, cpowf, cpowl

clog, clogf, clogl


_close
Статья • 03.04.2023

Закрывает файл.

Синтаксис
C

int _close(

int fd

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

Возвращаемое значение
Функция _close возвращает 0, если файл был успешно закрыт. Возвращаемое
значение -1 указывает на ошибку.

Комментарии
Функция _close закрывает файл, связанный с fd .

Дескриптор файла и соответствующий обработчик файлов операционной системы


закрываются. Таким образом, не нужно вызывать CloseHandle , если файл был
первоначально открыт с помощью функции CreateFile Win32 и преобразован в
дескриптор файла с помощью _open_osfhandle .

Эта функция проверяет свои параметры. Если fd это недопустимый дескриптор


файла, вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если продолжение выполнения разрешено, функции
возвращают значение −1 и задают для errno значение EBADF .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_close <io.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _open.

См. также раздел


Низкоуровневый ввод-вывод

_chsize

_creat, _wcreat

_dup, _dup2

_open, _wopen

_unlink, _wunlink
close
Статья • 03.04.2023

Имя close функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _close для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _close . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_Cmulcc , _FCmulcc , _LCmulcc
Статья • 03.04.2023

Умножает два сложных числа.

Синтаксис
C

_Dcomplex _Cmulcc( _Dcomplex x, _Dcomplex y );

_Fcomplex _FCmulcc( _Fcomplex x, _Fcomplex y );

_Lcomplex _LCmulcc( _Lcomplex x, _Lcomplex y );

Параметры
x

Один из сложных операндов для умножения.

Другой сложный операнд для умножения.

Возвращаемое значение
, _Dcomplex или _Lcomplex структура, представляющая сложный продукт сложных
чисел x и y . _Fcomplex

Комментарии
Так как встроенные арифметические операторы не работают над реализацией
сложных типов, _Cmulcc _FCmulcc функций и _LCmulcc функций Майкрософт
упрощают умножение сложных типов.

Требования
Подпрограмма Заголовок C Заголовок C++

_Cmulcc , _FCmulcc , _LCmulcc <complex.h> <complex.h>


Эти функции зависят от Корпорации Майкрософт. Типы _Dcomplex , _Fcomplex и
_Lcomplex являются эквивалентами, зависящими от Майкрософт, для неимносимых
собственных типов C99 double _Complex, float _Complex и длинных двойных
_Complex соответственно. Дополнительные сведения о совместимости см. в
разделе Compatibility.

См. также раздел


Алфавитный указатель функций

_Cbuild, _FCbuild, _LCbuild


_Cmulcr, _FCmulcr, _LCmulcr

norm, normf, norml

cproj, cprojf, cprojl

conj, conjf, conjl

creal, crealf, creall

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


_Cmulcr , _FCmulcr , _LCmulcr
Статья • 03.04.2023

Умножает комплексное число на число с плавающей запятой.

Синтаксис
C

_Dcomplex _Cmulcr( _Dcomplex x, double y );

_Fcomplex _FCmulcr( _Fcomplex x, float y );

_Lcomplex _LCmulcr( _Lcomplex x, long double y );

Параметры
x

Один из сложных операндов для умножения.

Операнд с плавающей запятой для умножения.

Возвращаемое значение
Структура _Dcomplex , _Fcomplex или _Lcomplex , представляющая комплексное
произведение комплексного числа x и числа y с плавающей запятой.

Комментарии
Так как встроенные арифметические операторы не работают с реализацией
сложных типов Майкрософт, _Cmulcr функции , _FCmulcr и _LCmulcr упрощают
умножение сложных типов на типы с плавающей запятой.

Требования
Подпрограмма Заголовок C Заголовок C++

_Cmulcr , _FCmulcr , _LCmulcr <complex.h> <complex.h>


Эти функции относятся к корпорации Майкрософт. Типы _Dcomplex , _Fcomplex и
_Lcomplex являются зависящими от Майкрософт эквивалентами нереализованных
собственных типов double _Complex C99 , float _Complex и long double
_Complex соответственно. Дополнительные сведения о совместимости см. в разделе
Compatibility.

См. также раздел


Алфавитный указатель функций

_Cbuild, _FCbuild, _LCbuild


_Cmulcc, _FCmulcc, _LCmulcc

norm, normf, norml

cproj, cprojf, cprojl

conj, conjf, conjl

creal, crealf, creall

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


_commit
Статья • 03.04.2023

Записывает содержимое файла непосредственно на диск.

Синтаксис
C

int _commit(

int fd

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

Возвращаемое значение
Функция _commit возвращает 0, если файл был успешно записан на диск.
Возвращаемое значение -1 указывает на ошибку.

Комментарии
Функция _commit вынуждает операционную систему записать файл, связанный с
fd , на диск. Этот вызов гарантирует, что указанный файл будет записан

незамедлительно, а не по решению операционной системы.

Если fd является недопустимым дескриптором файла, вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, функции возвращают значение −1 и задают
для errno значение EBADF .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.
Требования
Подпрограмма Обязательный заголовок Необязательные заголовки

_commit <io.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Низкоуровневый ввод-вывод

_creat, _wcreat

_open, _wopen

_read

_write
compl
Статья • 03.04.2023

Альтернатива оператору ~.

Синтаксис
C

#define compl ~

Remarks
Макрос создает оператор ~.

Пример
C++

// iso646_compl.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 1, result;

result = ~a;

cout << result << endl;

result= compl(a);

cout << result << endl;

Output

-2

-2

Требования
Заголовка:< iso646.h>
_configthreadlocale
Статья • 03.04.2023

Настраивает параметры языкового стандарта для каждого потока.

Синтаксис
C

int _configthreadlocale( int per_thread_locale_type );

Параметры
per_thread_locale_type

Задаваемый параметр. Один из параметров, перечисленных в следующей таблице.

Возвращаемое значение
Предыдущее состояние языкового стандарта отдельного потока
( _DISABLE_PER_THREAD_LOCALE или _ENABLE_PER_THREAD_LOCALE ) или –1 при сбое.

Комментарии
Функция _configthreadlocale используется для управления использованием
языковых стандартов, относящихся к конкретным потокам. Используйте один из
этих per_thread_locale_type параметров, чтобы указать или определить состояние
языкового стандарта для каждого потока:

Параметр Описание

_ENABLE_PER_THREAD_LOCALE В текущем потоке будет использоваться заданный конкретно


для него языковой стандарт. Последующие вызовы setlocale в
этом потоке влияют только на собственный языковой стандарт
потока.

_DISABLE_PER_THREAD_LOCALE В текущем потоке будет использоваться глобальный языковой


стандарт. Последующие вызовы setlocale в этом потоке
влияют на другие потоки, использующие глобальный языковой
стандарт.
Параметр Описание

0 Извлекает текущую настройку для данного потока.

Эти функции влияют на поведение setlocale , _tsetlocale и _wsetlocale _setmbcp .


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

использующих глобальный языковой стандарт. Когда раздельное задание языковых


стандартов отдельным потокам включено, setlocale или _wsetlocale влияют
только на языковой стандарт текущего потока.

Если вы используете для _configthreadlocale включения языкового стандарта для


каждого потока, задайте предпочтительный языковой стандарт в этом потоке сразу
же после вызова setlocale или _wsetlocale .

Если per_thread_locale_type это не одно из значений, перечисленных в таблице, эта


функция вызывает обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если продолжение выполнения разрешено, эта функции
задает для errno значение EINVAL и возвращает -1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_configthreadlocale '<locale.h>'

Пример
C++

// crt_configthreadlocale.cpp

//

// This program demonstrates the use of _configthreadlocale when

// using two independent threads.


//

// Compile by using: cl /EHsc /W4 crt_configthreadlocale.cpp

#include <locale.h>

#include <mbctype.h>

#include <process.h>

#include <windows.h>

#include <stdio.h>

#include <time.h>

#define BUFF_SIZE 100

// Retrieve the date and time in the current

// locale's format.

int get_time(unsigned char* str)

__time64_t ltime;

struct tm thetime;

// Retieve the time

_time64(&ltime);

_gmtime64_s(&thetime, &ltime);

// Format the current time structure into a string

// using %#x is the long date representation,

// appropriate to the current locale

if (!strftime((char *)str, BUFF_SIZE, "%#x",

(const struct tm*)&thetime))

printf("strftime failed!\n");

return -1;

return 0;

// This thread sets its locale to German

// and prints the time.

unsigned __stdcall SecondThreadFunc( void* /*pArguments*/ )

unsigned char str[BUFF_SIZE];

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);

// Set the thread code page

_setmbcp(_MB_CP_ANSI);

// Set the thread locale

printf("The thread locale is now set to %s.\n",

setlocale(LC_ALL, "German"));

// Retrieve the time string from the helper function

if (get_time(str) == 0)

printf("The time in German locale is: '%s'\n", str);

_endthreadex( 0 );

return 0;

// The main thread spawns a second thread (above) and then

// sets the locale to English and prints the time.

int main()

HANDLE hThread;

unsigned threadID;

unsigned char str[BUFF_SIZE];

// Enable per-thread locale causes all subsequent locale

// setting changes in this thread to only affect this thread.

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);

// Retrieve the time string from the helper function

printf("The thread locale is now set to %s.\n",

setlocale(LC_ALL, "English"));

// Create the second thread.

hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc,

NULL, 0, &threadID );

if (get_time(str) == 0)

// Retrieve the time string from the helper function

printf("The time in English locale is: '%s'\n\n", str);

// Wait for the created thread to finish.

WaitForSingleObject( hThread, INFINITE );

// Destroy the thread object.


CloseHandle( hThread );

Output

The thread locale is now set to English_United States.1252.

The time in English locale is: 'Wednesday, May 12, 2004'

The thread locale is now set to German_Germany.1252.

The time in German locale is: 'Mittwoch, 12. Mai 2004'

См. также раздел


setlocale, _wsetlocale

_beginthread, _beginthreadex

Локаль

Многопоточность и языковые стандарты


conj , conjf , conjl
Статья • 03.04.2023

Извлекает комплексно-сопряженную величину комплексного числа.

Синтаксис
C

_Dcomplex conj(

_Dcomplex z

);

_Fcomplex conj(

_Fcomplex z

); // C++ only

_Lcomplex conj(

_Lcomplex z

); // C++ only

_Fcomplex conjf(

_Fcomplex z

);

_Lcomplex conjl(

_Lcomplex z

);

#define conj(X) // Requires C11 or higher

Параметры
z

Комплексное число.

Возвращаемое значение
Сложный сопряжение z . Результат имеет такую же действительную и мнимую
части, как у z , но с противоположным знаком.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки conj , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе C, если
вы не используете <макрос tgmath.h> для вызова этой функции, conj всегда
принимает и возвращает _Dcomplex значение.

При использовании <макроса tgmath.h> conj() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

Требования
Подпрограмма Заголовок C Заголовок C++

conj , conjf , conjl <complex.h> <ccomplex>

conj Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

norm, normf, norml

creal, crealf, creall

cproj, cprojf, cprojl

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


_control87 , _controlfp , __control87_2
Статья • 03.04.2023

Возвращает и задает управляющее слово блока операций с плавающей запятой.


Доступна более безопасная версия _controlfp ; см. раздел _controlfp_s.

Синтаксис
C

unsigned int _control87(

unsigned int new,

unsigned int mask

);

unsigned int _controlfp(

unsigned int new,

unsigned int mask

);

int __control87_2(

unsigned int new,

unsigned int mask,

unsigned int* x86_cw,

unsigned int* sse2_cw

);

Параметры
new

Значения битов в новом управляющем слове.

mask

Маска для установки битов нового управляющего слова.

x86_cw

Заполняется управляющим словом для блока операций с плавающей запятой x87.


Передайте 0 ( NULL ), чтобы задать только управляющее слово SSE2.

sse2_cw

Управляющее слово для блока операций с плавающей запятой SSE. Передайте 0


( NULL ), чтобы задать только управляющее слово x87.

Возвращаемое значение
Для _control87 и _controlfp биты возвращаемого значения показывают состояние
управления блоком операций с плавающей запятой. Полное определение битов,
возвращаемых _control87 , см. в разделе FLOAT.H .

Для __control87_2 возвращаемое значение равно 1, что означает успешное


завершение.

Комментарии
Функция _control87 получает и задает управляющее слово блока операций с
плавающей запятой. Слово управления с плавающей запятой позволяет программе
изменять режимы точности, округления и бесконечности в зависимости от
платформы. Можно также использовать функцию _control87 для маскирования и
демаскирования исключений, связанных с операциями с плавающей запятой. Если
значение для mask равно 0, функция _control87 получает управляющее слово
блока операций с плавающей запятой. Если значение mask отлично от нуля,
задается новое значение управляющего слова: для любого включенного бита (то
есть, равного 1) в параметре mask соответствующий бит в параметре new
используется для обновления управляющего слова. Другими словами, fpcntrl =
((fpcntrl & ~mask) | (new & mask)) где fpcntrl находится контрольное слово с

плавающей запятой.

7 Примечание

По умолчанию библиотеки времени выполнения маскируют все исключения


для операций с плавающей запятой .

_controlfp является независимой от платформы переносимой версией _control87 ,

которая почти идентична _control87 функции. Если код предназначен для


нескольких платформ, используйте _controlfp или _controlfp_s . Разница между
функциями _control87 и _controlfp состоит в способе обработки значения
DENORMAL . Для платформ _control87 x86, x64, ARM и ARM64 можно задать и
очистить маску DENORMAL OPERAND исключения. _controlfp не изменяет маску
DENORMAL OPERAND исключения. В следующем примере показано это различие.

_control87( _EM_INVALID, _MCW_EM );

// DENORMAL is unmasked by this call

_controlfp( _EM_INVALID, _MCW_EM );

// DENORMAL exception mask remains unchanged

Возможные значения для константы маски ( mask ) и новых значений элементов


управления ( new ) отображаются в таблице "Маски и значения элементов
управления". В аргументах этих функций вместо явных шестнадцатеричных
значений следует использовать перечисленные ниже переносимые константы
( _MCW_EM , _EM_INVALID и т. д.).

Платформы, производные от Intel x86, поддерживают DENORMAL входные и


выходные значения в оборудовании. Поведение x86 заключается в сохранении
DENORMAL значений. Платформы ARM и ARM64 и платформы x64 с поддержкой SSE2

позволяют DENORMAL сбрасывать операнды и результаты или принудительно нулю.


Функции _controlfp и _control87 предоставляют маску для изменения такого
поведения. В следующем примере показано использование этой маски.

_controlfp(_DN_SAVE, _MCW_DN);

// Denormal values preserved on ARM platforms and on x64 processors with

// SSE2 support. NOP on x86 platforms.

_controlfp(_DN_FLUSH, _MCW_DN);

// Denormal values flushed to zero by hardware on ARM platforms

// and x64 processors with SSE2 support. Ignored on other x86 platforms.

На платформах _control87 _controlfp ARM и ARM64 функции применяются к


регистру FPSCR. На платформы x64 влияет только управляющее слово SSE2,
хранящееся в регистре MXCSR. На платформах _control87 x86 и _controlfp
повлияйте на слова элемента управления для x87 и SSE2, если они присутствуют.

Функция __control87_2 позволяет управлять блоками операций с плавающей


запятой x87 и SSE2 как совместно, так и раздельно. Чтобы повлиять на оба блока,
передайте адреса двух целых x86_cw чисел и sse2_cw . Если вы хотите повлиять
только на одну единицу, передайте адрес для этого параметра, но передайте 0
( NULL ) для другого. Если для одного из этих параметров передано значение 0,
данная функция не влияет на этот блок операций с плавающей запятой. Это
полезно, если часть кода использует единицу с плавающей запятой x87, а другая
часть использует единицу с плавающей запятой SSE2.

Если вы используете для __control87_2 задания разных значений для слов элемента
управления с плавающей запятой, может _control87 _controlfp быть невозможно
вернуть одно контрольное слово для представления состояния обоих единиц с
плавающей запятой. В таком случае эти функции устанавливают EM_AMBIGUOUS флаг
в возвращаемом целочисленном значении, чтобы указать несоответствие между
двумя словами элемента управления. Флаг EM_AMBIGUOUS является
предупреждением о том, что возвращаемое контрольное слово не может точно
представлять состояние обоих слов управления с плавающей запятой.

На платформах ARM, ARM64 и x64 изменение режима бесконечности или точности


с плавающей запятой не поддерживается. Если маска управления точностью
используется на платформе x64, функция вызывает утверждение и вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров".

7 Примечание

__control87_2 не поддерживается на платформах ARM, ARM64 или x64. Если вы


используете __control87_2 и компилируете программу для платформ ARM,
ARM64 или x64, компилятор создает ошибку.

Эти функции игнорируются при использовании /clr (компиляция среды CLR) для
компиляции . Среда CLR поддерживает только точность с плавающей запятой по
умолчанию.

Управление масками слов и значениями


В случае маски _MCW_EM очистка маски задает исключение, которое допускает
аппаратное исключение; установка маски скрывает исключение. Если возникает
исключение _EM_UNDERFLOW или _EM_OVERFLOW , аппаратное исключение не создается,
пока не будет выполняться следующая операция с плавающей запятой. Чтобы
аппаратное исключение возникало сразу после _EM_UNDERFLOW или _EM_OVERFLOW ,
следует вызвать инструкцию MASM FWAIT .

Mask Шестнадцатеричное Константа Шестнадцатеричное


значение значение

_MCW_DN (управление 0x03000000 _DN_SAVE


0x00000000

денормализацией)
_DN_FLUSH 0x01000000
Mask Шестнадцатеричное Константа Шестнадцатеричное
значение значение

_MCW_EM (маска исключения 0x0008001F _EM_INVALID


0x00000010

прерывания)
_EM_DENORMAL
0x00080000

_EM_ZERODIVIDE
0x00000008

_EM_OVERFLOW
0x00000004

_EM_UNDERFLOW
0x00000002

_EM_INEXACT 0x00000001

_MCW_IC (управление 0x00040000 _IC_AFFINE


0x00040000

бесконечностью)

_IC_PROJECTIVE 0x00000000
(Не поддерживается на
платформах ARM или x64.)

_MCW_RC (управление 0x00000300 _RC_CHOP


0x00000300

округлением)
_RC_UP
0x00000200

_RC_DOWN
0x00000100

_RC_NEAR 0x00000000

_MCW_PC (управление 0x00030000 _PC_24 (24 0x00020000

точностью) бита)

0x00010000

(Не поддерживается на _PC_53 (53


платформах ARM или x64.) бита)
0x00000000

_PC_64 (64
бита)

Требования
Подпрограмма Обязательный заголовок

_control87 , _controlfp , _control87_2 <float.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_cntrl87.c

// processor: x86

// compile by using: cl /W4 /arch:IA32 crt_cntrl87.c

// This program uses __control87_2 to output the x87 control

// word, set the precision to 24 bits, and reset the status to

// the default.

#include <stdio.h>

#include <float.h>

#pragma fenv_access (on)

int main( void )

double a = 0.1;

unsigned int control_word_x87 = 0;

int result;

// Show original x87 control word and do calculation.

result = __control87_2(0, 0, &control_word_x87, 0 );

printf( "Original: 0x%.8x\n", control_word_x87 );

printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

// Set precision to 24 bits and recalculate.

result = __control87_2(_PC_24, MCW_PC, &control_word_x87, 0 );

printf( "24-bit: 0x%.8x\n", control_word_x87 );

printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

// Restore default precision-control bits and recalculate.

result = __control87_2( _CW_DEFAULT, MCW_PC, &control_word_x87, 0 );

printf( "Default: 0x%.8x\n", control_word_x87 );

printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

Output

Original: 0x0009001f

0.1 * 0.1 = 1.000000000000000e-02


24-bit: 0x000a001f

0.1 * 0.1 = 9.999999776482582e-03


Default: 0x0009001f

0.1 * 0.1 = 1.000000000000000e-02

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_clear87, _clearfp

_status87, _statusfp, _statusfp2

_controlfp_s
_controlfp_s
Статья • 03.04.2023

Возвращает и задает управляющее слово блока операций с плавающей запятой.


Эта версия _control87, _controlfp__control87_2 имеет улучшения безопасности, как
описано в функциях безопасности в CRT.

Синтаксис
C

errno_t _controlfp_s(

unsigned int *currentControl,

unsigned int newControl,

unsigned int mask

);

Параметры
currentControl

Значения битов в текущем управляющем слове.

newControl

Значения битов в новом управляющем слове.

mask

Маска для установки битов нового управляющего слова.

Возвращаемое значение
Нуль в случае успешного выполнения или код ошибки errno .

Комментарии
Функция _controlfp_s — это независимая от платформы и более безопасная
версия функции _control87 , которая получает управляющее слово с плавающей
запятой в адрес, хранящийся в currentControl , и задает его с помощью newControl .
Биты в значениях показывают состояние элемента управления блоком операций с
плавающей запятой. Состояние элемента управления блока операций с плавающей
запятой позволяет программе изменять режимы точности, округления и
бесконечности в пакете математических операций с числами с плавающей запятой
в зависимости от платформы. Можно также использовать функцию _controlfp_s
для маскирования и демаскирования исключений, связанных с операциями с
плавающей запятой.

Если значение для mask равно 0, функция _controlfp_s получает управляющее


слово блока операций с плавающей запятой и сохраняет извлеченное значение в
currentControl .

Если значение mask отлично от нуля, задается новое значение управляющего


слова: для любого включенного бита (то есть равного 1) в параметре mask
соответствующий бит в параметре new используется для обновления
управляющего слова. Другими словами, fpcntrl = ((fpcntrl & ~mask) | (newControl
& mask)) где fpcntrl находится контрольное слово с плавающей запятой. В этом

сценарии currentControl устанавливается значение после завершения изменения.


Это не старое битовое значение элемента управления.

7 Примечание

По умолчанию библиотеки времени выполнения маскируют все исключения


для операций с плавающей запятой .

_controlfp_s почти идентичен _control87 функции на платформах Intel (x86), x64 и


ARM. Если вы ориентированы на платформы x86, x64 или ARM, можно
использовать _control87 или _controlfp_s .

Разница между _control87 и _controlfp_s заключается в том, как они


обрабатывают денормальные значения. Для платформ _control87 Intel (x86), x64 и
ARM можно задать и очистить маску исключений DENORMAL OPERAND . _controlfp_s
не изменяет маску DENORMAL OPERAND исключения. В следующем примере показано
это различие.

_control87( _EM_INVALID, _MCW_EM );

// DENORMAL is unmasked by this call.

unsigned int current_word = 0;

_controlfp_s( &current_word, _EM_INVALID, _MCW_EM );

// DENORMAL exception mask remains unchanged.

Возможные значения константы маски ( mask ) и новые управляющие значения


( newControl ) показаны в следующей таблице шестнадцатеричных значений. В
аргументах этих функций вместо явных шестнадцатеричных значений следует
использовать перечисленные ниже переносимые константы ( _MCW_EM , _EM_INVALID
и т. д.).

Платформы, производные от Intel (x86), поддерживают DENORMAL входные и


выходные значения в оборудовании. Поведение x86 заключается в сохранении
DENORMAL значений. Платформа ARM и платформы x64 с поддержкой SSE2

позволяют DENORMAL сбрасывать операнды и результаты или принудительно


сбрасывать их. Функции _controlfp_s , _controlfp и _control87 предоставляют
маску для изменения такого поведения. В следующем примере показано
использование этой маски:

unsigned int current_word = 0;

_controlfp_s(&current_word, _DN_SAVE, _MCW_DN);

// Denormal values preserved on ARM platforms and on x64 processors with

// SSE2 support. NOP on x86 platforms.

_controlfp_s(&current_word, _DN_FLUSH, _MCW_DN);

// Denormal values flushed to zero by hardware on ARM platforms

// and x64 processors with SSE2 support. Ignored on other x86 platforms.

На платформах ARM функция _controlfp_s применяется к регистру FPSCR. В


архитектурах x64 затрагивается только управляющее слово SSE2, хранящееся в
регистре MXCSR. На платформах Intel (x86) функция _controlfp_s влияет на
управляющие слова как для x87, так и для SSE2 (при наличии). Эти два элемента
управления могут быть несогласованы друг с другом (например, из-за
предыдущего вызова __control87_2). Если между двумя словами элемента
управления есть несоответствие, _controlfp_s установите EM_AMBIGUOUS флаг в
currentControl . Это предупреждение о том, что возвращаемое контрольное слово

не может точно представлять состояние обоих слов управления с плавающей


запятой.

В архитектурах ARM и x64 изменение режима бесконечности или точности с


плавающей запятой не поддерживается. Если маска управления точностью
используется на платформе x64, функция вызывает утверждение и вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров".

Если маска не задана правильно, эта функция создает исключение недопустимого


параметра, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, эта функция возвращает EINVAL и задает для errno
значение EINVAL .

Эта функция игнорируется при использовании /clr (компиляция среды CLR), так как
среда CLR поддерживает только точность с плавающей запятой по умолчанию.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Маскирование констант и значений


При очистке маски _MCW_EM задается исключение, которое допускает аппаратное
исключение; установка маски скрывает это исключение. Если возникает
исключение _EM_UNDERFLOW или _EM_OVERFLOW , аппаратное исключение не создается,
пока не будет выполняться следующая операция с плавающей запятой. Чтобы
создать исключение оборудования сразу после _EM_UNDERFLOW или
_EM_OVERFLOW вызовите инструкцию FWAIT MASM .

Mask Шестнадцатеричное Константа Шестнадцатеричное


значение значение

_MCW_DN (управление 0x03000000 _DN_SAVE


0x00000000

денормализацией)
_DN_FLUSH 0x01000000

_MCW_EM (маска исключения 0x0008001F _EM_INVALID


0x00000010

прерывания)
_EM_DENORMAL
0x00080000

_EM_ZERODIVIDE
0x00000008

_EM_OVERFLOW
0x00000004

_EM_UNDERFLOW
0x00000002

_EM_INEXACT 0x00000001

_MCW_IC (управление 0x00040000 _IC_AFFINE


0x00040000

бесконечностью)

_IC_PROJECTIVE 0x00000000
(Не поддерживается на
платформах ARM или x64.)
Mask Шестнадцатеричное Константа Шестнадцатеричное
значение значение

_MCW_RC (управление 0x00000300 _RC_CHOP


0x00000300

округлением)
_RC_UP
0x00000200

_RC_DOWN
0x00000100

_RC_NEAR 0x00000000

_MCW_PC (управление 0x00030000 _PC_24 (24 0x00020000

точностью) бита)

0x00010000

(Не поддерживается на _PC_53 (53


платформах ARM или x64.) бита)
0x00000000

_PC_64 (64
бита)

Требования
Подпрограмма Обязательный заголовок

_controlfp_s <float.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_contrlfp_s.c

// processor: x86

// This program uses _controlfp_s to output the FP control

// word, set the precision to 24 bits, and reset the status to

// the default.

#include <stdio.h>

#include <float.h>

#pragma fenv_access (on)

int main( void )

double a = 0.1;

unsigned int control_word;

int err;

// Show original FP control word and do calculation.

err = _controlfp_s(&control_word, 0, 0);

if ( err ) /* handle error here */;

printf( "Original: 0x%.4x\n", control_word );

printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

// Set precision to 24 bits and recalculate.

err = _controlfp_s(&control_word, _PC_24, MCW_PC);

if ( err ) /* handle error here */;

printf( "24-bit: 0x%.4x\n", control_word );

printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

// Restore default precision-control bits and recalculate.

err = _controlfp_s(&control_word, _CW_DEFAULT, MCW_PC);

if ( err ) /* handle error here */;

printf( "Default: 0x%.4x\n", control_word );

printf( "%1.1f * %1.1f = %.15e\n", a, a, a * a );

Output

Original: 0x9001f

0.1 * 0.1 = 1.000000000000000e-002

24-bit: 0xa001f

0.1 * 0.1 = 9.999999776482582e-003

Default: 0x9001f

0.1 * 0.1 = 1.000000000000000e-002

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_clear87, _clearfp

_status87, _statusfp, _statusfp2

_control87, _controlfp, __control87_2


copysign , copysignf , copysignl ,
_copysign , _copysignf , _copysignl
Статья • 03.04.2023

Возвращает значение, которое имеет абсолютное значение одного аргумента и


знак другого.

Синтаксис
C

double copysign(

double x,

double y

);

float copysign(

float x,

float y

); // C++ only

long double copysign(

long double x,

long double y

); // C++ only

float copysignf(

float x,

float y

); // C++ only

long double copysignl(

long double x,

long double y

); // C++ only

double _copysign(

double x,

double y

);

long double _copysignl(


long double x,

long double y

);

#define copysign(X, Y) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой, которое возвращается как абсолютное значение


результата.

Значение с плавающей запятой, которое возвращается как знак результата.

Поддержка математических функций для чисел с плавающей запятой

Возвращаемое значение
Функции copysign возвращают значение с плавающей запятой, которое
объединяет абсолютное значение x и знак y . Ошибка не возвращается.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки copysign ,
которые принимают и возвращают значения float или long double . Если вы не
используете <макрос tgmath.h> в программе C для вызова этой функции, copysign
всегда принимает и возвращает значение double .

При использовании <макроса tgmath.h> copysign() тип аргумента определяет,


какая версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

Требования
Подпрограмма Обязательный заголовок

_copysign <float.h>

copysign , copysignf , copysignl , _copysignf , _copysignl <math.h>

copysign Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также
fabs, fabsf, fabsl

_chgsign, _chgsignf, _chgsignl


cos , cosf , cosl
Статья • 03.04.2023

Вычисляет косинус.

Синтаксис
C

double cos( double x );

float cosf( float x );

long double cosl( long double x );

#define cos(X) // Requires C11 or higher

float cos( float x ); // C++ only

long double cos( long double x ); // C++ only

Параметры
x

Угол в радианах.

Возвращаемое значение
Косинус x . Если x значение больше или равно 263 или меньше или равно -263,
происходит потеря значимости в результате.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

± INF INVALID _DOMAIN

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cos , которые
принимают и возвращают значения float или long double . В программе C, если вы
не используете <макрос tgmath.h> для вызова этой функции, cos всегда
принимает и возвращает double .
Если вы используете <макрос tgmath.h> cos() , тип аргумента определяет, какая
версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок C Обязательный заголовок C++

cos , cosh , cosf <math.h> <cmath> или <math.h>

Макрос cos() <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в sin, sinf, sinl.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acos, acosf, acosl

asin, asinf, asinl

atan, atanf, atanl, atan2, atan2f, atan2l

_matherr

sin, sinf, sinl

tan, tanf, tanl


cosh , coshf , coshl
Статья • 03.04.2023

Вычисляет гиперболический косинус.

Синтаксис
C

double cosh( double x );

float coshf( float x );


long double coshl( long double x );

#define cosh(X) // Requires C11 or higher

float cosh( float x ); // C++ only

long double cosh( long double x ); // C++ only

Параметры
x

Угол в радианах.

Возвращаемое значение
Гиперболический косинус x .

По умолчанию, если результат вызова cosh , coshf или coshl слишком велик,
функция возвращает HUGE_VAL и присваивает errno значение ERANGE .

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

x ≥ 7.104760e+002 INEXACT + OVERFLOW OVERFLOW

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cosh , которые
принимают и возвращают значения float или long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, cosh всегда
принимает и возвращает . double

Если вы используете cosh макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

coshf , cosl , coshl <math.h> <cmath> или <math.h>

coshf Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в sinh, sinhf, sinhl.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acosh, acoshf, acoshl

asinh, asinhf, asinhl

atanh, atanhf, atanhl


_matherr

sinh, sinhf, sinhl

tanh, tanhf, tanhl


Макрос _countof
Статья • 03.04.2023

Вычисляет количество элементов в статически выделенном массиве.

Синтаксис
C

#define _countof(array) (sizeof(array) / sizeof(array[0]))

Параметры
array

Имя массива.

Возвращаемое значение
Количество элементов в массиве, выраженное как size_t .

Комментарии
_countof реализуется как макрос препроцессора, похожий на функцию. Версия
C++ имеет дополнительные механизмы шаблонов для обнаружения во время
компиляции, если указатель передается вместо статического объявленного
массива.

Убедитесь, что array действительно массив, а не указатель. В C выдает ошибочные


результаты, _countof если array это указатель. В C++ не удается скомпилировать,
_countof если array это указатель. Массив, передаваемый в качестве параметра

функции , распадается на указатель, что означает, что в функции нельзя


использовать _countof для определения степени массива.

Requirements (Требования)
Макрос Обязательный заголовок
Макрос Обязательный заголовок

_countof <stdlib.h>

Пример
C++

// crt_countof.cpp

#define _UNICODE

#include <stdio.h>

#include <stdlib.h>

#include <tchar.h>

int main( void )

_TCHAR arr[20], *p;

printf( "sizeof(arr) = %zu bytes\n", sizeof(arr) );

printf( "_countof(arr) = %zu elements\n", _countof(arr) );

// In C++, the following line would generate a compile-time error:

// printf( "%zu\n", _countof(p) ); // error C2784 (because p is a


pointer)

_tcscpy_s( arr, _countof(arr), _T("a string") );

// unlike sizeof, _countof works here for both narrow- and wide-character
strings

Output

sizeof(arr) = 40 bytes

_countof(arr) = 20 elements

См. также раздел


sizeofОператор
cpow , cpowf , cpowl
Статья • 03.04.2023

Извлекает значение числа, возведенное в заданную степень; при этом база и


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

Синтаксис
C

_Dcomplex cpow(

_Dcomplex x, _Dcomplex y

);

_Fcomplex cpow(

_Fcomplex x, _Fcomplex y

); // C++ only

_Lcomplex cpow(

_Lcomplex x, _Lcomplex y

); // C++ only

_Fcomplex cpowf(

_Fcomplex x, _Fcomplex y

);

_Lcomplex cpowl(

_Lcomplex x, _Lcomplex y

);

Параметры
x

База.

Экспонента.

Возвращаемое значение
Значение x , возведенное в степень y , с ветвью, вырезанной для x вдоль
отрицательной части реальной оси.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cpow , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C cpow всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

cpow , cpowf , cpowl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

cexp, cexpf, cexpl

clog10, clog10f, clog10l

clog, clogf, clogl


cprintf
Статья • 03.04.2023

Имя cprintf функции, зависят от Майкрософт, является устаревшим псевдонимом


_cprintf для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать функцию _cprintf или функцию с


повышенным _cprintf_s уровнем безопасности. Кроме того, вы можете продолжать
использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен функций предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5

округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно


представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.
_cprintf , _cprintf_l , _cwprintf ,
_cwprintf_l
Статья • 03.04.2023

Форматируют и выводят данные на консоль. Доступны более безопасные версии;


see _cprintf_s, _cprintf_s_l, _cwprintf_s_cwprintf_s_l.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _cprintf(

const char * format [, argument_list]

);

int _cprintf_l(

const char * format,


_locale_t locale [, argument_list]

);

int _cwprintf(

const wchar * format [, argument_list]

);

int _cwprintf_l(

const wchar * format,

_locale_t locale [, argument_list]

);

Параметры
format

Строка управления форматом.

argument_list

Необязательные параметры для строки формата.


locale

Используемый языковой стандарт.

Возвращаемое значение
Число отображаемых символов.

Комментарии
Эти функции форматируют и выводят последовательности символов и значений
напрямую на консоль, используя функцию _putch ( _putwch для _cwprintf ) для
вывода символов. Каждый аргумент в argument_list (при наличии) преобразуется
и выводится в соответствии с соответствующей спецификацией формата в format .
Аргумент format использует синтаксис спецификации формата для функций printf и
wprintf. fprintf В отличие от функций printf и sprintf функций _cprintf и
_cwprintf не преобразовывайте символы строкового канала в комбинации

возврата каретки (CR-LF) при выводе.

Важное различие заключается в том, что _cwprintf при использовании в Windows


отображаются символы Юникода. В отличие от функции _cprintf , функция
_cwprintf использует текущие параметры языкового стандарта консоли.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта.

_cprintf проверяет параметр format . Если format это пустой указатель, функция

вызывает обработчик недопустимых параметров, как описано в разделе "Проверка


параметров". Если выполнение может быть продолжено, функция возвращает -1 и
устанавливает errno в значение EINVAL .

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округляются до
ближайшей четной цифры (также известной как "Округление банкира").
Например, оба printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны
округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до 3. Это
изменение влияет только на точно представляемые числа. Например, 2.35
(который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcprintf _cprintf _cprintf _cwprintf

_tcprintf_l _cprintf_l _cprintf_l _cwprintf_l

Требования
Подпрограмма Обязательный заголовок

_cprintf , _cprintf_l <conio.h>

_cwprintf , _cwprintf_l <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_cprintf.c

// compile with: /c

// This program displays some variables to the console.

#include <conio.h>

int main( void )

int i = -16,

h = 29;

unsigned u = 62511;

char c = 'A';

char s[] = "Test";

// Note that console output does not translate \n as

// standard output does. Use \r\n instead.

//

_cprintf( "%d %.4x %u %c %s\r\n", i, h, u, c, s );

Output

-16 001d 62511 A Test

См. также раздел


Ввод-вывод на консоль и порт

_cscanf, _cscanf_l, _cwscanf, _cwscanf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l

_cprintf_s, _cprintf_s_l, _cwprintf_s, _cwprintf_s_l

_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l

Синтаксис спецификации формата: printf и wprintf функции


_cprintf_p , _cprintf_p_l , _cwprintf_p ,
_cwprintf_p_l
Статья • 03.04.2023

Форматирует и производит вывод на консоль, поддерживает позиционные


параметры в строке форматирования.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _cprintf_p(

const char * format [,

argument] ...

);

int _cprintf_p_l(

const char * format,


_locale_t locale [,

argument] ...

);

int _cwprintf_p(

const wchar * format [,

argument] ...

);

int _cwprintf_p_l(

const wchar * format,

_locale_t locale [,

argument] ...

);

Параметры
format

Строка управления форматом.


argument

Дополнительные параметры.

locale

Используемый языковой стандарт.

Возвращаемое значение
Число выведенных символов или отрицательное значение в случае ошибки.

Комментарии
Эти функции форматируют и выводят последовательности символов и значений
напрямую на консоль, используя функции _putch и _putwch для вывода символов.
Каждый argument (если он есть) преобразуется и выводится согласно
соответствующей спецификацией формата в format . Формат имеет ту же форму и
функцию, что format и параметр для printf_p функции. Различие между функциями
_cprintf_p и cprintf_s заключается в том, что функция _cprintf_p поддерживает

позиционные параметры, позволяющие определить порядок, в котором аргументы


используются в строке форматирования. Дополнительные сведения см. в разделе
Позиционные параметры printf_p.

fprintf_p В отличие от функций и sprintf_p printf_p функций и

_cprintf_p _cwprintf_p не преобразуйте символы строкового канала в сочетания


возвращаемых строк каретки (CR-LF) при выводе. Важное отличие заключается в
том, что функция _cwprintf_p показывает символы Юникода при использовании в
Windows NT. В отличие от функции _cprintf_p , функция _cwprintf_p использует
текущие параметры языкового стандарта консоли.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта.

Кроме того, как и функции _cprintf_s и _cwprintf_s , они проверяют входной


указатель и строку форматирования. Если format строка
argument NULL форматирования содержит недопустимые символы форматирования,
эти функции вызывают обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если разрешается продолжать выполнение, эти
функции возвращают -1 и задают errno значение EINVAL .
) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5
округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно
представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcprintf_p _cprintf_p _cprintf_p _cwprintf_p

_tcprintf_p_l _cprintf_p_l _cprintf_p_l _cwprintf_p_l

Требования
Подпрограмма Обязательный заголовок

_cprintf_p , _cprintf_p_l <conio.h>

_cwprintf_p , _cwprintf_p_l <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_cprintf_p.c

// This program displays some variables to the console

// using the _cprintf_p function.

#include <conio.h>

int main( void )

int i = -16,

h = 29;

unsigned u = 62511;

char c = 'A';

char s[] = "Test";

// Note that console output does not translate

// \n as standard output does. Use \r\n instead.

_cprintf_p( "%2$d %1$.4x %3$u %4$c %5$s\r\n",

h, i, u, c, s );

Output

-16 001d 62511 A Test

См. также раздел


Ввод-вывод на консоль и порт

_cscanf, _cscanf_l, _cwscanf, _cwscanf_l

_cscanf_s, _cscanf_s_l, _cwscanf_s, _cwscanf_s_l

_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l

fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l

_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l

printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l

_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l

_cprintf_s, _cprintf_s_l, _cwprintf_s, _cwprintf_s_l

printf_p позиционные параметры

Синтаксис спецификации формата: printf и wprintf функции


_cprintf_s , _cprintf_s_l , _cwprintf_s ,
_cwprintf_s_l
Статья • 03.04.2023

Форматируют и выводят данные на консоль. Эти версии , имеют


_cprintf_l_cwprintf_cwprintf_lулучшения безопасности, как описано в
функциях_cprintfбезопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _cprintf_s(

const char * format [,

argument] ...

);

int _cprintf_s_l(

const char * format,


_locale_t locale [,

argument] ...

);

int _cwprintf_s(

const wchar * format [,

argument] ...

);

int _cwprintf_s_l(

const wchar * format,

_locale_t locale [,

argument] ...

);

Параметры
format

Строка управления форматом.


argument

Дополнительные параметры.

locale

Используемый языковой стандарт.

Возвращаемое значение
Число отображаемых символов.

Комментарии
Эти функции форматируют и выводят последовательности символов и значений
напрямую на консоль, используя функцию _putch ( _putwch для _cwprintf_s ) для
вывода символов. Каждый argument (если он есть) преобразуется и выводится
согласно соответствующей спецификацией формата в format . Формат имеет ту же
форму и функцию, что format и параметр для printf_s функции. fprintf_s В отличие
от функций и sprintf_s printf_s функций и _cprintf_s _cwprintf_s не преобразуйте
символы строкового канала в сочетания возвращаемых строк каретки (CR-LF) при
выводе.

Важное отличие заключается в том, что функция _cwprintf_s показывает символы


Юникода при использовании в Windows NT. В отличие от функции _cprintf_s ,
функция _cwprintf_s использует текущий языковый стандарт консоли.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5
округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно
представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Как и небезопасные версии (см _cprintf. , _cprintf_l, _cwprintf), _cwprintf_lэти функции


проверяют свои параметры и вызывают обработчик недопустимых параметров,
как описано в описании проверки параметров, если format это пустой указатель.
Эти функции отличаются от небезопасных версий тем, что также проверяется сама
строка формата. При наличии любых неизвестных или неправильно
сформированных описателей форматирования эти функции вызывают обработчик
недопустимых параметров. Во всех случаях, если выполнение может быть
продолжено, функции возвращают –1 и устанавливают параметр errno в значение
EINVAL .

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcprintf_s _cprintf_s _cprintf_s _cwprintf_s

_tcprintf_s_l _cprintf_s_l _cprintf_s_l _cwprintf_s_l

Требования
Подпрограмма Обязательный заголовок

_cprintf_s , _cprintf_s_l <conio.h>

_cwprintf_s , _cwprintf_s_l <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_cprintf_s.c

// compile with: /c

// This program displays some variables to the console.

#include <conio.h>

int main( void )

int i = -16, h = 29;

unsigned u = 62511;

char c = 'A';

char s[] = "Test";

/* Note that console output does not translate \n as

* standard output does. Use \r\n instead.

*/

_cprintf_s( "%d %.4x %u %c %s\r\n", i, h, u, c, s );

Output

-16 001d 62511 A Test

См. также раздел


Ввод-вывод на консоль и порт

_cscanf, _cscanf_l, _cwscanf, _cwscanf_l

fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l

printf_s, _printf_s_l, wprintf_s, _wprintf_s_l

sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

vfprintf_s, _vfprintf_s_l, vfwprintf_s, _vfwprintf_s_l

Синтаксис спецификации формата: printf и wprintf функции


cproj , cprojf , cprojl
Статья • 03.04.2023

Извлекает проекцию комплексного числа на сферу Римана.

Синтаксис
C

_Dcomplex cproj(

_Dcomplex z

);

_Fcomplex cproj(

_Fcomplex z

); // C++ only

_Lcomplex cproj(

_Lcomplex z

); // C++ only

_Fcomplex cprojf(

_Fcomplex z

);

_Lcomplex cprojl(

_Lcomplex z

);

#define cproj(X) // Requires C11 or higher

Параметры
z

Комплексное число.

Возвращаемое значение
Проекция z на сферу Римана.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки cproj , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе C, если
вы не используете <макрос tgmath.h> для вызова этой функции, cproj всегда
принимает и возвращает _Dcomplex значение.
При использовании <макроса tgmath.h> cproj() тип аргумента определяет, какая
версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

Требования
Подпрограмма Заголовок C Заголовок C++

cproj , cprojf , cprojl <complex.h> <ccomplex>

cproj Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

norm, normf, norml

creal, crealf, creall

conj, conjf, conjl

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


cputs
Статья • 03.04.2023

Имя cputs функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _cputs функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _cputs . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_cputs , _cputws
Статья • 03.04.2023

Переводит строку в консоль.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _cputs(

const char *str

);

int _cputws(

const wchar_t *str

);

Параметры
str

Выходная строка.

Возвращаемое значение
В случае успеха _cputs возвращает 0. Если функция завершается с ошибкой,
возвращается ненулевое значение.

Комментарии
Функция _cputs записывает строку, заканчивающуюся нулевым байтом и
определенную параметром str , непосредственно в консоль. Комбинация канала
возврата каретки (CR-LF) не добавляется в строку автоматически.
Эта функция проверяет свои параметры. В противном str случае NULL вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение разрешено продолжать, errno устанавливается
значение EINVAL -1 и возвращается значение -1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_cputts _cputs _cputs _cputws

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_cputs <conio.h> <errno.h>

_cputws <conio.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_cputs.c

// compile with: /c

// This program first displays a string to the console.

#include <conio.h>

#include <errno.h>

void print_to_console(char* buffer)

int retval;

retval = _cputs( buffer );

if (retval)

if (errno == EINVAL)

_cputs( "Invalid buffer in print_to_console.\r\n");

else

_cputs( "Unexpected error in print_to_console.\r\n");

void wprint_to_console(wchar_t* wbuffer)

int retval;

retval = _cputws( wbuffer );

if (retval)

if (errno == EINVAL)

_cputws( L"Invalid buffer in wprint_to_console.\r\n");

else

_cputws( L"Unexpected error in wprint_to_console.\r\n");

int main()

// String to print at console.

// Notice the \r (return) character.

char* buffer = "Hello world (courtesy of _cputs)!\r\n";

wchar_t *wbuffer = L"Hello world (courtesy of _cputws)!\r\n";

print_to_console(buffer);

wprint_to_console( wbuffer );

Output

Hello world (courtesy of _cputs)!


Hello world (courtesy of _cputws)!

См. также раздел


Ввод-вывод на консоль и порт

_putch, _putwch
creal , crealf , creall
Статья • 03.04.2023

Извлекает реальную часть комплексного числа.

Синтаксис
C

double creal( _Dcomplex z );

float crealf( _Fcomplex z );

long double creall( _Lcomplex z );

#define creal(X) // Requires C11 or higher

float creal( _Fcomplex z ); // C++ only

long double creal( _Lcomplex z ); // C++ only

Параметры
z

Комплексное число.

Возвращаемое значение
Реальная часть z .

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки creal , которые
принимают значения _Fcomplex или _Lcomplex и возвращают значения float или
long double . В программе C, если вы не используете <макрос tgmath.h> для вызова
этой функции, creal всегда принимает _Dcomplex значение и возвращает double
значение.

При использовании <макроса tgmath.h> creal() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

Требования
Подпрограмма Заголовок C Заголовок C++

creal , crealf , creall <complex.h> <ccomplex>

creal Макрос <tgmath.h>

_Fcomplex _Dcomplex Типы и _Lcomplex типы являются эквивалентами собственных

типов C99 майкрософт с плавающей запятой _Complex, двойным _Complex и


длинным двойным _Complex соответственно. Дополнительные сведения о
совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

_Cbuild, _FCbuild, _LCbuild


norm, normf, norml

cproj, cprojf, cprojl

conj, conjf, conjl

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


creat
Статья • 03.04.2023

Имя creat функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _creat функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _creat . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_creat , _wcreat
Статья • 03.04.2023

Создает новый файл. _creat и _wcreat устарели; вместо этого используйте _sopen_s.
_wsopen_s

Синтаксис
C

int _creat(

const char *filename,

int pmode

);

int _wcreat(

const wchar_t *filename,

int pmode

);

Параметры
filename

Имя нового файла.

pmode

Настройка разрешений.

Возвращаемое значение
Эти функции при успешном завершении возвращают дескриптор созданного
файла. В противном случае функции возвращают значение -1 и задаются errno ,
как показано в следующей таблице.

Значение Описание
errno

EACCES Параметр filename определяет существующий файл, доступный только для


чтения, или указывает каталог вместо файла.

EMFILE Больше нет доступных дескрипторов файлов.

ENOENT Не удалось найти указанный файл.


Если filename имеет значение NULL , эти функции вызывают обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, эти функции устанавливают для errno
значение EINVAL и возвращают -1.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функция _creat создает новый файл или открывает и обрезает существующий.
_wcreat — это версия _creat с расширенными символами; аргумент filename для
_wcreat — строка расширенных символов. Поведение _wcreat и _creat идентично

в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcreat _creat _creat _wcreat

Если файл, указанный параметром filename , не существует, создается новый файл


с заданным параметром разрешений и открывается для записи. Если файл уже
существует и его настройки разрешений допускают запись, функция _creat
обрезает файл до длины 0, уничтожая предыдущее содержимое, и открывает его
для записи. Настройка разрешений, pmode , применяется только к вновь созданным
файлам. Новый файл получает указанный параметр разрешений после первого
закрытия. Целочисленное выражение pmode содержит одну или обе константы
манифеста _S_IWRITE и _S_IREAD , определенные в SYS\Stat.h. При указании обеих
констант они соединяются с побитовой или оператором ( | ). Параметр pmode
имеет одно из следующих значений.

Значение Определение

_S_IWRITE Разрешена запись.

_S_IREAD Разрешено чтение.


Значение Определение

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

Если разрешение на запись не предоставлено, файл доступен только для чтения.


Все файлы всегда доступны для чтения; невозможно предоставить разрешение
только на запись. Поэтому режимы _S_IWRITE и _S_IREAD | _S_IWRITE эквивалентны.
Файлы, открытые с помощью , _creat всегда открываются в режиме
совместимости (см. _sopen) с _SH_DENYNO помощью .

_creat применяет текущую маску разрешений файла к pmode перед установкой

разрешений (см. )._umask Функция _creat предоставлена в основном для


обеспечения совместимости с предыдущими библиотеками. Вызов функции _open
со значениями _O_CREAT и _O_TRUNC в параметре oflag эквивалентен вызову
функции _creat и предпочтителен для нового кода.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_creat <io.h> <sys/types.h>, <sys/stat.h>, <errno.h>

_wcreat <io.h> или <wchar.h> <sys/types.h>, <sys/stat.h>, <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_creat.c

// compile with: /W3

// This program uses _creat to create

// the file (or truncate the existing file)

// named data and open it for writing.

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

int main( void )

int fh;

fh = _creat( "data", _S_IREAD | _S_IWRITE ); // C4996

// Note: _creat is deprecated; use _sopen_s instead

if( fh == -1 )

perror( "Couldn't create data file" );

else

printf( "Created data file.\n" );

_close( fh );

Output

Created data file.

См. также раздел


Низкоуровневый ввод-вывод

_chmod, _wchmod

_chsize

_close

_dup, _dup2

_open, _wopen

_sopen, _wsopen

_umask
_create_locale , _wcreate_locale
Статья • 03.04.2023

Создает объект языкового стандарта.

Синтаксис
C

_locale_t _create_locale(

int category,

const char *locale

);

_locale_t _wcreate_locale(

int category,

const wchar_t *locale

);

Параметры
category

Категория.

locale

Указатель языкового стандарта.

Возвращаемое значение
Если задано допустимое locale значение, category функции возвращают
указанные параметры языкового _locale_t стандарта в виде объекта. Текущие
параметры языкового стандарта программы не изменяются.

Комментарии
Функция _create_locale позволяет создать объект, представляющий определенные
параметры конкретного региона, для использования в локальных версиях многих
функций CRT (функций с суффиксом _l ). Она ведет себя так же, как setlocale ,
однако вместо применения указанных параметров языкового стандарта к текущей
среде параметры сохраняются в возвращаемой структуре _locale_t . Структура
_locale_t должна быть освобождена, _free_locale если она больше не нужна.
_wcreate_locale — это версия _create_locale с расширенными символами;

аргумент locale для _wcreate_locale — строка расширенных символов.


Поведение _wcreate_locale и _create_locale идентично в противном случае.

Аргумент category определяет соответствующие фрагменты поведения, связанные


с локальным стандартом. Флаги, используемые для category и части программы,
которые они влияют, приведены в следующей таблице:

Флаг category Область применения

LC_ALL Все категории, перечисленные ниже.

LC_COLLATE Функции strcoll , _stricoll , wcscoll , _wcsicoll , strxfrm , _strncoll ,


_strnicoll , _wcsncoll , _wcsnicoll и wcsxfrm .

LC_CTYPE Функции обработки символов (за исключением isdigit , isxdigit , mbstowcs


и mbtowc , которые не затрагиваются).

LC_MONETARY Информация о форматировании денежных значений, возвращаемая


функцией localeconv .

LC_NUMERIC Символ десятичного разделителя для информации процедур


форматированного вывода (например, printf ), для процедур
преобразования данных и для форматирования не относящихся к
денежным значений, возвращаемой localeconv . Помимо символа
десятичной запятой, LC_NUMERIC задает разделитель тысяч и строку элемента
управления группировкой, возвращаемую localeconv.

LC_TIME Функции strftime и wcsftime .

Эта функция проверяет параметры category и locale . Если параметр категории не


является одним из значений, заданных в предыдущей таблице или если locale это
NULL , функция возвращается NULL .

Аргумент locale является указателем на строку, которая задает языковой стандарт.


Сведения о формате аргумента locale см. в строках языкового стандарта, языков и
стран и регионов.

Аргумент locale может принимать несколько типов значений: имя языкового


стандарта, языковая строка, строка языка и код страны или региона, кодовая
страница или сочетание строки языка, кода страны или региона и кодовой
страницы. Набор (доступных имен языков, языков, кодов страны или региона и
кодовых страниц) включает все, которые поддерживаются API NLS Для Windows.
Набор поддерживаемых языкового _create_locale стандарта описан в строках
языкового стандарта, языков и стран и регионов. Набор строк языка и страны или
региона, поддерживаемых _create_locale строками, перечислены в строках языка
и стране или регионе.

Дополнительные сведения о параметрах языкового стандарта см. в разделе


setlocale. _wsetlocale

Предыдущее название этой функции, __create_locale (с двумя символами


подчеркивания в начале), использовать не рекомендуется.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_create_locale <locale.h>

_wcreate_locale <locale.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_create_locale.c

// Sets the current locale to "de-CH" using the

// setlocale function and demonstrates its effect on the strftime

// function.

#include <stdio.h>

#include <locale.h>

#include <time.h>

int main(void)

time_t ltime;

struct tm thetime;

unsigned char str[100];

_locale_t locale;

// Create a locale object representing the German (Switzerland) locale

locale = _create_locale(LC_ALL, "de-CH");

time (&ltime);

_gmtime64_s(&thetime, &ltime);

// %#x is the long date representation, appropriate to

// the current locale

if (!_strftime_l((char *)str, 100, "%#x",

(const struct tm *)&thetime, locale))

printf("_strftime_l failed!\n");

else

printf("In de-CH locale, _strftime_l returns '%s'\n", str);

_free_locale(locale);

// Create a locale object representing the default C locale

locale = _create_locale(LC_ALL, "C");

time(&ltime);

_gmtime64_s(&thetime, &ltime);

if (!_strftime_l((char *)str, 100, "%#x",

(const struct tm *)&thetime, locale))

printf("_strftime_l failed!\n");

else

printf("In 'C' locale, _strftime_l returns '%s'\n", str);

_free_locale(locale);

Output

In de-CH locale, _strftime_l returns 'Samstag, 9. Februar 2002'

In 'C' locale, _strftime_l returns 'Saturday, February 09, 2002'

См. также раздел


Строки языков, языков и стран и регионов

Строки языка

Строки страны или региона

_free_locale

_configthreadlocale

setlocale

Локаль

localeconv

_mbclen, mblen, _mblen_l

strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

_setmbcp

setlocale, _wsetlocale

Функции strcoll

strftime, wcsftime, _strftime_l, _wcsftime_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l

wcstombs, _wcstombs_l

wctomb, _wctomb_l
_CrtCheckMemory
Статья • 03.04.2023

Проверяет целостность выделенных блоков памяти в отладочной куче (только в


отладочной версии).

Синтаксис
C

int _CrtCheckMemory( void );

Возвращаемое значение
В случае успешного _CrtCheckMemory выполнения возвращает TRUE ; в противном
случае функция возвращает FALSE .

Комментарии
Функция _CrtCheckMemory проверяет память, выделенную диспетчеру отладочной
кучи, проверяя основную кучу и каждый блок памяти. Если несогласованность
памяти или ошибка возникают в базовой куче, сведениях о заголовке отладки или
буферах перезаписи, _CrtCheckMemory создает отчет об отладке с информацией,
описывающей условие возникновения ошибки. Если _DEBUG параметр не
определен, вызовы удаляются _CrtCheckMemory во время предварительной
обработки.

Поведением _CrtCheckMemory можно управлять, задав битовые поля флага


_crtDbgFlag с помощью _CrtSetDbgFlag функции . Включение битового
_CRTDBG_CHECK_ALWAYS_DF поля приводит _CrtCheckMemory к вызову при каждом

запросе операции выделения памяти. Хотя этот метод замедляет выполнение, он


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

проверяется и немедленно возвращается TRUE .

Так как эта функция возвращает TRUE или FALSE , ее можно передать в один из
_ASSERT макросов, чтобы создать базовый механизм обработки ошибок отладки.
Следующий пример вызывает сбой утверждения, если в куче обнаружено
повреждение.

_ASSERTE( _CrtCheckMemory( ) );

Дополнительные сведения о том, как _CrtCheckMemory можно использовать с


другими функциями отладки, см. в разделе Функции отчетов о состоянии кучи.
Общие сведения об управлении памятью и куче отладки см. в разделе Сведения об
отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtCheckMemory <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
Пример использования _CrtCheckMemory см. в разделе crt_dbg1 .

См. также раздел


Подпрограммы отладки

_crtDbgFlag

_CrtSetDbgFlag
_CrtDbgBreak
Статья • 03.04.2023

Устанавливает точку останова в определенной строке кода. (Используется только в


режиме отладки.)

Синтаксис
C

void _CrtDbgBreak( void );

Возвращаемое значение
Возвращаемое значение отсутствует.

Комментарии
Функция _CrtDbgBreak задает точку останова отладки в той строке кода, где
находится функция. Она используется только в режиме отладки и зависит от
определенного ранее параметра _DEBUG .

Дополнительные сведения об использовании других функций времени


выполнения с поддержкой перехватчика и создании собственных определяемых
клиентом функций-перехватчиков см. в статье Создание собственных функций
перехватчика отладки.

Требования
Подпрограмма Обязательный заголовок

_CrtDbgBreak <CRTDBG.h>

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.
См. также раздел
Подпрограммы отладки

__debugbreak
_CrtDbgReport , _CrtDbgReportW
Статья • 03.04.2023

Создает отчет с сообщением об отладке и отправляет его в три возможных


назначения (только отладочная версия).

Синтаксис
C

int _CrtDbgReport(

int reportType,

const char *filename,

int linenumber,

const char *moduleName,

const char *format [,

argument] ...

);

int _CrtDbgReportW(

int reportType,

const wchar_t *filename,

int linenumber,

const wchar_t *moduleName,

const wchar_t *format [,

argument] ...

);

Параметры
reportType

Тип отчета: _CRT_WARN , _CRT_ERROR и _CRT_ASSERT .

filename

Указатель на имя исходного файла, в котором возникло утверждение или отчет,


либо значение NULL .

lineNumber

Номер строки в исходном файле, в которой возникло утверждение или отчет, либо
значение NULL .

moduleName

Указатель на имя модуля (EXE или DLL), в котором возникло утверждение или отчет.
format

Указатель на строку управления форматом, которая использовалась для создания


сообщения для пользователя.

argument

Дополнительные подстановочные аргументы, используемые format .

Возвращаемое значение
Для всех назначений отчетов и _CrtDbgReportW возвращает значение -1,
_CrtDbgReport если возникает ошибка, и 0, если ошибки не обнаружены. Однако

если назначением отчета является окно сообщения отладки и пользователь


нажимает кнопку Повторить , эти функции возвращают значение 1. Если
пользователь нажимает кнопку Прервать в окне Сообщение отладки, эти функции
немедленно прервутся и не возвращают значение.

Вызов _RPTмакросов отладки , _RPTF чтобы создать отладочные отчеты


_CrtDbgReport . Версии этих макросов с _ASSERTрасширенными символами, а также
, _ASSERTE_RPTW и _RPTFWиспользуются для _CrtDbgReportW создания отчетов об
отладке. Если _CrtDbgReport или _CrtDbgReportW возвращают значение 1, эти
макросы запускают отладчик, если включена JIT-отладка.

Комментарии
_CrtDbgReport и _CrtDbgReportW может отправлять отчет об отладке в три разных

назначения: файл отчета об отладке, монитор отладки (отладчик Visual Studio) или
окно сообщения отладки. Две функции конфигурации, _CrtSetReportMode и
_CrtSetReportFile, используются для указания назначения или назначения для
каждого типа отчета. Эти функции позволяют управлять назначением или
назначениями для каждого типа отчета по отдельности. Например, можно указать,
что объект reportType _CRT_WARN из относится только к монитору отладки, а объект
reportType — к окну сообщения отладки _CRT_ASSERT и пользовательскому файлу
отчета.

_CrtDbgReportW — версия _CrtDbgReport с расширенными символами. Все выходные


и строковые параметры находятся в строках с расширенными символами; В
противном случае она идентична однобайтовой версии символов.

_CrtDbgReport и _CrtDbgReportW создайте сообщение пользователя для отчета об


отладке, заменив argument[n] аргументы в format строку, используя те же правила,
которые определены функциями printf или wprintf . Затем эти функции создают
отчет об отладке и определяют назначение (назначения) в зависимости от текущих
режимов отчета и файла, заданных для reportType . Когда отчет отправляется в
окно с сообщением об отладке, filename , lineNumber и moduleName включаются в
набор сведений, которые отображаются в окне.

В таблице ниже приведен список доступных вариантов для режима или режимов
отчета и файла, а также поведение, которое является результатом функций
_CrtDbgReport и _CrtDbgReportW . Эти параметры определяются как битовые флаги в

<crtdbg.h>.

Режим отчета Файл отчета Поведение _CrtDbgReport , _CrtDbgReportW

_CRTDBG_MODE_DEBUG Неприменимо Записывает сообщение с помощью API Windows


OutputDebugString .

_CRTDBG_MODE_WNDW Неприменимо Вызывает API Windows MessageBox для создания


окна сообщения для отображения сообщения
вместе с кнопками "Прервать", "Повторить" и
"Пропустить ". Если пользователь выбирает
Прервать или _CrtDbgReport _CrtDbgReport
немедленно прерывает. Если пользователь
выбирает повторить попытку, возвращается
значение 1. Если пользователь выбирает
Игнорировать, выполнение продолжается и
_CrtDbgReport _CrtDbgReportW возвращается
значение 0. Если при наличии условия ошибки
выбран вариант Пропустить , это часто
приводит к неопределенному поведению.

_CRTDBG_MODE_FILE __HFILE Записывает сообщение в предоставленный


HANDLE пользователем с помощью API Windows
WriteFile и не проверяет допустимость
дескриптора файла. Приложение отвечает за
открытие файла отчета и передачу допустимого
дескриптора файла.

_CRTDBG_MODE_FILE _CRTDBG_FILE_STDERR Записывает сообщение в stderr .

_CRTDBG_MODE_FILE _CRTDBG_FILE_STDOUT Записывает сообщение в stdout .

Этот отчет можно отправить в одно, два или три назначения (или ни в одно из
назначений). Дополнительные сведения об указании режима отчета или режимов
и файла отчета см. в _CrtSetReportMode разделе Функции и _CrtSetReportFile .
Дополнительные сведения об использовании отладочных макросов и функций
создания отчетов см. в разделе Макросы для создания отчетов.
Если приложению требуется больше гибкости, чем при использовании
_CrtDbgReport и _CrtDbgReportW , можно написать собственную функцию отчетов и
подключить ее к механизму создания отчетов библиотеки времени выполнения C с
помощью _CrtSetReportHook функции .

Требования
Подпрограмма Обязательный заголовок

_CrtDbgReport <crtdbg.h>

_CrtDbgReportW <crtdbg.h>

_CrtDbgReport и _CrtDbgReportW являются расширениями Майкрософт.


Дополнительные сведения см. в разделе Совместимость.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C

// crt_crtdbgreport.c

#include <crtdbg.h>

int main(int argc, char *argv[]) {

#ifdef _DEBUG

_CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, argv[0], NULL);

#endif

См crt_dbg2 . пример изменения функции отчета.

См. также раздел


Подпрограммы отладки

_CrtSetReportMode

_CrtSetReportFile

printf, _printf_l, wprintf, _wprintf_l

_DEBUG
_CrtDoForAllClientObjects
Статья • 03.04.2023

Вызывает функцию, предоставляемую приложением, для всех типов _CLIENT_BLOCK


в куче (только отладочная версия).

Синтаксис
C

void _CrtDoForAllClientObjects(

void ( * pfn )( void *, void * ),

void *context

);

Параметры
pfn

Указатель на функцию обратного вызова функции, предоставляемой приложением.


Первый параметр для этой функции указывает на данные. Второй параметр
является указателем контекста, передаваемым в вызов функции
_CrtDoForAllClientObjects .

context

Указатель на контекст, предоставляемый приложением, для передачи в функцию,


предоставляемую приложением.

Комментарии
Функция _CrtDoForAllClientObjects выполняет поиск блоков памяти с типом
_CLIENT_BLOCK в связанном списке кучи и вызывает функцию, предоставляемую

приложением, если удается найти блок этого типа. Найденный блок и параметр
context передаются как аргументы в функцию, предоставляемую приложением. Во
время отладки приложение может отследить определенную группу выделений,
явно вызывая функции отладочной кучи для выделения памяти и указывая, что
блокам должен назначаться тип _CLIENT_BLOCK . Эти блоки затем могут
отслеживаться по отдельности и включаться в разные отчеты об обнаружении
утечки и состоянии памяти.
Если битовое _CRTDBG_ALLOC_MEM_DF поле флага _crtDbgFlag не включено,
_CrtDoForAllClientObjects немедленно возвращается. Если _DEBUG параметр не
определен, вызовы удаляются _CrtDoForAllClientObjects во время
предварительной обработки.

Дополнительные сведения о типе _CLIENT_BLOCK и о том, как его могут


использовать другие функции отладки, см. в статье Types of blocks on the debug
heap. Сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Если pfn имеет значение NULL , вызывается обработчик недопустимых параметров,


как описано в разделе Проверка параметров. Если выполнение разрешено
продолжать, errnoдля , _doserrno, _sys_errlistи _sys_nerr задано значение EINVAL , а
функция возвращает значение .

Требования
Подпрограмма Обязательный заголовок

_CrtDoForAllClientObjects <crtdbg.h>, <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Отладка версий только универсальных библиотек среды выполнения


C.

См. также раздел


Подпрограммы отладки

_CrtSetDbgFlag

Функции отчетов о состоянии кучи

_CrtReportBlockType
_CrtDumpMemoryLeaks
Статья • 03.04.2023

Сбрасывает все блоки памяти в отладочной куче в случае утечки памяти (только в
отладочной версии).

Синтаксис
C

int _CrtDumpMemoryLeaks( void );

Возвращаемое значение
_CrtDumpMemoryLeaks возвращает значение TRUE , если обнаружена утечка памяти. В

противном случае функция возвращает значение FALSE .

Комментарии
Функция _CrtDumpMemoryLeaks определяет, произошла ли утечка памяти после
начала выполнения программы. При обнаружении утечки данные заголовка
отладки для всех объектов в куче записываются в форме, которую пользователь
может прочитать. Если _DEBUG параметр не определен, вызовы удаляются
_CrtDumpMemoryLeaks во время предварительной обработки.

Функция _CrtDumpMemoryLeaks часто вызывается в конце выполнения программы,


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

_CrtDumpMemoryLeaks вызывает _CrtMemCheckpoint для получения текущего


состояния кучи, а затем сканирует состояние на наличие блоков, которые не были
освобождены. При обнаружении неисхорошенного блока вызывает
_CrtMemDumpAllObjectsSince дамп сведений для всех объектов,
_CrtDumpMemoryLeaks выделенных в куче с начала выполнения программы.
По умолчанию внутренние блоки времени выполнения C ( _CRT_BLOCK ) не
включаются в операции дампа памяти. Функцию _CrtSetDbgFlag можно
использовать для включения бита _CRTDBG_CHECK_CRT_DF , _crtDbgFlag чтобы
включить эти блоки в процесс обнаружения утечки.

Дополнительные сведения о функциях состояния кучи и структуре см. в


_CrtMemState разделе Функции отчетов о состоянии кучи. Дополнительные

сведения о выделении, инициализации блоков памяти и управлении ими в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtDumpMemoryLeaks <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
Пример использования _CrtDumpMemoryLeaks см. в разделе crt_dbg1 .

См. также раздел


Подпрограммы отладки
_CrtGetAllocHook
Статья • 03.04.2023

Извлекает текущую определяемую клиентом функцию выделения памяти путем ее


прикрепления к отладочному процессу выделения памяти среды выполнения
языка C (только в отладочной версии).

Синтаксис
C

_CRT_ALLOC_HOOK _CrtGetAllocHook( void );

Возвращаемое значение
Возвращает определенную в данный момент функцию выделения памяти.

Комментарии
_CrtGetAllocHook извлекает текущую определяемую клиентом функцию выделения
памяти для процесса выделения памяти отладочной библиотеке в среде
выполнения.

Дополнительные сведения об использовании других функций времени


выполнения с поддержкой перехватчика и создании собственных функций
перехватчика, определяемых клиентом, см. в разделе Отладка записи функций
перехватчика.

Требования
Подпрограмма Обязательный заголовок

_CrtGetAllocHook <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки

_CrtSetAllocHook
_CrtGetDumpClient
Статья • 03.04.2023

Извлекает текущую определяемую приложением функцию для дампа блоков


памяти типа _CLIENT_BLOCK (только в отладочной версии).

Синтаксис
C

_CRT_DUMP_CLIENT _CrtGetDumpClient( void );

Возвращаемое значение
Возвращает текущую подпрограмму дампа.

Комментарии
Функция _CrtGetDumpClient извлекает текущую функцию перехватчика для дампа
объектов, хранящихся в блоках _CLIENT_BLOCK памяти.

Дополнительные сведения об использовании других функций времени


выполнения с поддержкой перехватчика и создании собственных определяемых
клиентом функций-перехватчиков см. в разделе Написание функций перехватчика
отладки.

Требования
Подпрограмма Обязательный заголовок

_CrtGetDumpClient <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.
См. также раздел
Подпрограммы отладки

_CrtReportBlockType

_CrtSetDumpClient
_CrtGetReportHook
Статья • 03.04.2023

Извлекает определяемую клиентом функцию отчетов путем ее прикрепления к


процессу создания отчетов среды выполнения языка C (только в отладочной
версии).

Синтаксис
C

_CRT_REPORT_HOOK _CrtGetReportHook( void );

Возвращаемое значение
Возвращает текущую определяемую клиентом функцию отчетов.

Комментарии
_CrtGetReportHook позволяет приложению извлекать текущую функцию отчетов для
процесса создания отчетов отладочной библиотеки в среде выполнения языка C.

Дополнительные сведения об использовании других функций времени


выполнения с поддержкой перехватчика и создании собственных определяемых
клиентом функций-перехватчиков см. в разделе Написание функций перехватчика
отладки.

Требования
Подпрограмма Обязательный заголовок

_CrtGetReportHook <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.
Пример
Пример использования _CrtSetReportHook см. в разделе report .

См. также раздел


Подпрограммы отладки

_CrtSetReportHook
_CrtIsMemoryBlock
Статья • 03.04.2023

Проверяет, находится ли указанный блок памяти в локальной куче и имеет ли он


действительный идентификатор типа блока отладочной кучи (только в отладочной
версии).

Синтаксис
C

int _CrtIsMemoryBlock(

const void *userData,

unsigned int size,

long *requestNumber,

char **filename,

int *lineNumber

);

Параметры
userData

Указатель на начало блока памяти, требующего проверки.

size

Размер указанного блока в байтах.

requestNumber

Указатель на номер выделения блока или NULL .

filename

Указатель на имя исходного файла, который запрашивает блок или NULL .

lineNumber

Указатель на номер строки в исходном файле или NULL .

Возвращаемое значение
_CrtIsMemoryBlock возвращает TRUE , если указанный блок памяти находится в
локальной куче и имеет допустимый идентификатор типа блока отладочной кучи; в
противном случае функция возвращает FALSE .
Комментарии
Функция _CrtIsMemoryBlock проверяет, находится ли указанный блок памяти в
локальной куче и имеет ли он допустимый идентификатор типа блока. Эту
функцию можно также использовать для получения порядкового номера
распределения объекта, а также имени или номера строки исходного файла,
содержащего исходный запрос на выделение блока памяти. NULL Если в параметре
, или lineNumber передается значение, не являющееся значением requestNumber ,
передаваемым в параметре _CrtIsMemoryBlock , filename то при обнаружении блока
в локальной куче для параметра устанавливается значение в отладочном заголовке
блока памяти. Если _DEBUG параметр не определен, вызовы удаляются
_CrtIsMemoryBlock во время предварительной обработки.

В случае _CrtIsMemoryBlock сбоя он возвращает FALSE , а выходные параметры


инициализируются значениями по умолчанию: requestNumber и lineNumber имеют
значение 0 и filename имеют значение NULL .

Так как эта функция возвращает TRUE или FALSE , ее можно передать в один из
_ASSERT макросов, чтобы создать базовый механизм обработки ошибок отладки.
Следующий пример вызывает сбой утверждения, если указанный адрес не
находится в локальной куче:

_ASSERTE( _CrtIsMemoryBlock( userData, size, &requestNumber,

&filename, &linenumber ) );

Дополнительные сведения о том, как _CrtIsMemoryBlock можно использовать с


другими функциями отладки и макросами, см. в разделе Макросы для создания
отчетов. Сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtIsMemoryBlock <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
См. пример для статьи _CrtIsValidHeapPointer .

См. также раздел


Подпрограммы отладки
_CrtIsValidHeapPointer
Статья • 03.04.2023

Проверяет, находится ли заданный указатель в куче, выделенной определенной


библиотекой среды выполнения C, но не обязательно библиотекой CRT
вызывающей функции. В версиях CRT до Visual Studio 2010 эта функция проверяет,
находится ли указанный указатель в локальной куче (только для отладочной
версии).

Синтаксис
C

int _CrtIsValidHeapPointer(

const void *userData


);

Параметры
userData

Указатель на начало выделенного блока памяти.

Возвращаемое значение
_CrtIsValidHeapPointer возвращает значение TRUE , если указанный указатель

находится в куче, совместно используемой всеми экземплярами библиотеки CRT. В


версиях CRT до Visual Studio 2010 эта функция возвращает TRUE значение , если
указанный указатель находится в локальной куче. В противном случае функция
возвращает значение FALSE .

Комментарии
Мы не рекомендуем использовать эту функцию. Начиная с библиотеки CRT в Visual
Studio 2010, все библиотеки CRT используют одну и ту же кучу операционной
системы — кучу процесса. Функция _CrtIsValidHeapPointer сообщает, выделен ли
указатель в кучу CRT, но не указывает, был ли он выделен библиотекой CRT
вызывающей функции. Возьмем для примера блок, выделенный с помощью
библиотеки CRT в составе Visual Studio 2010. Если функция, _CrtIsValidHeapPointer
экспортируемая в visual Studio 2012 библиотеки CRT, проверяет указатель, она
возвращает . TRUE Этот тест больше не полезен. В версиях библиотеки CRT до Visual
Studio 2010 эта функция используется для проверки наличия того или иного адреса
памяти в локальной куче. Локальная куча обращается к куче, созданной и
управляемой определенным экземпляром библиотеки среды выполнения C. Если
библиотека динамической компоновки (DLL) содержит статическую ссылку на
библиотеку среды выполнения, она имеет свой собственный экземпляр кучи среды
выполнения, а значит и собственную кучу, не зависящую от локальной кучи
приложения. Если _DEBUG параметр не определен, вызовы удаляются
_CrtIsValidHeapPointer во время предварительной обработки.

Так как эта функция возвращает TRUE или FALSE , ее можно передать в один из
_ASSERT макросов, чтобы создать базовый механизм обработки ошибок отладки.
Следующий пример вызывает сбой утверждения, если указанный адрес не
находится в локальной куче:

_ASSERTE( _CrtIsValidHeapPointer( userData ) );

Дополнительные сведения о том, как _CrtIsValidHeapPointer можно использовать с


другими функциями отладки и макросами, см. в разделе Макросы для создания
отчетов. Сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtIsValidHeapPointer <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
В следующем примере показано, как проверить, является ли память допустимой
при использовании с библиотеками времени выполнения C до Visual Studio 2010.
Пример приведен для пользователей предыдущих версий библиотеки кодов CRT.

// crt_isvalid.c

// This program allocates a block of memory using _malloc_dbg

// and then tests the validity of this memory by calling

// _CrtIsMemoryBlock,_CrtIsValidPointer, and _CrtIsValidHeapPointer.

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <crtdbg.h>

#define TRUE 1

#define FALSE 0

int main( void )

char *my_pointer;

// Call _malloc_dbg to include the filename and line number

// of our allocation request in the header information

my_pointer = (char *)_malloc_dbg( sizeof(char) * 10,

_NORMAL_BLOCK, __FILE__, __LINE__ );

// Ensure that the memory got allocated correctly

_CrtIsMemoryBlock((const void *)my_pointer, sizeof(char) * 10,

NULL, NULL, NULL );

// Test for read/write accessibility

if (_CrtIsValidPointer((const void *)my_pointer,

sizeof(char) * 10, TRUE))

printf("my_pointer has read and write accessibility.\n");

else

printf("my_pointer only has read access.\n");

// Make sure my_pointer is within the local heap

if (_CrtIsValidHeapPointer((const void *)my_pointer))

printf("my_pointer is within the local heap.\n");

else

printf("my_pointer is not located within the local"

" heap.\n");

free(my_pointer);

Output
my_pointer has read and write accessibility.

my_pointer is within the local heap.

См. также раздел


Подпрограммы отладки
_CrtIsValidPointer
Статья • 03.04.2023

Проверяет, что указатель не имеет значение NULL. В версиях библиотеки времени


выполнения языка C, выпущенных до выхода Visual Studio 2010, проверяет,
является ли указанный диапазон памяти допустимым для чтения и записи (только
отладочная версия).

Синтаксис
C

int _CrtIsValidPointer(

const void *address,


unsigned int size,

int access

);

Параметры
address

Указывает начало диапазона памяти для проверки.

size

Размер указанного диапазона памяти (в байтах).

access

Доступ на чтение или запись для определения диапазона памяти.

Возвращаемое значение
_CrtIsValidPointer возвращает значение TRUE , если указанный указатель не равен
NULL. В версиях библиотекИ CRT до Visual Studio 2010 возвращает значение TRUE ,
если диапазон памяти действителен для указанной операции или операций. В
противном случае функция возвращает значение FALSE .

Комментарии
В библиотеке CRT в Visual Studio 2010 и более поздних версиях size параметры и
access игнорируются и _CrtIsValidPointer проверяются только на то, что
указанный address объект не имеет значения NULL. Так как этот тест легко
выполнить самостоятельно, мы не рекомендуем использовать эту функцию. В
версиях, выпущенных до выхода Visual Studio 2010, эта функция проверяет
допустимость диапазона памяти, начинающегося по адресу address и
занимающего заданное параметром size количество байт, для указанной
операции или операций доступа. Если access задано значение TRUE , диапазон
памяти проверяется как для чтения, так и для записи. Если access имеет значение
FALSE , диапазон памяти проверяется только для чтения. Если _DEBUG параметр не

определен, вызовы удаляются _CrtIsValidPointer во время предварительной


обработки.

Так как эта функция возвращает TRUE или FALSE , ее можно передать в один из
_ASSERT макросов, чтобы создать базовый механизм обработки ошибок отладки.
Следующий пример вызывает сбой утверждения, если диапазон памяти
недопустим для операций чтения и записи:

_ASSERTE( _CrtIsValidPointer( address, size, TRUE ) );

Дополнительные сведения о том, как _CrtIsValidPointer можно использовать с


другими функциями отладки и макросами, см. в разделе Макросы для создания
отчетов. Сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtIsValidPointer <crtdbg.h>

_CrtIsValidPointer является расширением Майкрософт. Сведения о совместимости

см. в разделе Совместимость.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.
Пример
См. пример для статьи _CrtIsValidHeapPointer .

См. также раздел


Подпрограммы отладки
_CrtMemCheckpoint
Статья • 03.04.2023

Получает текущее состояние отладочной кучи и сохраняет его в предоставленной


приложением структуре _CrtMemState (только отладочная версия).

Синтаксис
C

void _CrtMemCheckpoint(

_CrtMemState *state

);

Параметры
state

Указатель на структуру _CrtMemState для заполнения контрольными точками


памяти.

Комментарии
Функция _CrtMemCheckpoint создает моментальный снимок текущего состояния
отладочной кучи в любой данный момент. Этот моментальный снимок может
использоваться другими функциями состояния кучи, _CrtMemDifference например
для обнаружения утечек памяти и других проблем. Если _DEBUG параметр не
определен, вызовы удаляются _CrtMemState во время предварительной обработки.

Приложение должно передать указатель в выделенный ранее экземпляр структуры


_CrtMemState , определенный в файле Crtdbg.h в параметре state . Если при

создании контрольной точки возникает ошибка _CrtMemCheckpoint , функция


создает отчет об отладке _CRT_WARN , описывающий проблему.

Дополнительные сведения о функциях состояния кучи и структуре см. в


_CrtMemState разделе Функции отчетов о состоянии кучи. Дополнительные
сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Если state имеет значение NULL , вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение
разрешено продолжать, errnoдля , _doserrno, _sys_errlistи _sys_nerr задано значение
EINVAL , а функция возвращает значение .

Требования
Подпрограмма Обязательный заголовок

_CrtMemCheckpoint <crtdbg.h>, <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: только отладочные версии UCRT.

См. также раздел


Подпрограммы отладки

_CrtMemDifference
_CrtMemDifference
Статья • 03.04.2023

Сравнивает два состояния памяти и возвращает их различия (только отладочная


версия).

Синтаксис
C

int _CrtMemDifference(

_CrtMemState *stateDiff,

const _CrtMemState *oldState,

const _CrtMemState *newState

);

Параметры
stateDiff

Указатель на структуру _CrtMemState , которая используется для хранения различий


между двумя (возвращенными) состояниями памяти.

oldState

Указатель на более раннее состояние памяти (структура _CrtMemState ).

newState

Указатель на более позднее состояние памяти (структура _CrtMemState ).

Возвращаемое значение
Если разница в состояниях памяти значительна, _CrtMemDifference возвращает
. TRUE В противном случае функция возвращает значение FALSE .

Комментарии
Функция _CrtMemDifference сравнивает oldState и newState сохраняет их различия
в stateDiff , которые затем могут использоваться приложением для обнаружения
утечек памяти и других проблем с памятью. Если _DEBUG параметр не определен,
вызовы удаляются _CrtMemDifference во время предварительной обработки.
newState и oldState должны быть допустимым указателем на структуру,

определенную _CrtMemState в crtdbg.h , которая _CrtMemCheckpoint заполнила до


вызова _CrtMemDifference . Значение stateDiff должно быть указателем на ранее
выделенный экземпляр структуры _CrtMemState . Если stateDiff параметр ,
newState или oldState имеет значение NULL , вызывается обработчик недопустимых

параметров, как описано в разделе Проверка параметров. Если выполнение


разрешено для продолжения, errnoдля , _doserrno, _sys_errlistи _sys_nerr задано
значение EINVAL и функция возвращает FALSE значение .

_CrtMemDifference сравнивает _CrtMemState значения полей блоков в oldState с


значениями в и newState сохраняет результат в stateDiff . Если количество типов
выделенных блоков или общее количество выделенных блоков для каждого типа
отличается между двумя состояниями памяти, разница в состояниях считается
значительной. Также в stateDiff сохраняются разница между максимальными
объемами, выделенными когда-либо за раз для двух состояний, и разница между
общим числом выделенных блоков для двух состояний.

По умолчанию внутренние блоки времени выполнения C ( _CRT_BLOCK ) не


включаются в операции с состоянием памяти. Функцию _CrtSetDbgFlag можно
использовать для включения _CRTDBG_CHECK_CRT_DF бита для _crtDbgFlag включения
этих блоков в операции обнаружения утечек и других операций с состоянием
памяти. Освобожденные блоки памяти ( _FREE_BLOCK ) не приводят к возврату
TRUE _CrtMemDifference .

Дополнительные сведения о функциях состояния кучи и структуре см. в


_CrtMemState разделе Функции отчетов о состоянии кучи. Сведения о выделении,

инициализации и управлении блоками памяти в отладочной версии базовой кучи


см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_CrtMemDifference <crtdbg.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Отладка версий только библиотек среды выполнения C .

См. также раздел


Подпрограммы отладки

_crtDbgFlag\
_CrtMemDumpAllObjectsSince
Статья • 03.04.2023

Записывает в дамп сведения об объектах в куче с начала выполнения программы


или перехода в указанное состояние кучи (только в отладочной версии).

Синтаксис
C

void _CrtMemDumpAllObjectsSince(

const _CrtMemState *state

);

Параметры
state

Указатель на состояние кучи для начала дампа или NULL .

Комментарии
Функция _CrtMemDumpAllObjectsSince помещает в дамп данные заголовка отладки
для выделенных в куче объектов в понятной пользователю форме. Данные дампа
могут использоваться приложением для отслеживания операций выделения
памяти и выявления проблем с памятью. Если _DEBUG параметр не определен,
вызовы удаляются _CrtMemDumpAllObjectsSince во время предварительной
обработки.

_CrtMemDumpAllObjectsSince использует значение параметра state для определения


места, с которого должна начинаться операция дампа. Чтобы начать дамп из
указанного состояния кучи, state параметр должен быть указателем на структуру
_CrtMemState , которая была заполнена _CrtMemCheckpoint до
_CrtMemDumpAllObjectsSince вызова . Если state имеет значение NULL , функция

начинает дамп с начала выполнения программы.

Если приложение установило функцию обработчика дампа путем вызова


_CrtSetDumpClient, то при каждом _CrtMemDumpAllObjectsSince дампе сведений о
_CLIENT_BLOCK типе блока оно также вызывает предоставленную приложением
функцию дампа. По умолчанию внутренние блоки времени выполнения C
( _CRT_BLOCK ) не включаются в операции дампа памяти. Функция _CrtSetDbgFlag
может использоваться для включения бита _CRTDBG_CHECK_CRT_DF для _crtDbgFlag
включения этих блоков. Кроме того, блоки, помеченные как освобожденные или
игнорируемые ( _FREE_BLOCK , _IGNORE_BLOCK ), не включаются в дамп памяти.

Дополнительные сведения о функциях состояния кучи и структуре см. в


_CrtMemState разделе Функции отчетов о состоянии кучи. Дополнительные

сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtMemDumpAll-ObjectsSince <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
Пример использования _CrtMemDumpAllObjectsSince см. в разделе crt_dbg2 .

См. также раздел


Подпрограммы отладки

_crtDbgFlag
_CrtMemDumpStatistics
Статья • 03.04.2023

Помещает в дамп данные заголовка отладки для указанного состояния кучи в


понятной пользователю форме (только отладочная версия).

Синтаксис
C

void _CrtMemDumpStatistics(

const _CrtMemState *state

);

Параметры
state

Указатель на состояние кучи для создания дампа.

Комментарии
Функция _CrtMemDumpStatistics помещает в дамп данные заголовка отладки для
указанного состояния кучи в понятной пользователю форме. Статистика дампа
может использоваться приложением для отслеживания операций выделения
памяти и выявления проблем с памятью. Состояние памяти может содержать
состояние определенной кучи или разницу между двумя состояниями. Если
_DEBUG параметр не определен, вызовы удаляются _CrtMemDumpStatistics во время
предварительной обработки.

Параметр state должен быть указателем на структуру _CrtMemState , которая была


заполнена _CrtMemCheckpoint или возвращена _CrtMemDifference до
_CrtMemDumpStatistics вызова . Если state имеет значение NULL , вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение разрешено для продолжения, errno устанавливается
значение EINVAL и никаких действий не выполняется. Дополнительные сведения см.
в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Дополнительные сведения о функциях состояния кучи и структуре см. в


_CrtMemState разделе Функции отчетов о состоянии кучи. Дополнительные
сведения о выделении, инициализации и управлении блоками памяти в
отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок Необязательные заголовки

_CrtMemDumpStatistics <crtdbg.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Отладочные версии только библиотек среды выполнения C .

См. также раздел


Подпрограммы отладки\
_CrtReportBlockType
Статья • 03.04.2023

Возвращает тип и подтип блока, связанные с указателем блока заданной


отладочной кучи.

Синтаксис
C

int _CrtReportBlockType(

const void * pBlock

};

Параметры
pBlock

Указатель на допустимый блок отладочной кучи.

Возвращаемое значение
При передаче допустимого указателя отладочной кучи функция
_CrtReportBlockType возвращает тип и подтип блока в форме int . При передаче
недопустимого указателя функция возвращает значение -1.

Комментарии
Чтобы извлечь тип и подтип, возвращаемые _CrtReportBlockType , используйте
макросы _BLOCK_TYPE и _BLOCK_SUBTYPE (как определенные в Crtdbg.h) в
возвращаемом значении.

Сведения о типах блоков выделения и их использовании см. в разделе Типы


блоков в отладочной куче.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_CrtReportBlockType <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C++

// crt_crtreportblocktype.cpp

// compile with: /MDd

#include <malloc.h>

#include <stdio.h>

#include <crtdbg.h>

void __cdecl Dumper(void *ptr, void *)

int block = _CrtReportBlockType(ptr);

_RPT3(_CRT_WARN, "Dumper found block at %p: type %d, subtype %d\n", ptr,

_BLOCK_TYPE(block), _BLOCK_SUBTYPE(block));

void __cdecl LeakDumper(void *ptr, size_t sz)

int block = _CrtReportBlockType(ptr);

_RPT4(_CRT_WARN, "LeakDumper found block at %p:"

" type %d, subtype %d, size %d\n", ptr,

_BLOCK_TYPE(block), _BLOCK_SUBTYPE(block), sz);

int main(void)

_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) |

_CRTDBG_LEAK_CHECK_DF);

_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );

_CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );

_malloc_dbg(10, _NORMAL_BLOCK , __FILE__, __LINE__);

_malloc_dbg(10, _CLIENT_BLOCK | (1 << 16), __FILE__, __LINE__);

_malloc_dbg(20, _CLIENT_BLOCK | (2 << 16), __FILE__, __LINE__);

_malloc_dbg(30, _CLIENT_BLOCK | (3 << 16), __FILE__, __LINE__);

_CrtDoForAllClientObjects(Dumper, NULL);

_CrtSetDumpClient(LeakDumper);

Пример полученных результатов


Output

Dumper found block at 00314F78: type 4, subtype 3

Dumper found block at 00314F38: type 4, subtype 2

Dumper found block at 00314F00: type 4, subtype 1

Detected memory leaks!

Dumping objects ->

crt_crtreportblocktype.cpp(30) : {55} client block at 0x00314F78, subtype 3,


30 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

crt_crtreportblocktype.cpp(29) : {54} client block at 0x00314F38, subtype 2,


20 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

crt_crtreportblocktype.cpp(28) : {53} client block at 0x00314F00, subtype 1,


10 bytes long.

Data: < > CD CD CD CD CD CD CD CD CD CD

crt_crtreportblocktype.cpp(27) : {52} normal block at 0x00314EC8, 10 bytes


long.

Data: < > CD CD CD CD CD CD CD CD CD CD

Object dump complete.

См. также раздел


_CrtDoForAllClientObjects

_CrtSetDumpClient

_CrtMemDumpAllObjectsSince

_CrtDumpMemoryLeaks
_CrtSetAllocHook
Статья • 03.04.2023

Устанавливает определяемую клиентом функцию выделения памяти путем ее


прикрепления к отладочному процессу выделения памяти среды выполнения
языка C (только отладочная версия).

Синтаксис
C

_CRT_ALLOC_HOOK _CrtSetAllocHook(
_CRT_ALLOC_HOOK allocHook

);

Параметры
allocHook

Новая, определенная клиентом функция выделения памяти, которую требуется


прикрепить к отладочному процессу выделения памяти среды выполнения C.

Возвращаемое значение
Возвращает ранее определенную функцию-обработчик выделения памяти или
значение NULL , если параметр allocHook имеет значение NULL .

Комментарии
Функция _CrtSetAllocHook позволяет приложению прикрепить свою собственную
функцию выделения памяти к процессу выделения памяти в отладочной
библиотеке среды выполнения C. В результате каждый вызов функции отладочного
выделения памяти для выделения, перераспределения или освобождения блока
памяти запускает вызов функции-обработчика приложения. Функция
_CrtSetAllocHook предоставляет приложению простой метод проверки того, как

приложение обрабатывает ситуации недостатка памяти, возможность проверять


шаблоны выделения памяти и возможность записывать в журнал данные
выделения памяти для дальнейшего анализа. Если _DEBUG параметр не определен,
вызовы удаляются _CrtSetAllocHook во время предварительной обработки.
Функция _CrtSetAllocHook устанавливает новую определенную клиентом функцию
выделения памяти, указанную в параметре allocHook , и возвращает ранее
определенную функцию-обработчик. В следующем примере показано, как должен
объявляться прототип определяемого клиентом обработчика выделения памяти:

int YourAllocHook( int allocType, void *userData, size_t size,

int blockType, long requestNumber,

const unsigned char *filename, int lineNumber);

Аргумент allocType указывает тип операции выделения ( _HOOK_ALLOC ,


_HOOK_REALLOC и _HOOK_FREE ), которая активирует вызов функции-перехватчика

выделения. Если запускающим типом выделения памяти является _HOOK_FREE ,


параметр userData представляет собой указатель на раздел пользовательских
данных блока памяти, который должен быть освобожден. Однако если триггерным
типом выделения является _HOOK_ALLOC или _HOOK_REALLOC , это связано NULL с тем,
userData что блок памяти еще не выделен.

Параметр size определяет размер блока памяти в байтах, параметр blockType


указывает тип блока памяти, параметр requestNumber является порядковым
номером объекта выделения блока памяти, и, если доступны, параметры filename
и lineNumber указывают исходное имя файла и номер строки, где был запущен
процесс выделения.

После обработки функция-обработчик должна возвращать логическое значение,


которое указывает главному процессу выделения памяти среды выполнения C, как
продолжить выполнение. Если функция-перехватчик хочет, чтобы основной
процесс выделения продолжался так, как если бы функция-перехватчик никогда не
вызывалась, функция-перехватчик должна возвращать TRUE , что приводит к
выполнению исходной операции выделения. Функция-перехватчик может
собирать и сохранять сведения о выделении для последующего анализа, не мешая
текущей операции выделения или состоянию отладочной кучи.

Если функция-обработчик требует, чтобы главный процесс выделения продолжал


выполнение, как если бы операция выделения памяти была запущена и
завершилась неудачей, функция-обработчик должна возвращать значение FALSE .
Функция-перехватчик может имитировать широкий спектр условий памяти и
отладить состояния кучи, чтобы проверить, как приложение обрабатывает каждую
ситуацию.
Чтобы удалить функцию-обработчик, передайте значение NULL в функцию
_CrtSetAllocHook .

Дополнительные сведения о том, как _CrtSetAllocHook можно использовать с


другими функциями управления памятью или как создавать собственные функции-
перехватчики, определяемые клиентом, см. в разделе Написание функции
перехватчика отладки.

7 Примечание

_CrtSetAllocHook не поддерживается в /clr:pure. Параметры компилятора

/clr:pure и /clr:safe являются устаревшими в Visual Studio 2015 и удалены в


Visual Studio 2017.

Требования
Подпрограмма Обязательный заголовок

_CrtSetAllocHook <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
Пример использования _CrtSetAllocHook см. в разделе crt_dbg2 .

См. также раздел


Подпрограммы отладки

_CrtGetAllocHook
_CrtSetBreakAlloc
Статья • 03.04.2023

Задает точку останова для указанного порядкового номера выделения объекта


(только отладочная версия).

Синтаксис
C

long _CrtSetBreakAlloc(

long lBreakAlloc

);

Параметры
lBreakAlloc

Порядковый номер выделения, для которого задается точка останова.

Возвращаемое значение
Возвращает предыдущий порядковый номер выделения объекта, для которого
задана точка останова.

Комментарии
_CrtSetBreakAlloc позволяет приложению выполнять обнаружение утечки памяти

путем останова в определенной точке выделения памяти и обратной трассировки


до источника запроса. Функция использует последовательный порядковый номер
выделения объекта, назначенный блоку памяти во время выделения в куче. Если
_DEBUG параметр не определен, вызовы удаляются _CrtSetBreakAlloc во время
предварительной обработки.

Порядковый номер размещения объекта хранится в lRequest поле


_CrtMemBlockHeader структуры, определенном в Crtdbg.h. Когда сведения о блоке

памяти передаются одной из функций дампа отладки, это число заключено в


фигурные скобки, например {36}.
Дополнительные сведения о том, как _CrtSetBreakAlloc можно использовать с
другими функциями управления памятью, см. в разделе Отслеживание запросов на
выделение кучи. Дополнительные сведения о выделении, инициализации и
управлении блоками памяти в отладочной версии базовой кучи см. в разделе
Сведения об отладочной куче CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtSetBreakAlloc <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C

// crt_setbrkal.c

// compile with: -D_DEBUG /MTd -Od -Zi -W3 /c /link -verbose:lib -debug

/*

* In this program, a call is made to the _CrtSetBreakAlloc routine

* to verify that the debugger halts program execution when it reaches

* a specified allocation number.

*/

#include <malloc.h>

#include <crtdbg.h>

int main( )

long allocReqNum;

char *my_pointer;

/*

* Allocate "my_pointer" for the first

* time and ensure that it gets allocated correctly

*/

my_pointer = malloc(10);

_CrtIsMemoryBlock(my_pointer, 10, &allocReqNum, NULL, NULL);

/*

* Set a breakpoint on the allocation request

* number for "my_pointer"

*/

_CrtSetBreakAlloc(allocReqNum+2);

/*

* Alternate freeing and reallocating "my_pointer"

* to verify that the debugger halts program execution

* when it reaches the allocation request

*/

free(my_pointer);

my_pointer = malloc(10);

free(my_pointer);

my_pointer = malloc(10);

free(my_pointer);

См. также раздел


Подпрограммы отладки\
_CrtSetDbgFlag
Статья • 03.04.2023

Извлекает или изменяет состояние флага _crtDbgFlag для управления поведением


распределения диспетчера отладочной кучи (только для отладочной версии).

Синтаксис
C

int _CrtSetDbgFlag(

int newFlag

);

Параметры
newFlag

Новое состояние для _crtDbgFlag .

Возвращаемое значение
Возвращает предыдущее состояние _crtDbgFlag .

Комментарии
Функция _CrtSetDbgFlag позволяет приложению управлять тем, как диспетчер
отладочной кучи отслеживает выделение памяти, изменяя битовые поля флага
_crtDbgFlag . Задавая битовые поля, приложение может указать диспетчеру
отладочной кучи выполнять специальные операции отладки. Существует несколько
возможных операций:

Проверка на наличие утечек памяти при выходе из приложения и создание


отчетов об обнаружении.
Имитируя условия нехватки памяти, указывая, что освобожденные блоки
памяти должны оставаться в связанном списке кучи.
Проверка целостности кучи путем проверки каждого блока памяти при
каждом запросе на выделение.
Если _DEBUG параметр не определен, вызовы удаляются _CrtSetDbgFlag во время
предварительной обработки.

В следующей таблице перечислены битовые поля для _crtDbgFlag и описано их


поведение. Так как установка битов приводит к увеличению диагностических
выходных данных и снижению скорости выполнения программы, эти биты не
задаются (отключают) по умолчанию. Дополнительные сведения об этих битовом
поле см. в разделе Функции отчетов о состоянии кучи.

Битовое поле Значение Описание


по
умолчанию

_CRTDBG_ALLOC_MEM_DF ON ON: включение выделения памяти отладочной


кучи и использование идентификаторов типов
блоков памяти, таких как _CLIENT_BLOCK . OFF:
добавьте новые выделения в связанный список
кучи, но присвойте типу блока значение
_IGNORE_BLOCK .

Может также быть совмещено с любыми


макросами частоты проверки кучи.

_CRTDBG_CHECK_ALWAYS_DF OFF ON: вызов при _CrtCheckMemory каждом запросе


на выделение и освобождение. OFF:
_CrtCheckMemory необходимо вызывать явно.

Макросы частоты проверки кучи не действуют,


если задан этот флаг.

_CRTDBG_CHECK_CRT_DF OFF ON: включение типов _CRT_BLOCK в операции


обнаружения утечек и разницы состояния
памяти. OFF: память, используемая внутренне
библиотекой времени выполнения, игнорируется
этими операциями.

Может также быть совмещено с любыми


макросами частоты проверки кучи.

_CRTDBG_DELAY_FREE_MEM_DF OFF ON: храните свободные блоки памяти в списке


связанных кучи, назначьте им _FREE_BLOCK тип и
заполните их значением байтов 0xDD. OFF: не
храните освобожденные блоки в связанном
списке кучи.

Может также быть совмещено с любыми


макросами частоты проверки кучи.
Битовое поле Значение Описание
по
умолчанию

_CRTDBG_LEAK_CHECK_DF OFF ON. Выполните автоматическую проверку утечки


при выходе из программы с помощью вызова
_CrtDumpMemoryLeaks и создайте отчет об
ошибках, если приложению не удалось
освободить всю выделенную память. OFF: не
выполняйте автоматическую проверку утечки
при выходе из программы.

Может также быть совмещено с любыми


макросами частоты проверки кучи.

Макросы частоты проверки кучи

Вы можете указать, как часто библиотека времени выполнения C выполняет


проверку отладочной кучи ( _CrtCheckMemory ) на основе количества вызовов ,
malloc realloc , free и _msize .

Затем _CrtSetDbgFlag проверяет верхние 16 бит параметра newFlag , чтобы


получить значение. Указанное значение — это количество вызовов malloc ,
realloc , free и _msize между _CrtCheckMemory вызовами. Для этой цели
предоставляется четыре готовых макроса.

Макрос Количество вызовов malloc , realloc , free и _msize между


вызовами _CrtCheckMemory

_CRTDBG_CHECK_EVERY_16_DF 16

_CRTDBG_CHECK_EVERY_128_DF 128

_CRTDBG_CHECK_EVERY_1024_DF 1024

_CRTDBG_CHECK_DEFAULT_DF 0 (по умолчанию проверки кучи не выполняются)

По умолчанию _CrtCheckMemory не вызывается во время операций с памятью. Это


можно изменить, отправив указанные выше флаги в _CrtSetDbgFlag().

Например, можно указать проверку кучи каждые 16 malloc операций , realloc , ,


free и _msize с помощью следующего кода:

#include <crtdbg.h>

int main( )

int tmp;

// Get the current bits

tmp = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

// Clear the upper 16 bits and OR in the desired frequency

tmp = (tmp & 0x0000FFFF) | _CRTDBG_CHECK_EVERY_16_DF;

// Set the new bits

_CrtSetDbgFlag(tmp);

При указании newFlag параметра верхние 16 бит игнорируются


_CRTDBG_CHECK_ALWAYS_DF . В этом случае вызывается каждый раз при

_CrtCheckMemory вызове malloc , realloc , free и _msize .

newFlag — это новое состояние для применения к , _crtDbgFlag а — сочетание


значений для каждого битового поля.

Изменение одного или более битовых полей и


создание нового состояния флага
1. Вызовите _CrtSetDbgFlag со newFlag значением , _CRTDBG_REPORT_FLAG чтобы
получить текущее _crtDbgFlag состояние и сохранить возвращаемое значение
во временной переменной.

2. Включите любые биты на побитовом "или" ( | ) временной переменной с


соответствующими битовыми масками (представленными в коде приложения
константами манифеста).

3. Отключите другие биты с побитовой переменной "и" ( & ) с побитовой "not"


( ~ ) для соответствующих битовых масок.

4. Вызовите _CrtSetDbgFlag со newFlag значением, хранящимся во временной


переменной, чтобы задать новое состояние для _crtDbgFlag .

Следующий пример кода демонстрирует моделирование условий недостатка


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

// Get the current state of the flag

// and store it in a temporary variable

int tmpFlag = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG );

// Turn On (OR) - Keep freed memory blocks in the

// heap's linked list and mark them as freed

tmpFlag |= _CRTDBG_DELAY_FREE_MEM_DF;

// Turn Off (AND) - prevent _CrtCheckMemory from

// being called at every allocation request

tmpFlag &= ~_CRTDBG_CHECK_ALWAYS_DF;

// Set the new state for the flag


_CrtSetDbgFlag( tmpFlag );

Общие сведения об управлении памятью и отладочной куче см. в разделе


Сведения об отладочной куче CRT.

Чтобы отключить флаг с _CrtSetDbgFlag помощью функции, используйте побитовое


"и" ( & ) переменной с побитовой "not" ( ~ ) битовой маски.

Если newFlag не является допустимым значением, эта функция вызывает


обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, эта функция задает для
errno значение EINVAL и возвращает предыдущее состояние _crtDbgFlag .

Требования
Подпрограмма Обязательный заголовок

_CrtSetDbgFlag <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C

// crt_crtsetdflag.c

// compile with: /c -D_DEBUG /MTd -Od -Zi -W3 /link -verbose:lib /debug

// This program concentrates on allocating and freeing memory

// blocks to test the functionality of the _crtDbgFlag flag.

#include <string.h>

#include <malloc.h>

#include <crtdbg.h>

int main( )

char *p1, *p2;

int tmpDbgFlag;

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );

_CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR );

// Set the debug-heap flag to keep freed blocks in the

// heap's linked list - This will allow us to catch any

// inadvertent use of freed memory

tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF;

tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF;

_CrtSetDbgFlag(tmpDbgFlag);

// Allocate 2 memory blocks and store a string in each

p1 = malloc( 34 );

p2 = malloc( 38 );

strcpy_s( p1, 34, "p1 points to a Normal allocation block" );

strcpy_s( p2, 38, "p2 points to a Client allocation block" );

// Free both memory blocks

free( p2 );

free( p1 );

// Set the debug-heap flag to no longer keep freed blocks in the

// heap's linked list and turn on Debug type allocations (CLIENT)

tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);

tmpDbgFlag |= _CRTDBG_ALLOC_MEM_DF;

tmpDbgFlag &= ~_CRTDBG_DELAY_FREE_MEM_DF;

_CrtSetDbgFlag(tmpDbgFlag);

// Explicitly call _malloc_dbg to obtain the filename and

// line number of our allocation request and also so we can

// allocate CLIENT type blocks specifically for tracking

p1 = _malloc_dbg( 40, _NORMAL_BLOCK, __FILE__, __LINE__ );

p2 = _malloc_dbg( 40, _CLIENT_BLOCK, __FILE__, __LINE__ );

strcpy_s( p1, 40, "p1 points to a Normal allocation block" );

strcpy_s( p2, 40, "p2 points to a Client allocation block" );

// _free_dbg must be called to free the CLIENT block

_free_dbg( p2, _CLIENT_BLOCK );

free( p1 );

// Allocate p1 again and then exit - this will leave unfreed

// memory on the heap

p1 = malloc( 10 );

См. также раздел


Подпрограммы отладки

_crtDbgFlag

_CrtCheckMemory
_CrtSetDebugFillThreshold
Статья • 03.04.2023

Извлекает или изменяет поведение, управляющее порогом заполнения буфера в


функциях отладки.

Синтаксис
C

size_t _CrtSetDebugFillThreshold( size_t newThreshold );

Параметры
newThreshold

Новый размер порогового значения в байтах.

Возвращаемое значение
Предыдущее пороговое значение.

Комментарии
Отладочные версии некоторых функций CRT с повышенным уровнем безопасности
заполняют буфер, переданный им специальным символом (0xFE). Этот символ
заливки помогает найти случаи, когда в функцию был передан неправильный
размер. К сожалению, это также снижает производительность. Чтобы повысить
производительность, используйте для _CrtSetDebugFillThreshold отключения
заполнения буферов для буферов, превышающих newThreshold пороговое
значение. Значение newThreshold 0 отключает его для всех буферов.

Пороговое значение по умолчанию — SIZE_T_MAX .

Ниже приведен список затронутых функций.

asctime_s, _wasctime_s

_cgets_s, _cgetws_s
ctime_s, _ctime32_s, _ctime64_s, _wctime_s, _wctime32_s, _wctime64_s

_ecvt_s

_fcvt_s

_gcvt_s

_itoa_s, _ltoa_s, _ultoa_s, _i64toa_s, _ui64toa_s, _itow_s, _ltow_s, _ultow_s, _i64tow_s,


_ui64tow_s

_makepath_s, _wmakepath_s

_mbsnbcat_s, _mbsnbcat_s_l

_mbsnbcpy_s, _mbsnbcpy_s_l

_mbsnbset_s, _mbsnbset_s_l

_mktemp_s, _wmktemp_s

_splitpath_s, _wsplitpath_s

strcat_s, wcscat_s, _mbscat_s

strcpy_s, wcscpy_s, _mbscpy_s

_strdate_s, _wstrdate_s

strerror_s, _strerror_s, _wcserror_s, __wcserror_s

_strlwr_s, _strlwr_s_l, _mbslwr_s, _mbslwr_s_l, _wcslwr_s, _wcslwr_s_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

_strnset_s, _strnset_s_l, _wcsnset_s, _wcsnset_s_l, _mbsnset_s, _mbsnset_s_l

_strset_s, _strset_s_l, _wcsset_s, _wcsset_s_l, _mbsset_s, _mbsset_s_l

_strtime_s, _wstrtime_s

_strupr_s, _strupr_s_l, _mbsupr_s, _mbsupr_s_l, _wcsupr_s, _wcsupr_s_l

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_CrtSetDebugFillThreshold <crtdbg.h>

Эта функция зависит от Корпорации Майкрософт. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Библиотеки
Отладка только версий библиотек времени выполнения C .

Пример
C

// crt_crtsetdebugfillthreshold.c
// compile with: cl /MTd crt_crtsetdebugfillthreshold.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <crtdbg.h>

void Clear( char buff[], size_t size )

for( int i=0; i<size; ++i )

buff[i] = 0;

void Print( char buff[], size_t size )

for( int i=0; i<size; ++i )

printf( "%02x %c\n", (unsigned char)buff[i], buff[i] );

int main( void )

char buff[10];

printf( "With buffer-filling on:\n" );

strcpy_s( buff, _countof(buff), "howdy" );

Print( buff, _countof(buff) );

_CrtSetDebugFillThreshold( 0 );

printf( "With buffer-filling off:\n" );

Clear( buff, _countof(buff) );


strcpy_s( buff, _countof(buff), "howdy" );

Print( buff, _countof(buff) );


}

Output

With buffer-filling on:

68 h

6f o

77 w

64 d

79 y

00

fe ■

fe ■

fe ■

fe ■

With buffer-filling off:

68 h

6f o

77 w

64 d

79 y

00

00

00

00

00

См. также раздел


Подпрограммы отладки
_CrtSetDumpClient
Статья • 03.04.2023

Устанавливает определяемую приложением функцию для записи в дамп блоков


памяти типа _CLIENT_BLOCK (только в отладочной версии).

Синтаксис
C

_CRT_DUMP_CLIENT _CrtSetDumpClient( _CRT_DUMP_CLIENT dumpClient );

Параметры
dumpClient

Новая функция дампа памяти, определяемая клиентом, для подключения.

Возвращаемое значение
Возвращает определенную ранее функцию дампа клиентских блоков.

Комментарии
Функция _CrtSetDumpClient позволяет приложению подключить собственную
функцию для дампа объектов, хранящихся в _CLIENT_BLOCK блоках памяти. В
результате каждый раз, когда отладочная функция дампа, например
_CrtMemDumpAllObjectsSince или _CrtDumpMemoryLeaks дамп _CLIENT_BLOCK блока
памяти, также вызывается функция дампа приложения. _CrtSetDumpClient
предоставляет приложению простой способ для обнаружения утечек памяти и
проверки содержимого данных, хранящихся в блоках _CLIENT_BLOCK , либо создания
связанных с ними отчетов. Если _DEBUG параметр не определен, вызовы удаляются
_CrtSetDumpClient во время предварительной обработки.

Функция _CrtSetDumpClient устанавливает новую определенную приложением


функцию дампа, указанную в параметре dumpClient , и возвращает функцию дампа,
определенную ранее. Пример функции дампа клиентского блока выглядит
следующим образом:
C

void DumpClientFunction( void *userPortion, size_t blockSize );

Аргумент userPortion представляет собой указатель на начало части


пользовательских данных в блоке памяти, а blockSize определяет объем
выделяемого блока памяти в байтах. Функция дампа клиентского блока памяти
должна возвращать значение void . Указатель на функцию, который передается
_CrtSetDumpClient , имеет тип _CRT_DUMP_CLIENT , как определено в Crtdbg.h:

typedef void (__cdecl *_CRT_DUMP_CLIENT)( void *, size_t );

Дополнительные сведения о функциях, работающих с _CLIENT_BLOCK блоками


памяти типа, см. в разделе Функции перехватчика блоков клиента. Функция
_CrtReportBlockType может использоваться для возврата сведений о типах блоков и
подтипах.

Требования
Подпрограмма Обязательный заголовок

_CrtSetDumpClient <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки

_CrtReportBlockType

_CrtGetDumpClient
_CrtSetReportFile
Статья • 03.04.2023

После указания _CrtSetReportMode _CRTDBG_MODE_FILE можно указать дескриптор


файла для получения текста сообщения. _CrtSetReportFile также используется
_CrtDbgReportдля _CrtDbgReportW указания назначения текста (только отладочная
версия).

Синтаксис
C

_HFILE _CrtSetReportFile(

int reportType,

_HFILE reportFile

);

Параметры
reportType

Тип отчета: _CRT_WARN , _CRT_ERROR и _CRT_ASSERT .

reportFile

Новый файл отчета для reportType .

Возвращаемое значение
При успешном завершении функция _CrtSetReportFile возвращает предыдущий
файл отчета, заданный для типа отчета, который определяется параметром
reportType . Если передано reportType недопустимое значение, эта функция
вызывает обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение разрешено продолжать, errno задается значение
EINVAL и функция возвращает . _CRTDBG_HFILE_ERROR Дополнительные сведения см. в
разделе errno, а _doserrno_sys_errlistтакже ._sys_nerr

Комментарии
_CrtSetReportFile используется с функцией _CrtSetReportMode для определения

назначения или назначения для определенного типа отчета, созданного


. _CrtDbgReport При вызове _CrtSetReportMode _CRTDBG_MODE_FILE для назначения
режима отчетов для определенного типа отчета также вызывается
_CrtSetReportFile для указания целевого файла или потока. Если _DEBUG этот

параметр не определен, вызовы _CrtSetReportFile удаляются во время


предварительной обработки.

В следующем списке показаны доступные варианты и reportFile результирующее


поведение _CrtDbgReport . Эти параметры задаются в виде битовых флагов в файле
Crtdbg.h.

дескриптор файла

Дескриптор файла, который будет служить местом назначения для


сообщений. Попытки проверить допустимость дескриптора не
предпринимаются. Дескриптор файла необходимо открыть и закрыть.
Например:

HANDLE hLogFile;

hLogFile = CreateFile("c:\\log.txt", GENERIC_WRITE,

FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL, NULL);

_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);

_CrtSetReportFile(_CRT_WARN, hLogFile);

_RPT0(_CRT_WARN,"file message\n");

CloseHandle(hLogFile);

_CRTDBG_FILE_STDERR

Записывает в stderr сообщение, которое может быть переадресовано


следующим образом:

freopen( "c:\\log2.txt", "w", stderr);

_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);

_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);

_RPT0(_CRT_ERROR,"1st message\n");

_CRTDBG_FILE_STDOUT
Записывает в stdout сообщение, которые можно переадресовать.

_CRTDBG_REPORT_FILE

Возвращает текущий режим отчетов.

Вы можете управлять файлом отчета, используемым каждым типом отчета


отдельно. Например, можно указать, что reportType _CRT_ERROR отчеты
stderr reportType передаются с помощью определяемого пользователем

дескриптора _CRT_ASSERT или потока.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_CrtSetReportFile <crtdbg.h> <errno.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью, stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Библиотеки: Отладка только версий библиотеки CRT .

См. также раздел


Процедуры отладки\
_CrtSetReportHook
Статья • 03.04.2023

Устанавливает определяемую клиентом функцию отчетов путем ее прикрепления к


процессу создания отчетов среды выполнения языка C (только отладочная версия).

Синтаксис
C

_CRT_REPORT_HOOK _CrtSetReportHook(

_CRT_REPORT_HOOK reportHook

);

Параметры
reportHook

Новая определяемая клиентом функция отчетов, которую необходимо прикрепить


к процессу создания отчетов среды выполнения языка C.

Возвращаемое значение
Возвращает предыдущую определяемую клиентом функцию отчетов.

Комментарии
_CrtSetReportHook позволяет приложению использовать собственную функцию

отчетов в процессе создания отчетов отладочной библиотеки времени


выполнения языка C. В результате при каждом _CrtDbgReport вызове для создания
отчета об отладке сначала вызывается функция создания отчетов приложения. Эта
функциональность позволяет приложению выполнять такие операции, как
фильтрация отчетов отладки, чтобы сосредоточиться на выделениях памяти
конкретного типа или отправлять отчет в пункты назначения, которые недоступны
при использовании _CrtDbgReport . Если _DEBUG параметр не определен, вызовы
удаляются _CrtSetReportHook во время предварительной обработки.

Более надежную версию см. в _CrtSetReportHook разделе _CrtSetReportHook2.


Функция _CrtSetReportHook устанавливает новую определяемую клиентом функцию
отчетов, указанную в параметре reportHook , и возвращает предыдущую
определенную клиентом функцию-обработчик. В следующем примере показано,
как должен быть объявлен прототип определяемого клиентом обработчика
отчетов:

int YourReportHook( int reportType, char *message, int *returnValue );

где reportType  — тип отчета отладки ( _CRT_WARN , _CRT_ERROR или _CRT_ASSERT ),


message  — полностью собранное пользовательское отладочное сообщение,
которое будет содержаться в отчете, и returnValue  — значение, указанное
определяемой клиентом функцией отчетов, которое должно возвращаться
функцией _CrtDbgReport . Полное описание доступных типов отчетов см. в
_CrtSetReportMode функции .

Если определяемая клиентом функция отчетов полностью обрабатывает


сообщение отладки и дальнейшая выдача отчета не требуется, функция должна
возвращать значение TRUE . Если функция возвращает значение FALSE , для
создания отчета отладки с использованием текущих параметров типа, режима и
файла отчета вызывается функция _CrtDbgReport . Кроме того, указав возвращаемое
значение функции _CrtDbgReport в параметре returnValue , приложение может
контролировать, происходит ли прерывание при отладке. Полное описание
настройки и создания отчета об отладке см. в разделе _CrtSetReportMode ,
_CrtSetReportFileи _CrtDbgReport .

Дополнительные сведения об использовании других функций времени


выполнения с поддержкой перехватчика и создании собственных функций
перехватчика, определяемых клиентом, см. в разделе Отладка записи функций
перехватчика.

7 Примечание

Если приложение скомпилировано с помощью /clr и функция отчетов


вызывается после выхода приложения из main, среда CLR создаст исключение,
если функция отчетов вызывает какие-либо функции CRT.

Требования
Подпрограмма Обязательный заголовок

_CrtSetReportHook <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки

_CrtGetReportHook
_CrtSetReportHook2 , _CrtSetReportHookW2
Статья • 03.04.2023

Устанавливает или удаляет определяемую клиентом функцию отчетов путем ее


прикрепления к процессу создания отладочных отчетов среды выполнения языка C
(только отладочная версия).

Синтаксис
C

int _CrtSetReportHook2(

int mode,

_CRT_REPORT_HOOK pfnNewHook

);

int _CrtSetReportHookW2(

int mode,

_CRT_REPORT_HOOKW pfnNewHook

);

Параметры
mode

Выполняемое действие: _CRT_RPTHOOK_INSTALL или _CRT_RPTHOOK_REMOVE .

pfnNewHook

Обработчик отчета для установки или удаления в узкой или широкой версии этой
функции.

Возвращаемое значение
–1, если произошла ошибка, с установленным значением EINVAL или ENOMEM ; в
противном случае возвращает число ссылок pfnNewHook после вызова.

Комментарии
_CrtSetReportHook2 и _CrtSetReportHookW2 позволяет перехватыть или отключает

функцию, в то время как _CrtSetReportHook можно только подключить функцию.


_CrtSetReportHook2 или _CrtSetReportHookW2 следует использовать вместо

_CrtSetReportHook , когда вызов обработчика производится в DLL и могут быть


загружены несколько DLL, в каждой из которых могут настраиваться собственные
функции-обработчики. В таком случае библиотеки DLL могут быть выгружены не в
том порядке, в котором они были загружены, а функция-обработчик может
продолжать указывать на выгруженную библиотеку DLL. Любой отладочный вывод
вызывает сбой процесса, если функции-обработчики были добавлены с помощью
_CrtSetReportHook .

Все функции-обработчики, добавленные с помощью функции _CrtSetReportHook ,


вызываются при отсутствии функций-обработчиков, добавленных с помощью
функции _CrtSetReportHook2 или _CrtSetReportHookW2 , либо если все функции-
обработчики, добавленные с помощью функций _CrtSetReportHook2 и
_CrtSetReportHookW2 , возвращают значение FALSE .

Доступна версия этой функции для расширенных символов. Функции-обработчики


отчетов принимают строку, тип которой (расширенные или обычные символы)
должен соответствовать версии используемой функции. Используйте следующий
прототип функции для обработчиков отчетов, используемых с версией этой
функции для расширенных символов:

int YourReportHook( int reportType, wchar_t *message, int *returnValue );

Используйте следующий прототип для обработчиков отчетов с обычными


символами:

int YourReportHook( int reportType, char *message, int *returnValue );

Эти функции проверяют свои параметры. Если mode это pfnNewHook недопустимо,
эти функции вызывают обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если продолжение выполнения разрешено, эти
функции устанавливают для errno значение EINVAL и возвращают -1.

7 Примечание

Если приложение компилируется с параметром /clr и функция отчетов


вызывается после выхода приложения из main, среда CLR выдает исключение,
если функция отчетов вызывает какие-либо функции CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_CrtSetReportHook2 <crtdbg.h> <errno.h>

_CrtSetReportHookW2 <crtdbg.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C

// crt_setreporthook2.c

#include <windows.h>

#include <stdio.h>

#include <crtdbg.h>

#include <assert.h>

int __cdecl TestHook1(int nReportType, char* szMsg, int* pnRet)

int nRet = FALSE;

printf("CRT report hook 1.\n");

printf("CRT report type is \"");

switch (nReportType)
{

case _CRT_ASSERT:

printf("_CRT_ASSERT");

// nRet = TRUE; // Always stop for this type of report

break;

case _CRT_WARN:

printf("_CRT_WARN");

break;

case _CRT_ERROR:

printf("_CRT_ERROR");

break;

default:

printf("???Unknown???");

break;

printf("\".\nCRT report message is:\n\t");

printf(szMsg);

if (pnRet)

*pnRet = 0;

return nRet;

int __cdecl TestHook2(int nReportType, char* szMsg, int* pnRet)

int nRet = FALSE;

printf("CRT report hook 2.\n");

printf("CRT report type is \"");

switch (nReportType)

case _CRT_WARN:

printf("_CRT_WARN");

break;

case _CRT_ERROR:

printf("_CRT_ERROR");

break;

case _CRT_ASSERT:

printf("_CRT_ASSERT");

nRet = TRUE; // Always stop for this type of report

break;

default:

printf("???Unknown???");

break;

printf("\".\nCRT report message is: \t");

printf(szMsg);

if (pnRet)

*pnRet = 0;

// printf("CRT report code is %d.\n", *pnRet);

return nRet;

int main(int argc, char* argv[])

int nRet = 0;

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1)"

" returned %d\n", nRet);

_ASSERT(0);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2)"

" returned %d\n", nRet);

nRet = _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1);

printf("_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1)"

" returned %d\n", nRet);

return nRet;

Выходные данные
Output
_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook2) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestHook1) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook2) returned 0

_CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestHook1) returned 0

См. также
Подпрограммы отладки
_CrtSetReportMode
Статья • 03.04.2023

Указывает назначение или назначения для определенного типа отчета, созданного


_CrtDbgReport и всех макросов, вызывающих _CrtDbgReport, _CrtDbgReportWтаких
как _ASSERT, _ASSERTE, _ASSERT_EXPR макросы и _RPT, _RPTF, _RPTW, , _RPTFW
макросы (только для отладочной версии).

Синтаксис
C

int _CrtSetReportMode(

int reportType,

int reportMode

);

Параметры
reportType

Тип отчета: _CRT_WARN , _CRT_ERROR и _CRT_ASSERT .

reportMode

Новый режим или режимы отчетов для reportType .

Возвращаемое значение
При успешном завершении функция _CrtSetReportMode возвращает предыдущий
режим или режимы отчетов для типа отчета, указанного в параметре reportType .
Если в reportType параметре передается недопустимое значение или указан
недопустимый режим для reportMode , _CrtSetReportMode вызывает обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, эта функции задает для errno значение
EINVAL и возвращает -1. Дополнительные сведения см. в разделах errno, _doserrno,

_sys_errlistи _sys_nerr.

Комментарии
Функция _CrtSetReportMode определяет место назначения вывода для функции
_CrtDbgReport . Поскольку макросы _ASSERT, _ASSERTE, _RPT и _RPTF вызывают
функцию _CrtDbgReport , функция _CrtSetReportMode определяет место назначения
вывода текста, определенного этими макросами.

Если _DEBUG параметр не определен, вызовы удаляются _CrtSetReportMode во


время предварительной обработки.

Если вы не вызываете для _CrtSetReportMode определения назначения выходных


данных сообщений, действуют следующие значения по умолчанию:

Ошибки и сбои проверочного утверждения направляются в окно сообщений


отладчика.

Предупреждения из Windows-приложений направляются в окно вывода


отладчика.

Предупреждения из консольных приложений не отображаются.

В следующей таблице перечислены типы отчетов, определенные в Crtdbg.h .

Тип отчета Описание

_CRT_WARN Предупреждения, сообщения и сведения, которые не требуют немедленного


внимания.

_CRT_ERROR Ошибки, неустранимые проблемы и ситуации, которые требуют


немедленного внимания.

_CRT_ASSERT Сбои проверочного утверждения (выражения, вычисление которых дает


значение FALSE ).

Функция _CrtSetReportMode присваивает новый режим отчета, указанный в


параметре reportMode , типу отчета, указанному в параметре reportType , и
возвращает ранее определенный режим отчета для reportType . В следующей
таблице приведен список доступных вариантов для параметра reportMode и
соответствующее поведение функции _CrtDbgReport . Эти параметры задаются в
виде битовых флагов в файле Crtdbg.h.

Режим отчета Поведение функции _CrtDbgReport

_CRTDBG_MODE_DEBUG Выводит сообщение в окно вывода отладчика.


Режим отчета Поведение функции _CrtDbgReport

_CRTDBG_MODE_FILE Выводит сообщение в предоставленный пользователем дескриптор


файла. _CrtSetReportFile должен вызываться для определения
конкретного файла или потока, используемого в качестве назначения.

_CRTDBG_MODE_WNDW Создает окно сообщения для отображения сообщения вместе с


кнопками "Прервать", "Повторить" и "Пропустить ".

_CRTDBG_REPORT_MODE Возвращает reportMode для заданного reportType :

1 _CRTDBG_MODE_FILE

2 _CRTDBG_MODE_DEBUG

4 _CRTDBG_MODE_WNDW

Каждый тип отчета может создаваться с использованием одного, двух или трех
режимов или вообще без режима. Таким образом, для одного типа отчета можно
определить несколько назначений. Например, в следующем фрагменте кода
сообщения о сбоях проверочного утверждения отправляются как в окно
сообщений отладчика, так и в поток stderr :

_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE | _CRTDBG_MODE_WNDW );

_CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDERR );

Кроме того, вы можете управлять режимом отчетов или режимами для каждого
типа отчета отдельно. Например, можно указать, что объект reportType _CRT_WARN
отправляется в выходную строку отладки, а _CRT_ASSERT отображается в окне
сообщения отладки и отправляется в stderr , как показано выше.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_CrtSetReportMode <crtdbg.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Отладка версий только библиотек среды выполнения C .


См. также раздел
Подпрограммы отладки
cscanf
Статья • 03.04.2023

Имя cscanf функции, зависят от Майкрософт, является устаревшим псевдонимом


_cscanf для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _cscanf . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_cscanf , _cscanf_l , _cwscanf ,
_cwscanf_l
Статья • 03.04.2023

Считывает форматированные данные из консоли. Доступны более безопасные


версии этих функций; see _cscanf_s, _cscanf_s_l, _cwscanf_s_cwscanf_s_l.

7 Примечание

В Visual Studio 2015 Класс printf и scanf семейство функций были объявлены
как inline и перемещены в <stdio.h> заголовки и <conio.h> заголовки. При
переносе более старого кода в связи с этими функциями может появиться
ошибка компоновщика LNK2019. Дополнительные сведения см. в журнале
изменений Visual C++ 2003 –2015.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _cscanf(

const char *format [,

argument] ...

);

int _cscanf_l(

const char *format,

_locale_t locale [,

argument] ...

);

int _cwscanf(

const wchar_t *format [,

argument] ...

);

int _cwscanf_l(

const wchar_t *format,

_locale_t locale [,

argument] ...

);

Параметры
format

Строка управления форматом.

argument

Дополнительные параметры.

locale

Используемый языковой стандарт.

Возвращаемое значение
Число успешно преобразованных и назначенных полей. Возвращаемое значение
не содержит поля, которые были прочитаны, но не назначены. При попытке чтения
конечной части файла возвращается значение EOF . Также EOF может быть
возвращен при перенаправлении ввода с клавиатуры на уровне командной строки
операционной системы. Возвращаемое значение равно нулю означает, что поля не
были назначены.

Комментарии
Функция _cscanf считывает данные из консоли в места, указанные функцией
argument . Функция _getche используется для чтения символов. Каждый
дополнительный параметр должен быть указателем на переменную, тип которой
соответствует спецификатору типа в параметре format . Формат управляет
интерпретацией полей ввода и имеет ту же форму и функцию, что format и
параметр для scanf функции. Хотя _cscanf обычно выполняется эхо входной
символ, он не делает этого, если последний вызов был выполнен _ungetch .

Эта функция проверяет свои параметры. Если используется NULL формат,


вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, параметр
errno устанавливается в значение EINVAL , и функция возвращает значение EOF .

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcscanf _cscanf _cscanf _cwscanf

_tcscanf_l _cscanf_l _cscanf_l _cwscanf_l

Требования
Подпрограмма Обязательный заголовок

_cscanf , _cscanf_l <conio.h>

_cwscanf , _cwscanf_l <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_cscanf.c

// compile with: /c /W3

/* This program prompts for a string

* and uses _cscanf to read in the response.

* Then _cscanf returns the number of items

* matched, and the program displays that number.

*/

#include <stdio.h>

#include <conio.h>

int main( void )

int result, i[3];

_cprintf_s( "Enter three integers: ");

result = _cscanf( "%i %i %i", &i[0], &i[1], &i[2] ); // C4996

// Note: _cscanf is deprecated; consider using _cscanf_s instead

_cprintf_s( "\r\nYou entered " );

while( result-- )

_cprintf_s( "%i ", i[result] );

_cprintf_s( "\r\n" );

Input

1 2 3

Output

Enter three integers: 1 2 3

You entered 3 2 1

См. также раздел


Ввод-вывод на консоль и порт

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fscanf, _fscanf_l, fwscanf, _fwscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

sscanf, _sscanf_l, swscanf, _swscanf_l


_cscanf_s , _cscanf_s_l , _cwscanf_s ,
_cwscanf_s_l
Статья • 03.04.2023

Считывает форматированные данные из консоли. Эти более безопасные версии ,


_cscanf_l_cwscanf_cwscanf_lимеют улучшения безопасности, как описано в
функциях_cscanfбезопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _cscanf_s(

const char *format [,

argument] ...

);

int _cscanf_s_l(

const char *format,

_locale_t locale [,

argument] ...

);

int _cwscanf_s(

const wchar_t *format [,

argument] ...

);

int _cwscanf_s_l(

const wchar_t *format,

_locale_t locale [,

argument] ...

);

Параметры
format

Строка управления форматом.


argument

Дополнительные параметры.

locale

Используемый языковой стандарт.

Возвращаемое значение
Число успешно преобразованных и назначенных полей. Возвращаемое значение
не содержит поля, которые были прочитаны, но не назначены. При попытке чтения
конечной части файла возвращается значение EOF . Также EOF можно вернуть
значение при перенаправлении ввода клавиатуры на уровне командной строки
операционной системы. Возвращаемое значение равно нулю означает, что поля не
назначены.

Эти функции проверяют свои параметры. Если format это пустой указатель, эти
функции вызывают обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение разрешено продолжать, эти функции
возвращаются EOF и errno задаются EINVAL в значение .

Комментарии
Функция _cscanf_s считывает данные из консоли в места, указанные функцией
argument . Функция _getche используется для чтения символов. Каждый
дополнительный параметр должен быть указателем на переменную, тип которой
соответствует спецификатору типа в параметре format . Формат управляет
интерпретацией полей ввода и имеет ту же форму и функцию, что format и
параметр для scanf_s функции. Хотя _cscanf_s обычно выполняется эхо входной
символ, он не делает этого, если последний вызов был выполнен _ungetch .

Как и другие безопасные версии функций в семействе scanf , _cscanf_s и


_cwscanf_s требуют аргументов размера для символов поля типа c, C, s, S и [.

Дополнительные сведения см. в разделе Спецификация ширины scanf.

7 Примечание

Параметр размера имеет тип unsigned , а не size_t .

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcscanf_s _cscanf_s _cscanf_s _cwscanf_s

_tcscanf_s_l _cscanf_s_l _cscanf_s_l _cwscanf_s_l

Требования
Подпрограмма Обязательный заголовок

_cscanf_s , _cscanf_s_l <conio.h>

_cwscanf_s , _cwscanf_s_l <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_cscanf_s.c

// compile with: /c

/* This program prompts for a string

* and uses _cscanf_s to read in the response.

* Then _cscanf_s returns the number of items

* matched, and the program displays that number.

*/

#include <stdio.h>

#include <conio.h>

int main( void )

int result, n[3];

int i;

result = _cscanf_s( "%i %i %i", &n[0], &n[1], &n[2] );

_cprintf_s( "\r\nYou entered " );

for( i=0; i<result; i++ )

_cprintf_s( "%i ", n[i] );

_cprintf_s( "\r\n" );

Input

1 2 3

Output

You entered 1 2 3

См. также раздел


Ввод-вывод на консоль и порт

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fscanf_s, _fscanf_s_l, fwscanf_s, _fwscanf_s_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l


csin , csinf , csinl
Статья • 03.04.2023

Извлекают синус комплексного числа.

Синтаксис
C

_Dcomplex csin(

_Dcomplex z

);

_Fcomplex csin(

_Fcomplex z

); // C++ only

_Lcomplex csin(

_Lcomplex z

); // C++ only

_Fcomplex csinf(

_Fcomplex z

);

_Lcomplex csinl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Синус z в радианах.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки csin , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C csin всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

csin , csinf , csinl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


csinh , csinhf , csinhl
Статья • 03.04.2023

Извлекает гиперболический синус комплексного числа.

Синтаксис
C

_Dcomplex csinh(

_Dcomplex z

);

_Fcomplex csinh(

_Fcomplex z

); // C++ only

_Lcomplex csinh(

_Lcomplex z

); // C++ only

_Fcomplex csinhf(

_Fcomplex z

);

_Lcomplex csinhl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Гиперболический синус аргумента z в радианах.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки csinh , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C csinh всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

csinh , csinhf , csinhl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


csqrt , csqrtf , csqrtl
Статья • 03.04.2023

Извлекает квадратный корень комплексного числа, ветви которого заканчиваются


в отрицательной части реальной оси.

Синтаксис
C

_Dcomplex csqrt(

_Dcomplex z

);

_Fcomplex csqrt(

_Fcomplex z

); // C++ only

_Lcomplex csqrt(

_Lcomplex z

); // C++ only

_Fcomplex csqrtf(

_Fcomplex z

);

_Lcomplex csqrtl(

_Lcomplex z

);

Параметры
z

Комплексное число.

Возвращаемое значение
Квадратный корень числа z . Результат отображается в правой половине
плоскости.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

-INF нет _DOMAIN


Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки csqrt , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C csqrt всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

csqrt , csqrtf , csqrtl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl


ctan , ctanf , ctanl
Статья • 03.04.2023

Извлекает тангенс комплексного числа.

Синтаксис
C

_Dcomplex ctan(

_Dcomplex z

);

_Fcomplex ctan(

_Fcomplex z

); // C++ only

_Lcomplex ctan(

_Lcomplex z

); // C++ only

_Fcomplex ctanf(

_Fcomplex z

);

_Lcomplex ctanl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Тангенс z .

Входные данные Исключение SEH _matherr Исключение

± INF, QNaN, IND нет _DOMAIN

± INF ( tan , tanf ) INVALID _DOMAIN

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки ctan , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C ctan всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

ctan , ctanf , ctanl <complex.h> <ccomplex>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

ctanh, ctanhf, ctanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


ctanh , ctanhf , ctanhl
Статья • 03.04.2023

Вычисляет комплексный гиперболический тангенс комплексного числа.

Синтаксис
C

_Dcomplex ctanh(

_Dcomplex z

);

_Fcomplex ctanh(

_Fcomplex z

); // C++ only

_Lcomplex ctanh(

_Lcomplex z

); // C++ only

_Fcomplex ctanhf(

_Fcomplex z

);

_Lcomplex ctanhl(

_Lcomplex z

);

Параметры
z

Комплексное число, указывающее угол в радианах.

Возвращаемое значение
Комплексный гиперболический тангенс z .

Входные данные Исключение SEH _matherr Исключение

± INF, QNaN, IND нет _DOMAIN

± INF (tan, tanf) INVALID _DOMAIN

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки ctanh , которые
принимают и возвращают значения _Fcomplex и _Lcomplex . В программе на языке
C ctanh всегда принимает и возвращает значение _Dcomplex .

Требования
Подпрограмма Заголовок C Заголовок C++

ctanh , ctanhf , ctanhl <complex.h> <ccomplex>

Сведения о совместимости см. в разделе Совместимость.

См. также раздел


Алфавитный указатель функций

catanh, catanhf, catanhl

catan, catanf, catanl


csinh, csinhf, csinhl

casinh, casinhf, casinhl

ccosh, ccoshf, ccoshl

cacosh, cacoshf, cacoshl

cacos, cacosf, cacosl

ctan, ctanf, ctanl

csin, csinf, csinl

casin, casinf, casinl

ccos, ccosf, ccosl

csqrt, csqrtf, csqrtl


ctime , _ctime32 , _ctime64 , _wctime ,
_wctime32 , _wctime64
Статья • 03.04.2023

Преобразуют значение времени в строку и настраивают его в соответствии с


параметрами локального часового пояса. Доступны более безопасные версии этих
функций; see ctime_s, , _ctime64_s_ctime32_s_wctime_s, _wctime32_s_wctime64_s.

Синтаксис
C

char *ctime( const time_t *sourceTime );

char *_ctime32( const __time32_t *sourceTime );

char *_ctime64( const __time64_t *sourceTime );

wchar_t *_wctime( const time_t *sourceTime );

wchar_t *_wctime32( const __time32_t *sourceTime );

wchar_t *_wctime64( const __time64_t *sourceTime );

Параметры
sourceTime

Указатель на хранимый момент для преобразования.

Возвращаемое значение
Указатель на результирующую строку символов. NULL возвращается, когда:

sourceTime представляет дату перед полуночью 1-го января 1970 года, в


формате UTC.

Вы используете _ctime32 или _wctime32 sourceTime представляете дату после


23:59:59 18 января 2038 г. в формате UTC.

Вы используете _ctime64 или _wctime64 sourceTime представляете дату после


23:59:59, 31 декабря 3000 г. в формате UTC.

ctime — встроенная функция, которая принимает значение _ctime64 и time_t

эквивалентна __time64_t . Если необходимо, чтобы компилятор принудительно


интерпретировал time_t как старое 32-разрядное значение time_t , можно
определить _USE_32BIT_TIME_T . Этот макрос вызывает ctime оценку _ctime32 . Мы
не рекомендуем использовать его, так как приложение может завершиться сбоем
после 18 января 2038 г. и не допускается на 64-разрядных платформах.

Комментарии
Функция ctime преобразует значение времени, хранящееся в виде time_t значения,
в символьную строку. Значение sourceTime обычно получается из вызова time,
который возвращает количество секунд, прошедшее с полуночи (00:00:00), 1
января 1970 года, скоординированное универсальное время (UTC). Строка
возвращаемого значения содержит ровно 26 символов и имеет следующий вид:

Output

Wed Jan 02 02:03:55 1980\n\0

Время в 24-часовом формате. Все поля имеют постоянную ширину. Символ новой
строки ("\n") и нуль-символ ("\0") занимают две последние позиции строки.

Преобразованная символьная строка также настраивается согласно параметрам


местного часового пояса. Сведения о настройке местного времени см. в
timeразделе и _ftimelocaltime функциях. Дополнительные сведения об определении
среды часового пояса и глобальных переменных см. в _tzset этой функции.

Вызов функции ctime изменяет один статически выделенный буфер, используемый


функциями gmtime и localtime . Каждый вызов одной из этих подпрограмм
уничтожает результат предыдущего вызова. Функция ctime делит статический
буфер с функцией asctime . Таким образом, вызов функции ctime уничтожает
результаты любого предыдущего вызова функций asctime , localtime или gmtime .

_wctime и _wctime64  — версии функций ctime и _ctime64 для расширенных


символов; возвращают указатель на строку из расширенных символов. В
остальном поведение функций _ctime64 , _wctime и _wctime64 совпадает с
поведением функции ctime .

Эти функции проверяют свои параметры. Если sourceTime это пустой указатель или
sourceTime значение отрицательное, эти функции вызывают обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, эти функции возвращают NULL и
устанавливают параметр errno в значение EINVAL .
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tctime ctime ctime _wctime

_tctime32 _ctime32 _ctime32 _wctime32

_tctime64 _ctime64 _ctime64 _wctime64

Требования
Подпрограмма Обязательный заголовок

ctime <time.h>

_ctime32 <time.h>

_ctime64 <time.h>

_wctime <time.h> или <wchar.h>

_wctime32 <time.h> или <wchar.h>

_wctime64 <time.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_ctime64.c

// compile with: /W3

/* This program gets the current

* time in _time64_t form, then uses ctime to

* display the time in string form.

*/

#include <time.h>

#include <stdio.h>

int main( void )

__time64_t ltime;

_time64( &ltime );

printf( "The time is %s\n", _ctime64( &ltime ) ); // C4996

// Note: _ctime64 is deprecated; consider using _ctime64_s

Output

The time is Wed Feb 13 16:04:43 2002

См. также раздел


Управление временем

asctime, _wasctime

ctime_s, _ctime32_s, _ctime64_s, _wctime_s, _wctime32_s, _wctime64_s

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

time, _time32, _time64


ctime_s , _ctime32_s , _ctime64_s ,
_wctime_s , _wctime32_s , _wctime64_s
Статья • 03.04.2023

Преобразуют значение времени в строку и настраивают его в соответствии с


параметрами локального часового пояса. Эти функции являются версиями ,
_ctime64_wctime_wctime64с улучшениями безопасности, как описано в
функцияхctimeбезопасности в CRT.

Синтаксис
C

errno_t ctime_s(

char* buffer,

size_t numberOfElements,

const time_t *sourceTime

);

errno_t _ctime32_s(

char* buffer,

size_t numberOfElements,

const __time32_t *sourceTime

);

errno_t _ctime64_s(

char* buffer,

size_t numberOfElements,

const __time64_t *sourceTime )

errno_t _wctime_s(

wchar_t* buffer,

size_t numberOfElements,

const time_t *sourceTime

);

errno_t _wctime32_s(

wchar_t* buffer,

size_t numberOfElements,

const __time32_t *sourceTime

);

errno_t _wctime64_s(

wchar_t* buffer,

size_t numberOfElements,

const __time64_t *sourceTime

);

C++
template <size_t size>

errno_t _ctime32_s(

char (&buffer)[size],

const __time32_t *sourceTime

); // C++ only

template <size_t size>

errno_t _ctime64_s(

char (&buffer)[size],

const __time64_t *sourceTime

); // C++ only

template <size_t size>

errno_t _wctime32_s(

wchar_t (&buffer)[size],

const __time32_t *sourceTime

); // C++ only

template <size_t size>

errno_t _wctime64_s(

wchar_t (&buffer)[size],

const __time64_t *sourceTime

); // C++ only

Параметры
buffer

Должен быть достаточно большим для хранения 26 символов. Указатель на


результат строки символа или NULL , если:

sourceTime представляет дату перед полуночью 1-го января 1970 года, в

формате UTC.

Если используется функция _ctime32_s или _wctime32_s , а sourceTime


представляет дату после 23:59:59 18-го января 2038 года.

Если используется функция _ctime64_s или _wctime64_s и sourceTime


представляет дату после 23:59:59 31-го декабря 3000 года (в формате UTC).

Если используются _ctime_s или _wctime_s , эти функции служат оболочками


для предыдущих функций. См. раздел «Примечания».

numberOfElements

Размер буфера.

sourceTime

Указатель на сохраненное время.


Возвращаемое значение
Нуль при успешном завершении. Если произошел сбой из-за недопустимого
параметра, вызывается обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если продолжение выполнения разрешено,
возвращается код ошибки. Коды ошибок определяются в ERRNO. H; список этих
ошибок см. в разделе errno. Фактические коды ошибок, отображаемые для каждого
условия ошибки, представлены в следующей таблице.

Условия ошибок
buffer numberOfElements sourceTime Возвращает Значение
в buffer

NULL any any EINVAL Без


изменений

Не NULL (указывает на 0 any EINVAL Без


допустимую память) изменений

Не NULL 0< размер < 26 any EINVAL Пустая


строка.

Не NULL >= 26 NULL EINVAL Пустая


строка.

Не NULL >= 26 <0 EINVAL Пустая


строка.

Комментарии
Функция ctime_s преобразует значение времени, хранящееся в виде time_t
структуры, в символьную строку. Значение sourceTime обычно получается из
вызова time, который возвращает количество секунд, прошедшее с полуночи
(00:00:00), 1 января 1970 года, скоординированное универсальное время (UTC).
Строка возвращаемого значения содержит ровно 26 символов и имеет следующий
вид:

Wed Jan 02 02:03:55 1980\n\0

Время в 24-часовом формате. Все поля имеют постоянную ширину. Символ новой
строки ("\n") и нуль-символ ("\0") занимают две последние позиции строки.
Преобразованная символьная строка также настраивается согласно параметрам
местного часового пояса. Сведения о настройке местного времени см. в
timeразделе и _ftimelocaltime функциях. Дополнительные сведения об определении
среды часового пояса и глобальных переменных см. в _tzset этой функции.

_wctime32_s и _wctime64_s  — версии функций _ctime32_s и _ctime64_s для

расширенных символов; возвращают указатель на строку из расширенных


символов. В остальном поведение функций _ctime64_s , _wctime32_s и _wctime64_s
совпадает с поведением функции _ctime32_s .

ctime_s — встраиваемая функция, которая принимает значение _ctime64_s , и


time_t эквивалентна __time64_t . Если необходимо, чтобы компилятор

принудительно интерпретировал time_t как старое 32-разрядное значение time_t ,


можно определить _USE_32BIT_TIME_T . Этот макрос вызывает ctime_s оценку
_ctime32_s . Мы не рекомендуем использовать его, так как приложение может

завершиться сбоем после 18 января 2038 г., и оно не разрешено на 64-разрядных


платформах.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tctime_s ctime_s ctime_s _wctime_s

_tctime32_s _ctime32_s _ctime32_s _wctime32_s

_tctime64_s _ctime64_s _ctime64_s _wctime64_s

Требования
Подпрограмма Обязательный заголовок

ctime_s , _ctime32_s , _ctime64_s <time.h>

_wctime_s , _wctime32_s , _wctime64_s <time.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_wctime_s.c

// This program gets the current

// time in time_t form and then uses _wctime_s to

// display the time in string form.

#include <time.h>

#include <stdio.h>

#define SIZE 26

int main( void )

time_t ltime;

wchar_t buf[SIZE];

errno_t err;

time( &ltime );

err = _wctime_s( buf, SIZE, &ltime );

if (err != 0)

printf("Invalid Arguments for _wctime_s. Error Code: %d\n", err);

wprintf_s( L"The time is %s\n", buf );

Output

The time is Fri Apr 25 13:03:39 2003

См. также раздел


Управление временем

asctime_s, _wasctime_s

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_ftime, _ftime32, _ftime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime_s, _localtime32_s, _localtime64_s

time, _time32, _time64


cwait
Статья • 03.04.2023

Имя cwait функции, зависят от Майкрософт, является устаревшим псевдонимом


_cwait для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _cwait . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_cwait
Статья • 03.04.2023

Ожидает завершения другого процесса.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _cwait(

int *termstat,

intptr_t procHandle,

int action

);

Параметры
termstat

Указатель на буфер, в котором будет храниться код результата указанного


процесса, или NULL .

procHandle

Дескриптор для ожидаемого процесса (то есть процесса, который должен


завершиться, прежде чем функция _cwait сможет вернуть значение).

action

NULL : игнорируется приложениями операционной системы Windows; для других

приложений: код действия для выполнения в procHandle .

Возвращаемое значение
Если указанный процесс успешно выполнен, возвращает дескриптор указанного
процесса и задает для параметра termstat код результата, возвращенный
указанным процессом. В противном случае возвращает -1 и задает errno
следующим образом.

Значение Описание
errno

ECHILD Указанный процесс не существует, procHandle является недопустимым или


вызов GetExitCodeProcess API или WaitForSingleObject завершился сбоем.

EINVAL action недопустим.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функция _cwait ожидает завершения ИД процесса указанного процесса,
предоставленного параметром procHandle . Значение procHandle , передаваемое в
_cwait , должно быть значением, возвращаемым вызовом _spawn функции,

создающей указанный процесс. Если ИД процесса завершается до вызова _cwait ,


_cwait возвращает значение немедленно. _cwait может использоваться любым

процессом для ожидания другого известного процесса, для которого существует


действительный дескриптор ( procHandle ).

termstat указывает на буфер, в который будет сохранен код результата указанного

процесса. Значение termstat указывает, завершился ли указанный процесс


обычным образом путем вызова API Windows ExitProcess . ExitProcess вызывается
внутренне, если указанный процесс вызывает exit или _exit , возвращает
значение из main или достигает конца main . Дополнительные сведения о значении,
передаваемом через , см. в termstat разделе GetExitCodeProcess. Если _cwait
вызывается с использованием NULL значения для termstat , код возврата
указанного процесса не сохраняется.

Параметр action игнорируется операционной системой Windows, так как в этих


средах не реализованы связи "родители-потомки".

Если значение procHandle не равно -1 или -2 (дескрипторы для текущего потока


или процесса), дескриптор будет закрыт. В этом случае не используйте
возвращенный дескриптор.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_cwait <process.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_cwait.c

// compile with: /c

// This program launches several processes and waits

// for a specified process to finish.

#define _CRT_RAND_S

#include <windows.h>

#include <process.h>

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

// Macro to get a random integer within a specified range

#define getrandom( min, max ) (( (rand_s (&number), number) % (int)((( max )


+ 1 ) - ( min ))) + ( min ))

struct PROCESS

intptr_t hProcess;

char name[40];

} process[4] = { { 0, "Ann" }, { 0, "Beth" }, { 0, "Carl" }, { 0, "Dave" }


};

int main(int argc, char* argv[])

int termstat, c;

unsigned int number;

srand((unsigned)time(NULL)); // Seed randomizer

// If no arguments, this is the calling process

if (argc == 1)

// Spawn processes in numeric order

for (c = 0; c < 4; c++) {

_flushall();

process[c].hProcess = _spawnl(_P_NOWAIT, argv[0], argv[0],

process[c].name, NULL);

// Wait for randomly specified process, and respond when done

c = getrandom(0, 3);

printf("Come here, %s.\n", process[c].name);

_cwait(&termstat, process[c].hProcess, _WAIT_CHILD);

printf("Thank you, %s.\n", process[c].name);

// If there are arguments, this must be a spawned process

else

// Delay for a period that's determined by process number

Sleep((argv[1][0] - 'A' + 1) * 1000L);

printf("Hi, Dad. It's %s.\n", argv[1]);

Порядок выходных данных зависит от запуска к выполнению.

Output

Hi, Dad. It's Ann.

Come here, Ann.

Thank you, Ann.

Hi, Dad. It's Beth.

Hi, Dad. It's Carl.

Hi, Dad. It's Dave.

См. также раздел


Управление процессами и средой

_spawn, _wspawn функции


_CxxThrowException
Статья • 03.04.2023

Создает запись об исключении и вызывает среду выполнения для запуска


обработки исключения.

Синтаксис
C

extern "C" void __stdcall _CxxThrowException(

void* pExceptionObject

_ThrowInfo* pThrowInfo

);

Параметры
pExceptionObject

Получает объект, который создал событие.

pThrowInfo

Сведения, необходимые для обработки исключения.

Комментарии
Этот метод включается только в файл компилятора, который используется
компилятором для обработки исключений. Не вызывайте метод непосредственно
из кода.

Требования
Источник: Throw.cpp

См. также раздел


Алфавитный указатель функций
difftime , _difftime32 , _difftime64
Статья • 03.04.2023

Определяет разницу между двумя значениями времени.

Синтаксис
C

double difftime( time_t timeEnd, time_t timeStart );

double _difftime32( __time32_t timeEnd, __time32_t timeStart );

double _difftime64( __time64_t timeEnd, __time64_t timeStart );

Параметры
timeEnd

Время окончания.

timeStart

Время начала.

Возвращаемое значение
difftime возвращает затраченное время между timeStart и timeEnd в секундах.
Возвращаемое значение представляет собой число двойной точности с
плавающей запятой. Возвращаемое значение может быть равно 0, что указывает
на ошибку.

Комментарии
Функция difftime вычисляет разницу между двумя значениями времени,
заданными в параметрах timeStart и timeEnd .

Указанное значение времени должно соответствовать диапазону time_t . time_t


представляет собой 64-разрядное значение. В связи с этим конец диапазона был
увеличен с 23:59:59 18-го января 2038 года, UTC до 23:59:59 31-го декабря 3000
года. Нижняя граница диапазона time_t по-прежнему приходится на полночь 1-го
января 1970 года.
difftime является встроенной функцией, которая вычисляет либо _difftime32 ,

либо _difftime64 в зависимости от того, определен ли параметр _USE_32BIT_TIME_T .


_difftime32 и _difftime64 можно использовать для принудительного применения
определенного размера типа времени.

Эти функции проверяют свои параметры. Если любой из параметров равен нулю
или отрицательным, вызывается обработчик недопустимых параметров, как
описано в разделе "Проверка параметров". Если разрешается продолжать
выполнение, эти функции возвращают -0 и задают для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

difftime <time.h>

_difftime32 <time.h>

_difftime64 <time.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_difftime.c

// This program calculates the amount of time

// needed to do a floating-point multiply 100 million times.

//

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <float.h>

double RangedRand( float range_min, float range_max)

// Generate random numbers in the half-closed interval

// [range_min, range_max). In other words,

// range_min <= random number < range_max

return ((double)rand() / (RAND_MAX + 1) * (range_max - range_min)

+ range_min);

int main( void )

time_t start, finish;

long loop;

double result, elapsed_time;

double arNums[3];

// Seed the random-number generator with the current time so that

// the numbers will be different every time we run.

srand( (unsigned)time( NULL ) );

arNums[0] = RangedRand(1, FLT_MAX);

arNums[1] = RangedRand(1, FLT_MAX);

arNums[2] = RangedRand(1, FLT_MAX);

printf( "Using floating point numbers %.5e %.5e %.5e\n", arNums[0],


arNums[1], arNums[2] );

printf( "Multiplying 2 numbers 100 million times...\n" );

time( &start );

for( loop = 0; loop < 100000000; loop++ )

result = arNums[loop%3] * arNums[(loop+1)%3];

time( &finish );

elapsed_time = difftime( finish, start );

printf( "\nProgram takes %6.0f seconds.\n", elapsed_time );

Output

Using random floating point numbers 1.04749e+038 2.01482e+038 1.72737e+038

Multiplying 2 floating point numbers 100 million times...

Program takes 3 seconds.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Управление временем

time, _time32, _time64


div , ldiv , lldiv
Статья • 03.04.2023

Вычисляет частное и остаток от деления двух целочисленных значений.

Синтаксис
C

div_t div(

int numer,

int denom

);

ldiv_t ldiv(

long numer,

long denom

);

lldiv_t lldiv(

long long numer,

long long denom

);

C++

ldiv_t div(

long numer,

long denom

); /* C++ only */

lldiv_t div(

long long numer,

long long denom

); /* C++ only */

Параметры
numer

Числитель.

denom

Знаменатель.

Возвращаемое значение
div вызывается с помощью аргументов типа int , возвращает структуру типа

div_t , которая содержит кворот и оставшуюся часть. Возвращаемое значение с


аргументами типа long равно , а возвращаемое значение с аргументами типа long
long lldiv_t . ldiv_t ldiv_t lldiv_t И div_t типы определяются в <stdlib.h>.

Комментарии
Функция div делится numer на denom и вычисляет цитент и оставшуюся часть.
Структура div_t содержит частное ( quot ) и остаток ( rem ). Знак цитаты совпадает со
знаком математического кворента. Его абсолютное значение является крупнейшим
целым числом, которое меньше абсолютного значения математического кворента.
Если знаменатель равен 0, выполнение программы прекратится и появится
сообщение об ошибке.

Перегрузки, которые принимают аргументы div типа long или long long доступны
только для кода C++. Возвращаемые типы ldiv_t и lldiv_t содержат элементы quot ,
rem которые имеют те же значения, что и члены div_t .

Требования
Подпрограмма Обязательный заголовок

div , ldiv , lldiv <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_div.c

// arguments: 876 13

// This example takes two integers as command-line

// arguments and displays the results of the integer

// division. This program accepts two arguments on the

// command line following the program name, then calls

// div to divide the first argument by the second.

// Finally, it prints the structure members quot and rem.

//

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

int main( int argc, char *argv[] )

int x,y;

div_t div_result;

x = atoi( argv[1] );

y = atoi( argv[2] );

printf( "x is %d, y is %d\n", x, y );

div_result = div( x, y );

printf( "The quotient is %d, and the remainder is %d\n",

div_result.quot, div_result.rem );

Output

x is 876, y is 13

The quotient is 67, and the remainder is 5

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
imaxdiv
dup , dup2
Статья • 03.04.2023

Имена dup функций POSIX, реализованные корпорацией Майкрософт, являются


dup2 устаревшими псевдонимами для _dup функций и _dup2 функций. По
умолчанию они создают предупреждение компилятора (уровень 3) C4996. Имена
являются устаревшими, так как они не соответствуют стандартным правилам C для
имен, относящихся к реализации. Однако функции по-прежнему поддерживаются.

Мы рекомендуем использовать _dup и _dup2 вместо этого. Вы также можете


продолжать использовать эти имена функций и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_dup , _dup2
Статья • 03.04.2023

Создает второй дескриптор файла для открытого файла ( _dup ) или переназначает
дескриптор файла ( _dup2 ).

Синтаксис
C

int _dup( int fd );

int _dup2( int fd1, int fd2 );

Параметры
fd , fd1

Дескрипторы файлов, ссылающиеся на открытый файл.

fd2

Любой дескриптор файла.

Возвращаемое значение
Функция _dup возвращает новый дескриптор файла. Функция _dup2 возвращает 0 в
случае успеха. Если возникает ошибка, каждая функция возвращает значение -1 и
задает errno EBADF значение, если дескриптор файла недопустим, или EMFILE если
дескрипторы файлов недоступны. При передаче недопустимого дескриптора файла
функция также вызывает обработчик недопустимых параметров, как описано в
разделе "Проверка параметров".

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrnoи


_sys_nerr_sys_errlist.

Комментарии
Функции _dup и _dup2 связывают второй дескриптор файла с текущим открытым
файлом. Их можно использовать для связывания предопределенного дескриптора
файла, например stdout , с другим файлом. Операции с файлом можно выполнять с
использованием любого дескриптора файла. При создании нового дескриптора
тип доступа к файлу не изменяется. Функция _dup возвращает следующий
доступный дескриптор файла для указанного файла. Функция _dup2 принудительно
устанавливает fd2 на тот же файл, что и fd1 . Если во время вызова дескриптор fd2
связан с открытым файлом, этот файл закрывается.

Функции _dup и _dup2 принимают в качестве параметров дескрипторы файлов.


Чтобы передать поток ( FILE * ) в любую из этих функций, используйте _fileno.
Подпрограмма fileno возвращает дескриптор файла, в данный момент связанный
с заданным потоком. В следующем примере показано, как связать stderr
(определено как FILE * в stdio.h ) с дескриптором файла:

int cstderr = _dup( _fileno( stderr ));

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_dup <io.h>

_dup2 <io.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потоков, stdin stdout связанные с консолью, и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C могут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_dup.c

// This program uses the variable old to save

// the original stdout. It then opens a new file named

// DataFile and forces stdout to refer to it. Finally, it

// restores stdout to its original state.

#include <io.h>

#include <stdlib.h>

#include <stdio.h>

int main( void )

int old;

FILE *DataFile;

old = _dup( 1 ); // "old" now refers to "stdout"

// Note: file descriptor 1 == "stdout"

if( old == -1 )

perror( "_dup( 1 ) failure" );

exit( 1 );

_write( old, "This goes to stdout first\n", 26 );

if( fopen_s( &DataFile, "data", "w" ) != 0 )

puts( "Can't open file 'data'\n" );

exit( 1 );

// stdout now refers to file "data"

if( -1 == _dup2( _fileno( DataFile ), 1 ) )

perror( "Can't _dup2 stdout" );

exit( 1 );

puts( "This goes to file 'data'\n" );

// Flush stdout stream buffer so it goes to correct file

fflush( stdout );

fclose( DataFile );

// Restore original stdout

_dup2( old, 1 );

puts( "This goes to stdout\n" );

puts( "The file 'data' contains:" );

_flushall();

system( "type data" );

Output

This goes to stdout first

This goes to stdout

The file 'data' contains:

This goes to file 'data'

См. также раздел


Низкоуровневый ввод-вывод

_close

_creat, _wcreat

_open, _wopen
_dupenv_s , _wdupenv_s
Статья • 03.04.2023

Получает значение из текущей среды.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _dupenv_s(

char **buffer,

size_t *numberOfElements,

const char *varname

);

errno_t _wdupenv_s(

wchar_t **buffer,

size_t *numberOfElements,

const wchar_t *varname

);

Параметры
buffer

Буфер для хранения значения переменной.

numberOfElements

Размер buffer .

varname

Имя переменной среды.

Возвращаемое значение
Нуль при успешном выполнении, код ошибки при сбое.
Эти функции проверяют свои параметры; Если buffer или varname имеет значение
NULL , обработчик недопустимых параметров вызывается, как описано в разделе
Проверка параметров. Если выполнение может быть продолжено, функции задают
для errno значение EINVAL и возвращают EINVAL .

Если эти функции не могут выделить достаточно памяти, они устанавливают для и
buffer NULL numberOfElements значение 0 и возвращают . ENOMEM

Комментарии
Функция _dupenv_s выполняет поиск в списке переменных среды для varname . Если
переменная найдена, _dupenv_s выделяет буфер и копирует значение переменной
в буфер. Адрес и длина буфера возвращаются в buffer и numberOfElements .
Поскольку он выделяет сам буфер, _dupenv_s предоставляет более удобную
альтернативу , _wgetenv_s.getenv_s

7 Примечание

Программа вызова отвечает за освобождение памяти путем вызова free.

Если переменная не найдена, то buffer для параметра задано значение NULL ,


numberOfElements устанавливается значение 0, а возвращаемое значение равно 0,
так как эта ситуация не считается условием ошибки.

Если вас не интересует размер буфера, можно передать NULL для numberOfElements .

_dupenv_s не учитывает регистр в операционной системе Windows. _dupenv_s для


получения доступа к среде использует копию среды, на которую указывает
глобальная переменная _environ . Описание см. в примечаниях в getenv_s.
_wgetenv_s _environ

Значение параметра buffer является копией значения переменной среды; его


изменение не влияет на среду. Используйте функцию _putenv_s, _wputenv_s чтобы
изменить значение переменной среды.

_wdupenv_s — это версия _dupenv_s с расширенными символами; аргументы для


_wdupenv_s — это строки расширенных символов. Глобальная переменная

_wenviron — это версия _environ с расширенными символами. Дополнительные

сведения см _wenviron . в примечаниях в getenv_s. _wgetenv_s


По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tdupenv_s _dupenv_s _dupenv_s _wdupenv_s

Требования
Подпрограмма Обязательный заголовок

_dupenv_s <stdlib.h>

_wdupenv_s <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_dupenv_s.c

#include <stdlib.h>

int main( void )

char *pValue;

size_t len;

errno_t err = _dupenv_s( &pValue, &len, "pathext" );

if ( err ) return -1;

printf( "pathext = %s\n", pValue );

free( pValue );

err = _dupenv_s( &pValue, &len, "nonexistentvariable" );

if ( err ) return -1;

printf( "nonexistentvariable = %s\n", pValue );

free( pValue ); // It's OK to call free with NULL

Output
pathext = .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.pl

nonexistentvariable = (null)

См. также раздел


Управление процессами и средой

Константы среды

_dupenv_s_dbg, _wdupenv_s_dbg

getenv_s, _wgetenv_s

_putenv_s, _wputenv_s
_dupenv_s_dbg , _wdupenv_s_dbg
Статья • 03.04.2023

Получают значение из текущей среды. _dupenv_sВерсии , _wdupenv_s которые


выделяют память с _malloc_dbg для предоставления дополнительных сведений об
отладке.

Синтаксис
C

errno_t _dupenv_s_dbg(

char **buffer,

size_t *numberOfElements,

const char *varname,


int blockType,

const char *filename,

int lineNumber

);

errno_t _wdupenv_s_dbg(

wchar_t **buffer,

size_t * numberOfElements,

const wchar_t *varname,

int blockType,

const char *filename,

int lineNumber

);

Параметры
buffer

Буфер для хранения значения переменной.

numberOfElements

Размер buffer .

varname

Имя переменной среды.

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .


filename

Указатель на имя исходного файла или NULL .

lineNumber

Номер строки в исходном файле или NULL .

Возвращаемое значение
Нуль при успешном выполнении, код ошибки при сбое.

Эти функции проверяют свои параметры; Если buffer или varname имеет значение
NULL , обработчик недопустимых параметров вызывается, как описано в разделе

Проверка параметров. Если выполнение разрешено продолжать, функции


присваивают значение errno EINVAL и возвращают EINVAL .

Если эти функции не могут выделить достаточно памяти, они устанавливают для и
buffer NULL numberOfElements значение 0 и возвращают . ENOMEM

Комментарии
_dupenv_s_dbg Функции и _wdupenv_s_dbg идентичны _dupenv_s и _wdupenv_s за
исключением того, что при _DEBUG определении эти функции используют
отладочную версию malloc, _malloc_dbgдля выделения памяти для значения
переменной среды. Сведения о функциях отладки _malloc_dbg см. в разделе
_malloc_dbg.

В большинстве случаев не нужно вызывать эти функции явным образом. Вместо


этого можно определить флаг _CRTDBG_MAP_ALLOC . Если определен флаг
_CRTDBG_MAP_ALLOC , вызовы функций _dupenv_s и _wdupenv_s повторно
сопоставляются с _dupenv_s_dbg и _wdupenv_s_dbg соответственно, а для параметра
blockType задается флаг _NORMAL_BLOCK . Таким образом, вам не нужно вызывать эти
функции явным образом, если вы не хотите пометить блоки кучи как _CLIENT_BLOCK .
Дополнительные сведения о типах блоков см. в разделе Типы блоков в отладочной
куче.

Сопоставления подпрограмм с универсальным


текстом
Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные defined

_tdupenv_s_dbg _dupenv_s_dbg _dupenv_s_dbg _wdupenv_s_dbg

Требования
Подпрограмма Обязательный заголовок

_dupenv_s_dbg <crtdbg.h>

_wdupenv_s_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_dupenv_s_dbg.c

#include <stdlib.h>

#include <crtdbg.h>

int main( void )

char *pValue;

size_t len;

errno_t err = _dupenv_s_dbg( &pValue, &len, "pathext",

_NORMAL_BLOCK, __FILE__, __LINE__ );

if ( err ) return -1;

printf( "pathext = %s\n", pValue );

free( pValue );

err = _dupenv_s_dbg( &pValue, &len, "nonexistentvariable",

_NORMAL_BLOCK, __FILE__, __LINE__ );

if ( err ) return -1;

printf( "nonexistentvariable = %s\n", pValue );

free( pValue ); // It's OK to call free with NULL

Output

pathext = .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.pl

nonexistentvariable = (null)

См. также раздел


Управление процессами и средой

Константы среды

getenv_s, _wgetenv_s

_putenv_s, _wputenv_s
ecvt
Статья • 03.04.2023

Имя ecvt функции, зависят от Майкрософт, является устаревшим псевдонимом


_ecvt для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _ecvt или функцию с повышенным


_ecvt_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".
_ecvt
Статья • 03.04.2023

Преобразует число double в строку. Доступна более безопасная версия этой


функции; см. раздел _ecvt_s.

Синтаксис
C

char *_ecvt(

double value,

int count,

int *dec,

int *sign

);

Параметры
value

Число, которое требуется преобразовать.

count

Сохраненное число разрядов.

dec

Сохраненная позиция десятичной запятой.

sign

Знак преобразованного числа.

Возвращаемое значение
_ecvt возвращает указатель на строку цифр; NULL , если произошла ошибка.

Комментарии
Функция _ecvt преобразует число с плавающей запятой в строку символов.
Параметр value представляет собой преобразуемое число с плавающей запятой.
Эта функция сохраняет до count разрядов параметра value в виде строки и
добавляет нуль-символ ("\0"). Если количество разрядов в value превышает count ,
младший разряд округляется. Если количество разрядов меньше count , строка
дополняется нулями.

Общее число цифр, возвращаемых _ecvt не будет превышать _CVTBUFSIZE .

В строке сохраняются только цифры. Положение десятичной запятой и знак value


можно получить из параметров dec и sign после вызова. Параметр dec указывает
на целочисленное значение, отражающее положение десятичной запятой
относительно начала строки. Ноль или отрицательное целое число означают, что
десятичная запятая располагается слева от первой цифры. Параметр sign
указывает на целое число, определяющее знак преобразуемого числа. Если
целочисленное значение равно 0, число является положительным. В противном
случае число будет отрицательным.

Различие между функциями _ecvt и _fcvt заключается в интерпретации


параметра count . Функция _ecvt интерпретирует параметр count как общее число
цифр в выходной строке, а функция _fcvt интерпретирует параметр count как
количество цифр после десятичной запятой.

_ecvt и _fcvt используют для преобразования один статически выделенный


буфер. Каждый вызов одной из этих подпрограмм уничтожает результат
предыдущего вызова.

Эта функция проверяет свои параметры. Если dec или sign имеет NULL значение
count 0, вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение разрешено продолжать, errno
устанавливается значение EINVAL и NULL возвращается.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_ecvt <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_ecvt.c

// compile with: /W3

// This program uses _ecvt to convert a

// floating-point number to a character string.

#include <stdlib.h>

#include <stdio.h>

int main( void )

int decimal, sign;

char *buffer;

int precision = 10;

double source = 3.1415926535;

buffer = _ecvt( source, precision, &decimal, &sign ); // C4996

// Note: _ecvt is deprecated; consider using _ecvt_s instead

printf( "source: %2.10f buffer: '%s' decimal: %d sign: %d\n",

source, buffer, decimal, sign );

Output

source: 3.1415926535 buffer: '3141592654' decimal: 1 sign: 0

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l

_fcvt

_gcvt
_ecvt_s
Статья • 03.04.2023

Преобразует число double в строку. Эта функция является версией _ecvt с


усовершенствованиями безопасности, как описано в функциях безопасности в CRT.

Синтаксис
C

errno_t _ecvt_s(

char * buffer,

size_t sizeInBytes,

double value,

int count,

int *dec,

int *sign

);

template <size_t size>

errno_t _ecvt_s(

char (&buffer)[size],

double value,

int count,

int *dec,

int *sign

); // C++ only

Параметры
buffer

Заполняется указателем на строку разрядов, результат преобразования.

sizeInBytes

Размер буфера в байтах.

value

Число, которое требуется преобразовать.

count

Сохраненное число разрядов.

dec

Сохраненная позиция десятичной запятой.


sign

Знак преобразованного числа.

Возвращаемое значение
Нуль при успешном завершении. Возвращаемое значение — это код ошибки, если
произошел сбой. Коды ошибок определяются в файле ERRNO.H. Дополнительные
сведения см. в разделе errno, _doserrnoи _sys_errlist_sys_nerr.

Если существует недопустимый параметр, как указано в следующей таблице, эта


функция вызывает обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение разрешено продолжать, эта функция
задает значение errno EINVAL и возвращает значение EINVAL .

Условия ошибок

buffer sizeInBytes value count dec sign Возвращаемое Значение


значение в buffer

NULL any any any any any EINVAL Не


изменено.

Не NULL <=0 any any any any EINVAL Не


(указывает на изменено.
допустимую
память)

any any any any NULL any EINVAL Не


изменено.

any any any any any NULL EINVAL Не


изменено.

Проблемы с безопасностью
_ecvt_s может привести к нарушению доступа, если buffer не указывает на

допустимую память и не NULL является.

Комментарии
Функция _ecvt_s преобразует число с плавающей запятой в строку символов.
Параметр value представляет собой преобразуемое число с плавающей запятой.
Эта функция сохраняет до count разрядов параметра value в виде строки и
добавляет нуль-символ ("\0"). Если количество разрядов в value превышает count ,
младший разряд округляется. Если количество разрядов меньше count , строка
дополняется нулями.

В строке сохраняются только цифры. Положение десятичной запятой и знак value


можно получить из параметров dec и sign после вызова. Параметр dec указывает
на целочисленное значение, отражающее положение десятичной запятой
относительно начала строки. Ноль или отрицательное целое число означают, что
десятичная запятая располагается слева от первой цифры. Параметр sign
указывает на целое число, определяющее знак преобразуемого числа. Если
целочисленное значение равно 0, число является положительным. В противном
случае число будет отрицательным.

Буфер длины _CVTBUFSIZE достаточен для любого значения с плавающей запятой.

Различие между функциями _ecvt_s и _fcvt_s заключается в интерпретации


параметра count . Функция _ecvt_s интерпретирует параметр count как общее
число цифр в выходной строке, а функция _fcvt_s интерпретирует параметр count
как количество цифр после десятичной запятой.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Отладочная версия этой функции сначала заполняет буфер 0xFE. Чтобы отключить
это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_ecvt_s <stdlib.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// ecvt_s.c

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

int main( )

char * buf = 0;

int decimal;

int sign;

int err;

buf = (char*) malloc(_CVTBUFSIZE);

err = _ecvt_s(buf, _CVTBUFSIZE, 1.2, 5, &decimal, &sign);

if (err != 0)

printf("_ecvt_s failed with error code %d\n", err);

exit(1);

printf("Converted value: %s\n", buf);

Output

Converted value: 12000

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l

_ecvt

_fcvt_s

_gcvt_s
_endthread , _endthreadex
Статья • 03.04.2023

Завершает поток; _endthread завершает поток, созданный _beginthread и


_endthreadex завершающий поток, созданный _beginthreadex .

Синтаксис
C

void _endthread( void );

void _endthreadex(

unsigned retval

);

Параметры
retval

Код выхода потока.

Комментарии
Можно явно вызвать _endthread или _endthreadex , чтобы завершить поток; однако
_endthread или _endthreadex вызываются автоматически при возврате из
подпрограммы потока, переданного в качестве параметра в _beginthread или
_beginthreadex . Завершение потока вызовом функции endthread или _endthreadex

помогает обеспечить правильное восстановление ресурсов, выделяемых для


потока.

7 Примечание

Для исполняемого файла, связанного с Libcmt.lib, не вызывайте API Win32


ExitThread . Это предотвращает освобождение выделенных ресурсов системой
во время выполнения. _endthread и _endthreadex освобождают выделенные
ресурсы потока и затем вызывают метод ExitThread .

_endthread автоматически закрывает дескриптор потока. (Это поведение


отличается от Win32 ExitThread API.) Поэтому при использовании _beginthread и
_endthread не закрывайте дескриптор потока явным образом путем вызова API

Win32 CloseHandle .

Как и API Win32 ExitThread , _endthreadex не закрывает дескриптор потока.


Поэтому при использовании _beginthreadex и _endthreadex необходимо закрыть
дескриптор потока, вызвав API Win32 CloseHandle .

7 Примечание

_endthread и _endthreadex блокируют вызов деструкторов C++, ожидающих в


потоке.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

_endthread <process.h>

_endthreadex <process.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только многопоточные версии библиотек времени выполнения языка C .

Пример
См. пример для _beginthread.

См. также раздел


Управление процессами и средой

_beginthread, _beginthreadex
eof
Статья • 03.04.2023

Имя eof функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _eof функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _eof . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_eof
Статья • 03.04.2023

Проверяет конец файла (EOF).

Синтаксис
C

int _eof(

int fd

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

Возвращаемое значение
_eof возвращает значение 1, если текущая позиция является концом файла, или 0,
если это не так. Возвращаемое значение -1 указывает на ошибку; В этом случае
вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, errno
принимает значение EBADF , что указывает на недопустимый дескриптор файла.

Комментарии
Функция _eof определяет, достигнут ли конец файла, связанного с fd .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок Необязательный заголовок
Компонент Обязательный заголовок Необязательный заголовок

_eof <io.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_eof.c

// This program reads data from a file

// ten bytes at a time until the end of the

// file is reached or an error is encountered.

//

#include <io.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <share.h>

int main( void )

int fh, count, total = 0;

char buf[10];

if( _sopen_s( &fh, "crt_eof.txt", _O_RDONLY, _SH_DENYNO, 0 ) )

perror( "Open failed");

exit( 1 );

// Cycle until end of file reached:

while( !_eof( fh ) )

// Attempt to read in 10 bytes:

if( (count = _read( fh, buf, 10 )) == -1 )

perror( "Read error" );

break;

// Total actual bytes read

total += count;

printf( "Number of bytes read = %d\n", total );

_close( fh );

Входные данные: crt_eof.txt


Input
This file contains some text.

Вывод
Output

Number of bytes read = 29

См. также
Обработка ошибок

Низкоуровневый ввод-вывод

clearerr

feof

ferror

perror, _wperror
erf , erff , erfl , erfc , erfcf , erfcl
Статья • 03.04.2023

Вычисляет функцию ошибок или дополнительную функцию ошибок значения.

Синтаксис
C

double erf(

double x

);

float erf(

float x

); // C++ only

long double erf(

long double x

); // C++ only

float erff(

float x

);

long double erfl(

long double x

);

double erfc(

double x

);

float erfc(

float x

); // C++ only

long double erfc(

long double x

); // C++ only

float erfcf(

float x

);

long double erfcl(

long double x

);

#define erf(X) // Requires C11 or higher

#define erfc(X) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой.


Возвращаемое значение
Функция erf возвращает функцию Гаусса (нормального распределения) ошибок x .
Функция erfc возвращает дополнительную функцию Гаусса (нормального
распределения) ошибок x .

Комментарии
Функции erf вычисляют функцию x ошибки Gauss, определяемую следующим
образом:

Дополнительная функция ошибок Gauss определяется как 1 – erf(x). Функция erf


возвращает значение в диапазоне от -1,0 до 1,0. Ошибка не возвращается. Функция
erfc возвращает значение в диапазоне от 0 до 2. Если значение x слишком
большое для erfc , переменная errno задается равной ERANGE .

Так как C++ разрешает перегрузку, можно вызывать erf и erfc перегрузки,
которые принимают и возвращают long double float и типы. В программе C, если
вы не используете <макрос tgmath.h> для вызова этой функции, erf и erfc всегда
принимаете и не возвращаете . double

При использовании <макроса tgmath.h> erf() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

erf , erff , erfl , erfc , erfcf , erfcl <math.h>

erf Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Поддержка математических функций для чисел с плавающей запятой
execl
Статья • 03.04.2023

Имя execl функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом _execl для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execl . Или вы можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделах Отключение предупреждений и Имена функций POSIX.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execl , _wexecl
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execl(

const char *cmdname,


const char *arg0,

... const char *argn,

NULL

);

intptr_t _wexecl(

const wchar_t *cmdname,

const wchar_t *arg0,


... const wchar_t *argn,

NULL

);

Параметры
cmdname

Путь к выполняемому файлу.

arg0 , ... argN

Список указателей на параметры.

Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.
Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает


32 КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр (один или несколько параметров представляли собой


указатель null или пустую строку).

EMFILE Открыто слишком много файлов (необходимо открыть указанный файл, чтобы
определить, является ли он исполняемым).

ENOENT Файл или путь не найден.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; доступная память


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

Комментарии
Каждая из этих функций загружает и выполняет новый процесс, передавая все
аргументы командной строки как отдельные параметры. Первым аргументом
является имя команды или исполняемого файла, а второй должен быть таким же,
как первый. В процессе запуска он становится argv[0] . Третий аргумент — это
первый аргумент, argv[1] , выполняемого процесса.

Эти функции _execl проверяют свои параметры. Если или cmdname arg0 является
пустым указателем или пустой строкой, эти функции вызывают обработчик
недопустимых параметров, как описано в разделе Проверка параметров . Если
выполнение разрешено, эти функции устанавливают значение errno EINVAL и
возвращают значение -1. Новые процессы не выполняются.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_execl <process.h> <errno.h>

_wexecl <process.h> или <wchar.h> <errno.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _exec, _wexec functions.

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execle
Статья • 03.04.2023

Имя execle функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _execle для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execle . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execle , _wexecle
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execle(

const char *cmdname,


const char *arg0,

... const char *argn,

NULL,

const char *const *envp

);

intptr_t _wexecle(

const wchar_t *cmdname,

const wchar_t *arg0,


... const wchar_t *argn,

NULL,

const char *const *envp

);

Параметры
cmdname

Путь к выполняемому файлу.

arg0 , ... argN

Список указателей на параметры.

envp

Массив указателей на параметры среды.


Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.

Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает 32


КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр.

EMFILE Слишком много открытых файлов. (Чтобы определить, является ли он


исполняемым файлом, необходимо открыть указанный файл.)

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; повреждена доступная


память; или существует недопустимый блок, который указывает, что
вызывающий процесс не был выделен правильно.

Дополнительные сведения об этих кодах возврата см. в разделе errno,


_doserrno_sys_errlistи _sys_nerr.

Комментарии
Каждая из этих функций загружает и выполняет новый процесс и передает каждый
аргумент командной строки как отдельный параметр, а также передает массив
указателей на параметры среды.

Эти функции _execle проверяют свои параметры. Если cmdname или arg0 является
пустым указателем или пустой строкой, эти функции вызывают обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эти функции устанавливают для errno
значение EINVAL и возвращают -1. Ни один новый процесс не запущен.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_execle <process.h> <errno.h>

_wexecle <process.h> или <wchar.h> <errno.h>

Дополнительные сведения см. в разделе Совместимость.

Пример
См. пример в _execфункциях. _wexec

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execlp
Статья • 03.04.2023

Имя execlp функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _execlp функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execlp . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execlp , _wexeclp
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execlp(

const char *cmdname,


const char *arg0,

... const char *argn,

NULL

);

intptr_t _wexeclp(

const wchar_t *cmdname,

const wchar_t *arg0,


... const wchar_t *argn,

NULL

);

Параметры
cmdname

Путь к выполняемому файлу.

arg0 , ... argN

Список указателей на параметры.

Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.
Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает


32 КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр.

EMFILE Слишком много открытых файлов (указанный файл должен быть открыт, чтобы
определить, является ли он исполняемым).

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; доступная память


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

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций загружает и выполняет новый процесс и передает каждый
аргумент командной строки как отдельный параметр, а также использует
переменную среды PATH для поиска выполняемого файла.

Эти функции _execlp проверяют свои параметры. Если cmdname или arg0 является
пустым указателем или пустой строкой, эти функции вызывают обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эти функции устанавливают для errno
значение EINVAL и возвращают -1. Ни один новый процесс не запущен.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_execlp <process.h> <errno.h>

_wexeclp <process.h> или <wchar.h> <errno.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _execразделе " _wexec Функции".

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execlpe
Статья • 03.04.2023

Имя execlpe функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _execlpe функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execlpe . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execlpe , _wexeclpe
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execlpe(

const char *cmdname,


const char *arg0,

... const char *argn,

NULL,

const char *const *envp

);

intptr_t _wexeclpe(

const wchar_t *cmdname,

const wchar_t *arg0,


... const wchar_t *argn,

NULL,

const wchar_t *const *envp

);

Параметры
cmdname

Путь к выполняемому файлу.

arg0 , ... argN

Список указателей на параметры.

envp

Массив указателей на параметры среды.


Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.

Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает


32 КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр.

EMFILE Слишком много открытых файлов (указанный файл должен быть открыт, чтобы
определить, является ли он исполняемым).

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; доступная память


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

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций загружает и выполняет новый процесс и передает каждый
аргумент командной строки как отдельный параметр, а также передает массив
указателей на параметры среды. Для поиска выполняемого файла в таких функциях
используется переменная среды PATH .

Эти функции _execlpe проверяют свои параметры. cmdname Если одно или arg0
является пустым указателем или пустой строкой, эти функции вызывают
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, эти функции
устанавливают для errno значение EINVAL и возвращают -1. Ни один новый
процесс не запущен.
Требования
Компонент Обязательный заголовок Необязательный заголовок

_execlpe <process.h> <errno.h>

_wexeclpe <process.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _execразделе " _wexec Функции".

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execv
Статья • 03.04.2023

Имя execv функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _execv для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execv . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execv , _wexecv
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execv(

const char *cmdname,


const char *const *argv

);

intptr_t _wexecv(

const wchar_t *cmdname,

const wchar_t *const *argv

);

Параметры
cmdname

Путь к выполняемому файлу.

argv

Массив указателей на параметры.

Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.

Значение Описание
errno
Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает


32 КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр.

EMFILE Слишком много открытых файлов (указанный файл должен быть открыт, чтобы
определить, является ли он исполняемым).

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; повреждена доступная


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

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Каждая из этих функций загружает и выполняет новый процесс, передавая ему
массив указателей на аргументы командной строки.

Эти функции _execv проверяют свои параметры. Если cmdname это пустой указатель
или argv если это пустой указатель, указатель на пустой массив или если массив
содержит пустую строку в качестве первого аргумента, функции вызывают
обработчик недопустимых параметров, _execv как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, эти функции
устанавливают для errno значение EINVAL и возвращают -1. Ни один процесс не
запущен.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок Необязательный заголовок
Компонент Обязательный заголовок Необязательный заголовок

_execv <process.h> <errno.h>

_wexecv <process.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _execфункциях. _wexec

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execve
Статья • 03.04.2023

Имя execve функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _execve для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execve . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execve , _wexecve
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execve(

const char *cmdname,


const char *const *argv,

const char *const *envp

);

intptr_t _wexecve(

const wchar_t *cmdname,

const wchar_t *const *argv,

const wchar_t *const *envp

);

Параметры
cmdname

Путь к выполняемому файлу.

argv

Массив указателей на параметры.

envp

Массив указателей на параметры среды.

Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.

Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает


32 КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр.

EMFILE Слишком много открытых файлов (указанный файл должен быть открыт, чтобы
определить, является ли он исполняемым).

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; доступная память


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

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций загружает и выполняет новый процесс, передавая ему
массив указателей на аргументы командной строки и массив указателей на
параметры среды.

Функции _execve и _wexecve проверяют свои параметры. Эти функции вызывают


обработчик недопустимых параметров, как описано в разделе "Проверка
параметров", когда:

cmdname является пустым указателем,


argv — это либо пустой указатель, либо указатель на пустой массив.

Массив содержит пустую строку в качестве первого аргумента.

Если выполнение может продолжаться обработчиком, эти функции задают errno


значение EINVAL ,и возвращают -1. Ни один процесс не запущен.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_execve <process.h> <errno.h>

_wexecve <process.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _execразделе " _wexec Функции".

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execvp
Статья • 03.04.2023

Имя execvp функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _execvp функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execvp . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execvp , _wexecvp
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execvp(

const char *cmdname,


const char *const *argv

);

intptr_t _wexecvp(

const wchar_t *cmdname,

const wchar_t *const *argv

);

Параметры
cmdname

Путь к выполняемому файлу.

argv

Массив указателей на параметры.

Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.

Значение Описание
errno
Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает


32 КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EINVAL Недопустимый параметр.

EMFILE Слишком много открытых файлов (указанный файл должен быть открыт, чтобы
определить, является ли он исполняемым).

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; доступная память


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

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

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

Эти функции _execvp проверяют свои параметры. Эти функции вызывают


обработчик недопустимых параметров, как описано в разделе "Проверка
параметров", когда:

cmdname является пустым указателем,

argv — это либо пустой указатель, либо указатель на пустой массив.


Массив содержит пустую строку в качестве первого аргумента.

Если выполнение может продолжаться обработчиком, эти функции задают errno


значение EINVAL ,и возвращают -1. Ни один процесс не запущен.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.
Требования
Компонент Обязательный заголовок Необязательный заголовок

_execvp <process.h> <errno.h>

_wexecvp <process.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _execразделе " _wexec Функции".

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
execvpe
Статья • 03.04.2023

Имя execvpe функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _execvpe функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _execvpe . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_execvpe , _wexecvpe
Статья • 03.04.2023

Загружает и выполняет новые дочерние процессы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _execvpe(

const char *cmdname,


const char *const *argv,

const char *const *envp

);

intptr_t _wexecvpe(

const wchar_t *cmdname,

const wchar_t *const *argv,

const wchar_t *const *envp

);

Параметры
cmdname

Путь к выполняемому файлу.

argv

Массив указателей на параметры.

envp

Массив указателей на параметры среды.

Возвращаемое значение
В случае успешного выполнения эти функции не возвращаются в вызывающий
процесс. Возвращаемое значение -1 указывает на ошибку, в этом случае errno
задается глобальная переменная.

Значение Описание
errno

E2BIG Пространство, требуемое для аргументов и параметров среды, превышает 32


КБ.

EACCES Указанный файл имеет нарушение блокировки или общего доступа.

EMFILE Слишком много открытых файлов. (Чтобы определить, является ли он


исполняемым файлом, необходимо открыть указанный файл.)

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса; повреждена доступная


память; или существует недопустимый блок, который указывает, что
вызывающий процесс не был выделен правильно.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Каждая из этих функций создает и выполняет новый процесс, передавая ему
массив указателей на аргументы командной строки и массив указателей на
параметры среды. Для поиска выполняемого файла в таких функциях используется
переменная среды PATH .

Эти функции _execvpe проверяют свои параметры. Эти функции вызывают


обработчик недопустимых параметров, как описано в разделе "Проверка
параметров", когда:

cmdname является пустым указателем,

argv является пустым указателем или указателем на пустой массив.

Массив содержит пустую строку в качестве первого аргумента.

Если обработчику разрешено выполнение, эти функции задают значение


errno EINVAL ,и возвращают значение -1. Ни один процесс не запущен.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Компонент Обязательный заголовок Необязательный заголовок

_execvpe <process.h> <errno.h>

_wexecvpe <process.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _execфункциях. _wexec

См. также раздел


Управление процессами и средой

_exec, _wexec функции

abort

atexit

exit, _Exit, _exit

_onexit, _onexit_m

_spawn, _wspawn функции

system, _wsystem
exit , _Exit , _exit
Статья • 03.04.2023

Завершает вызывающий процесс. Функция exit завершает его после очистки;


_exit и _Exit завершают его мгновенно.

7 Примечание

Не используйте этот метод для завершения работы приложения


универсальная платформа Windows (UWP), за исключением сценариев
тестирования или отладки. Программные или пользовательские способы
закрытия приложения Магазина запрещены в соответствии с политиками
Microsoft Store. Дополнительные сведения см. в статье о жизненном цикле
приложений UWP. Дополнительные сведения о приложениях UWP см. в
универсальная платформа Windows документации.

Синтаксис
C

void exit(

int const status

);

void _Exit(

int const status

);

void _exit(

int const status

);

Параметры
status

Код состояния завершения.

Комментарии
Функции exit , _Exit и _exit завершают вызывающий процесс. Функция exit
вызывает деструкторы для объектов локального потока, а затем вызывает в
порядке "последним пришел — первым вышел" (LIFO) функции,
зарегистрированные atexit и _onexit , а затем очищает все файловые буферы
перед завершением процесса. Функции _Exit и _exit завершают процесс без
удаления объектов локального потока или обработки функций atexit или _onexit
, а также без очистки буферов потока.

exit _Exit Хотя и _exit вызовы не возвращают значение, значение status

становится доступным для среды узла или ожидающего вызова, если таковой
существует, после завершения процесса. Как правило, вызывающая функция задает
для status значение 0 для указания нормального завершения или принимает
другое значение для указания ошибки. Значение status становится доступным для
пакетной команды операционной системы ERRORLEVEL и представлено одной из
двух констант: EXIT_SUCCESS , которая представляет значение 0, или EXIT_FAILURE ,
которая представляет значение 1.

Функции exit , _Exit , _exit , quick_exit , _cexit и _c_exit ведут себя следующим
образом.

Функция Описание

exit Выполняет полные процедуры завершения библиотеки C, завершает процесс и


предоставляет полученный код состояния среде узла.

_Exit Выполняет минимальные процедуры завершения библиотеки C, завершает


процесс и предоставляет полученный код состояния среде узла.

_exit Выполняет минимальные процедуры завершения библиотеки C, завершает


процесс и предоставляет полученный код состояния среде узла.

quick_exit Выполняет быстрые процедуры завершения библиотеки C, завершает процесс


и предоставляет полученный код состояния среде узла.

_cexit Выполняет полные процедуры завершения библиотеки C и возвращает


управление вызывающему объекту. Не завершает процесс.

_c_exit Выполняет минимальные процедуры завершения библиотеки C и возвращает


управление вызывающему объекту. Не завершает процесс.

При вызове exit _Exit функции деструкторы _exit для любых временных или
автоматических объектов, которые существуют во время вызова, не вызываются.
Автоматический объект — это нестатический локальный объект, определенный в
функции. Временный объект — это объект, созданный компилятором, например
значение, возвращаемое вызовом функции. Чтобы уничтожить автоматический
объект перед вызовом exit _Exit или _exit явным образом вызвать деструктор для
объекта, как показано ниже:
C++

void last_fn() {}

struct SomeClass {} myInstance{};

// ...

myInstance.~SomeClass(); // explicit destructor call

exit(0);

Не используйте для DLL_PROCESS_ATTACH вызова exit из DllMain . Чтобы выйти из


DLLMain функции, вернитесь FALSE из DLL_PROCESS_ATTACH .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

exit , _Exit , _exit <process.h> или <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_exit.c

// This program returns an exit code of 1. The

// error code could be tested in a batch file.

#include <stdlib.h>

int main( void )

exit( 1 );

См. также раздел


Управление процессами и средой

abort

atexit

_cexit, _c_exit

_exec, _wexec функции

_onexit, _onexit_m

quick_exit

_spawn, _wspawn функции

system, _wsystem
exp , expf , expl
Статья • 03.04.2023

Вычисляет экспоненту.

Синтаксис
C

double exp(

double x

);

float exp(

float x

); // C++ only

long double exp(

long double x

); // C++ only

float expf(

float x

);

long double expl(

long double x

);

#define exp(z) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой для экспоненциации естественного логарифма на


основе e .

Возвращаемое значение
При exp успешном выполнении функции возвращают экспоненциальное значение
параметра x с плавающей запятой. То есть результатом является e x , где e является
основанием естественного логарифма. При переполнении функция возвращает
INF (бесконечность), а при переполнении exp — 0.

Входные данные Исключение SEH _matherr Исключение

± Тихий NaN, неопределенный Нет _DOMAIN


Входные данные Исключение SEH _matherr Исключение

± Бесконечность INVALID _DOMAIN

x ≥ 7,097827e+002 INEXACT + OVERFLOW OVERFLOW

x ≤ -7,083964e+002 INEXACT + UNDERFLOW UNDERFLOW

Функция exp имеет реализацию, которая использует расширения SIMD потоковой


передачи 2 (SSE2). Сведения и ограничения по использованию реализации SSE2 см
_set_SSE2_enable . в этой статье.

Комментарии
C++ допускает перегрузку, поэтому можно вызывать перегрузки exp , которые
принимают float аргумент или long double . В программе C, если вы не
используете <tgmath.h> макрос для вызова этой функции, exp всегда принимает и
возвращает double .

Если вы используете exp макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Обязательный заголовок C Обязательный заголовок C++

exp , expf , expl <math.h> <cmath> или <math.h>

exp Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_exp.c

#include <math.h>

#include <stdio.h>

int main( void )

double x = 2.302585093, y;

y = exp( x );

printf( "exp( %f ) = %f\n", x, y );

Output

exp( 2.302585 ) = 10.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
log, logf, log10, log10f

_CIexp
exp2 , exp2f , exp2l
Статья • 03.04.2023

Вычисляет 2, поднятое до указанного значения.

Синтаксис
C

double exp2(

double x

);

float exp2(

float x

); // C++ only

long double exp2(

long double x

); // C++ only

float exp2f(

float x

);

long double exp2l(

long double x

);

#define exp2(X) // Requires C11 or higher

Параметры
x

Значение экспоненты.

Возвращаемое значение
В случае успешного x выполнения возвращает экспонент base-2, то есть 2x. В
противном случае возвращается одно из следующих значений:

Проблема Возвращает

x = ±0 1
Проблема Возвращает

x = -INFINITY +0

x = +INFINITY +INFINITY

x = не число не число

Ошибка переполнения диапазона +HUGE_VAL, +HUGE_VALF или +HUGE_VALL

Ошибка недостаточного заполнения диапазона Правильный результат после округления

Об ошибках сообщается, как указано в _matherr.

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции exp2 ,
принимающие и возвращающие типы float и long double . В программе C, если вы
не используете <макрос tgmath.h> для вызова этой функции, exp2 всегда
принимает и возвращает значение double , если только макрос не используется в
<tgmath.h>.

При использовании <макроса tgmath.h> exp2() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Заголовок C Заголовок C++

exp2 , expf2 , expl2 <math.h> <cmath>

exp2 Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

exp, expf, expllog2, log2f, log2l


_expand
Статья • 02.12.2022

Изменяет размер блока памяти.

Синтаксис
C

void *_expand(

void *memblock,

size_t size

);

Параметры
memblock

Указатель на ранее выделенный блок памяти.

size

Новый размер в байтах.

Возвращаемое значение
Функция _expand возвращает указатель на перераспределенный блок памяти.
_expand в отличие от realloc нее, не удается переместить блок, чтобы изменить его

размер. Таким образом, если доступно достаточно памяти для расширения блока
без его перемещения, параметр _expand будет таким же, memblock как и
возвращаемое значение.

При обнаружении ошибки во время работы функции _expand она возвращает


значение NULL . Например, если функция _expand используется, чтобы сжать блок
памяти, она может обнаружить повреждение в куче с малыми блоками или
недопустимый указатель блока и вернуть значение NULL .

Если недостаточно памяти, чтобы развернуть блок без его перемещения, функция
возвращается NULL . Функция _expand никогда не возвращает блок, увеличенный до
меньшего размера, чем было запрошено. Если происходит сбой, параметр errno
указывает характер ошибки. Дополнительные сведения о errno , см. в разделе errno,
, _doserrno_sys_errlistи _sys_nerr.

Возвращаемое значение указывает на дисковое пространство, подходящее для


хранения любого типа объекта. Чтобы проверить новый размер элемента,
используйте функцию _msize . Чтобы получить указатель на тип, отличный от void ,
используйте приведение типов для возвращаемого значения.

Комментарии
Функция _expand изменяет размер блока ранее выделенного блока памяти,
пытаясь увеличить или уменьшить блок без его перемещения в куче. Параметр
memblock указывает на начало блока. Параметр size указывает новый размер

блока в байтах. Содержимое блока в пределах наименьшего из нового и старого


размеров остается неизменным. memblock не должен быть блоком, который был
освобожден.

7 Примечание

На 64-разрядных платформах функция _expand может не изменить блок, если


новый размер меньше, чем текущий размер; в частности, если размер блока
был меньше 16 КБ и, следовательно, блок был размещен в куче низкой
фрагментации, функция _expand оставляет блок без изменений и возвращает
memblock .

Если приложение связано с отладочной версией библиотек времени выполнения


C, _expand разрешается в _expand_dbg. Дополнительные сведения об управлении
кучей во время отладки см. в разделе "Куча отладки CRT".

Эта функция проверяет свои параметры. Если memblock это пустой указатель, эта
функция вызывает обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, параметр
errno устанавливается в значение EINVAL , и функция возвращает значение NULL .
Если size значение больше _HEAP_MAXREQ , errno задано значение ENOMEM , а функция
возвращает . NULL

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.
Требования
Компонент Обязательный заголовок

_expand <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_expand.c

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

int main( void )

char *bufchar;

printf( "Allocate a 512 element buffer\n" );

if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )

exit( 1 );

printf( "Allocated %d bytes at %Fp\n",

_msize( bufchar ), (void *)bufchar );

if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )

printf( "Can't expand" );

else

printf( "Expanded block to %d bytes at %Fp\n",

_msize( bufchar ), (void *)bufchar );

// Free memory

free( bufchar );

exit( 0 );

Output

Allocate a 512 element buffer

Allocated 512 bytes at 002C12BC

Expanded block to 1024 bytes at 002C12BC

См. также раздел


Выделение памяти

calloc

free

malloc

_msize

realloc
_expand_dbg
Статья • 03.04.2023

Изменяет размер указанного блока памяти в куче путем его расширения или
сжатия (только отладочная версия).

Синтаксис
C

void *_expand_dbg(

void *userData,

size_t newSize,

int blockType,

const char *filename,

int lineNumber

);

Параметры
userData

Указатель на ранее выделенный блок памяти.

newSize

Запрашиваемый новый размер для блока (в байтах).

blockType

Запрашиваемый тип для блока с измененным размером: _CLIENT_BLOCK или


_NORMAL_BLOCK .

filename

Указатель на имя исходного файла, который запросил операцию расширения, или


NULL .

lineNumber

Номер строки в исходном файле, где была запрошена операция расширения, или
NULL .

filename Параметры и lineNumber доступны только при _expand_dbg явном вызове

или определении _CRTDBG_MAP_ALLOC константы препроцессора.


Возвращаемое значение
При успешном завершении _expand_dbg возвращает указатель на блок памяти,
размер которого изменен. Так как память не перемещается, адрес совпадает с
адресом userData. Если произошла ошибка или блок не удалось развернуть до
запрошенного размера, возвращается NULL . Если происходит сбой, errno содержит
сведения из операционной системы о причине сбоя. Дополнительные сведения о
errno см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функция _expand_dbg является отладочной версией функции _expand . Если _DEBUG
параметр не определен, каждый вызов _expand_dbg сводится к вызову _expand .
Функции _expand и _expand_dbg изменяют размер блока памяти в базовой куче, но
возможность _expand_dbg поддерживает несколько возможностей отладки: буферы
по обеим сторонам пользовательского участка блока для тестирования на наличие
утечек, параметр типа блока для отслеживания определенных типов выделения
памяти и сведения filename / lineNumber для определения источника запросов
выделения памяти.

_expand_dbg изменяет размер указанного блока памяти, выделяя под него немного

больше пространства, чем запрашивается в newSize . newSize может быть больше


или меньше размера первоначально выделенного блока памяти. Дополнительное
пространство используется диспетчером отладочной кучи для связывания блоков
отладочной памяти и предоставления приложению сведений о заголовках отладки
и перезаписи буферов. Изменение размера достигается либо расширением, либо
сжатием исходного блока памяти. _expand_dbg не перемещает блок памяти, как и
_realloc_dbg функция .

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

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и отладочными версиями см. в разделе Отладка версий функций выделения
кучи.
Эта функция проверяет свои параметры. Если userData является пустым указателем
или размер больше _HEAP_MAXREQ , эта функция вызывает обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, параметр errno устанавливается в значение EINVAL , и функция
возвращает значение NULL .

Требования
Подпрограмма Обязательный заголовок

_expand_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C

// crt_expand_dbg.c

//

// This program allocates a block of memory using _malloc_dbg

// and then calls _msize_dbg to display the size of that block.

// Next, it uses _expand_dbg to expand the amount of

// memory used by the buffer and then calls _msize_dbg again to

// display the new amount of memory allocated to the buffer.

//

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <crtdbg.h>

int main( void )

long *buffer;

size_t size;

// Call _malloc_dbg to include the filename and line number

// of our allocation request in the header

buffer = (long *)_malloc_dbg( 40 * sizeof(long),

_NORMAL_BLOCK, __FILE__, __LINE__ );

if( buffer == NULL )


exit( 1 );

// Get the size of the buffer by calling _msize_dbg

size = _msize_dbg( buffer, _NORMAL_BLOCK );

printf( "Size of block after _malloc_dbg of 40 longs: %u\n", size );

// Expand the buffer using _expand_dbg and show the new size

buffer = (long *)_expand_dbg( buffer, size + sizeof(long),

_NORMAL_BLOCK, __FILE__, __LINE__ );

if( buffer == NULL )


exit( 1 );

size = _msize_dbg( buffer, _NORMAL_BLOCK );

printf( "Size of block after _expand_dbg of 1 more long: %u\n",

size );

free( buffer );

exit( 0 );

Output

Size of block after _malloc_dbg of 40 longs: 160

Size of block after _expand_dbg of 1 more long: 164

Комментировать
Вывод этой программы зависит от того, способен ли ваш компьютер расширить
все разделы. Если все разделы развернуты, результат отражается в секции вывода.

См. также раздел


Подпрограммы отладки

_malloc_dbg
expm1 , expm1f , expm1l
Статья • 03.04.2023

Вычисляет экспоненту значения с основанием e минус один.

Синтаксис
C

double expm1(

double x

);

float expm1(

float x

); // C++ only

long double expm1(

long double x

); // C++ only

float expm1f(

float x

);

long double expm1l(

long double x

);

#define expm1(X) // Requires C11 or higher

Параметры
x

Значение экспоненты с плавающей запятой.

Возвращаемое значение
При expm1 успешном выполнении функции возвращают значение с плавающей
запятой, представляющее ex - 1. При переполнении expm1 возвращает HUGE_VAL ,
expm1f возвращает HUGE_VALF , expm1l возвращает HUGE_VALL , а errno принимает
значение ERANGE . Дополнительные сведения о кодах возврата см. в разделе errno,
_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки expm1 , которые
принимают и возвращают значения float и long double . Если вы не используете
<макрос tgmath.h> в программе C для вызова этой функции, expm1 всегда
принимает и возвращает значение double .

При использовании <макроса tgmath.h> expm1() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

Требования
Подпрограмма Обязательный заголовок

expm1 , expm1f , expm1l <math.h>

expm1 Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
exp2, exp2f, exp2l

pow, powf, powl


fabs , fabsf , fabsl
Статья • 03.04.2023

Вычисляет абсолютное значение аргумента с плавающей точкой.

Синтаксис
C

double fabs(

double x

);

float fabs(

float x

); // C++ only

long double fabs(

long double x

); // C++ only

float fabsf(

float x

);

long double fabsl(

long double x

);

#define fabs(X) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функции fabs возвращают абсолютное значение аргумента x . Ошибка не
возвращается.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

Комментарии
C++ допускает перегрузку, поэтому при включении заголовка fabs можно
вызывать перегрузки <cmath> . В программе C, если вы не используете <tgmath.h>
макрос для вызова этой функции, fabs всегда принимает и возвращает double .

Если вы используете fabs макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Обязательный заголовок C Обязательный заголовок C++

fabs , fabsf , fabsl <math.h> <cmath> или <math.h>

fabs Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для abs.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
abs, labs, llabs, _abs64

_cabs
fclose , _fcloseall
Статья • 03.04.2023

Закрывает поток ( fclose ) или все открытые потоки ( _fcloseall ).

Синтаксис
C

int fclose(

FILE *stream

);

int _fcloseall( void );

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
Функция fclose возвращает 0, если поток был успешно закрыт. Функция _fcloseall
возвращает общее количество закрытых потоков. Обе функции возвращают EOF
для указания на ошибку.

Комментарии
Функция fclose закрывает stream . В противном stream случае NULL вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, функция fclose
присваивает errno значение EINVAL и возвращает EOF . Перед вызовом этой
функции рекомендуется всегда проверять stream указатель.

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Функция _fcloseall закрывает все открытые потоки, кроме stdin , stdout , stderr (а
в MS-DOS также _stdaux и _stdprn ). Она также закрывает и удаляет все временные
файлы, созданные tmpfile . При использовании обеих функций все буферы,
связанные с потоком, перед закрытием сбрасываются. При закрытии потока
выделенные системой буферы освобождаются. Буферы, назначенные
пользователем и setbuf setvbuf не освобождаются автоматически.

7 Примечание

Когда fclose или _fcloseall функции используются для закрытия потока,


базовый дескриптор файла и дескриптор OS (или сокет) также закрываются.
Таким образом, если файл был первоначально открыт как дескриптор файла
или дескриптор файла и закрыт с fclose помощью , не вызывайте также вызов
_close для закрытия дескриптора файла; и не вызывайте функцию CloseHandle
Win32, чтобы закрыть дескриптор файла.

Функции fclose и _fcloseall включают код для защиты от помех от других


потоков. Сведения о неблокирующей версии fclose см. в описании функции
_fclose_nolock .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

fclose <stdio.h>

_fcloseall <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для fopen.

См. также раздел


Потоковый ввод-вывод

_close

_fdopen, _wfdopen

fflush

fopen, _wfopen

freopen, _wfreopen
_fclose_nolock
Статья • 03.04.2023

Закрывает поток без блокировки.

Синтаксис
C

int _fclose_nolock(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
Функция _fclose_nolock возвращает 0, если поток был успешно закрыт. Возвращает
EOF для указания ошибки.

Комментарии
Эта функция представляет собой неблокирующую версию функции fclose . Он
идентичен, за исключением того, что он не защищен от вмешательства другими
потоками. Это может быть быстрее, так как это не приводит к дополнительным
издержкам блокировки других потоков. Используйте эту функции только в
потокобезопасных контекстах, например в однопоточных приложениях или если
вызываемая область уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_fclose_nolock <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

_close

_fdopen, _wfdopen

fflush

fopen, _wfopen

freopen, _wfreopen
fcloseall
Статья • 03.04.2023

Имя fcloseall функции, зависят от Майкрософт, является устаревшим


псевдонимом _fcloseall для функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _fcloseall . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
fcvt
Статья • 03.04.2023

Имя fcvt функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _fcvt функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _fcvt функцию с расширенным уровнем


_fcvt_s безопасности. Вы также можете продолжать использовать это имя функции
и отключить предупреждение. Дополнительные сведения см. в разделе
"Отключение имен предупреждений и функций POSIX".
_fcvt
Статья • 03.04.2023

Преобразует число с плавающей запятой в строку. Доступна более безопасная


версия этой функции; см. раздел _fcvt_s.

Синтаксис
C

char *_fcvt(

double value,

int count,

int *dec,

int *sign

);

Параметры
value

Число, которое требуется преобразовать.

count

Число разрядов после десятичной запятой.

dec

Указатель на сохраненную позицию десятичной запятой.

sign

Указатель на сохраненный индикатор знака.

Возвращаемое значение
_fcvt возвращает указатель на строку цифр NULL при ошибке.

Комментарии
Функция _fcvt преобразует число с плавающей запятой в строку, завершаемую
нуль-символом. Параметр value представляет собой преобразуемое число с
плавающей запятой. Функция _fcvt сохраняет цифры параметра value в виде
строки и добавляет нуль-символ ("\0"). Параметр count определяет количество
цифр, сохраняемых после десятичной запятой. Избыточные цифры округляются до
count знаков. Если количество цифр меньше точности count , строка дополняется

нулями.

Общее число цифр, возвращаемых _fcvt не будет превышать _CVTBUFSIZE .

В строке сохраняются только цифры. Положение десятичной запятой и знак value


можно получить из параметров dec и sign после вызова. Параметр dec указывает
на целочисленное значение; это целочисленное значение представляет положение
десятичной запятой относительно начала строки. Ноль или отрицательное целое
число означают, что десятичная запятая располагается слева от первой цифры.
Параметр sign указывает на целое число, обозначающее знак величины value .
Целое число имеет значение 0, если значение value положительное, и ненулевое
значение, если значение value отрицательное.

Различие между функциями _ecvt и _fcvt заключается в интерпретации


параметра count . Функция _ecvt интерпретирует параметр count как общее число
цифр в выходной строке, а функция _fcvt интерпретирует параметр count как
количество цифр после десятичной запятой.

_ecvt и _fcvt используют для преобразования один статически выделенный

буфер. Каждый вызов одной из этих подпрограмм уничтожает результат


предыдущего вызова.

Эта функция проверяет свои параметры. Если dec или sign имеет NULL значение
count 0, вызывается обработчик недопустимых параметров, как описано в разделе

"Проверка параметров". Если выполнение разрешено продолжать, errno


установлено значение EINVAL и NULL возвращается.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_fcvt <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_fcvt.c

// compile with: /W3

// This program converts the constant

// 3.1415926535 to a string and sets the pointer

// buffer to point to that string.

#include <stdlib.h>

#include <stdio.h>

int main( void )

int decimal, sign;

char *buffer;

double source = 3.1415926535;

buffer = _fcvt( source, 7, &decimal, &sign ); // C4996

// Note: _fcvt is deprecated; consider using _fcvt_s instead

printf( "source: %2.10f buffer: '%s' decimal: %d sign: %d\n",

source, buffer, decimal, sign );

Output

source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l

_ecvt

_gcvt
_fcvt_s
Статья • 03.04.2023

Преобразует число с плавающей запятой в строку. Эта функция представляет


собой версию _fcvt с усовершенствованиями безопасности, как описано в разделе
"Функции безопасности" в CRT.

Синтаксис
C

errno_t _fcvt_s(

char* buffer,

size_t sizeInBytes,

double value,

int count,

int *dec,

int *sign

);

template <size_t size>

errno_t _fcvt_s(

char (&buffer)[size],

double value,

int count,

int *dec,

int *sign

); // C++ only

Параметры
buffer

Предоставленный буфер, в который помещается результат преобразования.

sizeInBytes

Размер буфера в байтах.

value

Число, которое требуется преобразовать.

count

Число разрядов после десятичной запятой.

dec

Указатель на сохраненную позицию десятичной запятой.


sign

Указатель на сохраненный индикатор знака.

Возвращаемое значение
Нуль при успешном завершении. Возвращаемое значение — это код ошибки, если
произошел сбой. Коды ошибок определены в . errno.h Список этих ошибок см. в
разделе errno, и _doserrno_sys_errlist_sys_nerr.

Если имеется недопустимый параметр, как указано в следующей таблице, эта


функция вызывает обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, эта функция
задает для errno значение EINVAL и возвращает EINVAL .

Условия ошибок

buffer sizeInBytes value count dec sign Возвращает Значение


в buffer

NULL any any any any any EINVAL Не


изменено.

Не NULL (указывает <=0 any any any any EINVAL Не


на допустимую изменено.
память)

any any any any NULL any EINVAL Не


изменено.

any any any any any NULL EINVAL Не


изменено.

Проблемы с безопасностью
_fcvt_s может привести к нарушению доступа, если buffer не указывает на

допустимую память и не является NULL .

Комментарии
Функция _fcvt_s преобразует число с плавающей запятой в строку, завершаемую
нуль-символом. Параметр value представляет собой преобразуемое число с
плавающей запятой. Функция _fcvt_s сохраняет цифры параметра value в виде
строки и добавляет нуль-символ ("\0"). Параметр count определяет количество
цифр, сохраняемых после десятичной запятой. Избыточные цифры округляются до
count знаков. Если количество цифр меньше точности count , строка дополняется

нулями.

В строке сохраняются только цифры. Положение десятичной запятой и знак value


можно получить из параметров dec и sign после вызова. Параметр dec указывает
на целочисленное значение; это целочисленное значение представляет положение
десятичной запятой относительно начала строки. Ноль или отрицательное целое
число означают, что десятичная запятая располагается слева от первой цифры.
Параметр sign указывает на целое число, обозначающее знак величины value .
Целое число имеет значение 0, если значение value положительное, и ненулевое
значение, если значение value отрицательное.

Буфер длины _CVTBUFSIZE достаточен для любого значения с плавающей запятой.

Различие между функциями _ecvt_s и _fcvt_s заключается в интерпретации


параметра count . _ecvt_s count интерпретируется как общее число цифр в
выходной строке и _fcvt_s интерпретируется count как число цифр после
десятичной запятой.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Отладочная версия этой функции сначала заполняет буфер 0xFE. Чтобы отключить
это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_fcvt_s <stdlib.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Все версии библиотек среды выполнения C.


Пример
C

// fcvt_s.c

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

int main()

char * buf = 0;

int decimal;

int sign;

int err;

buf = (char*) malloc(_CVTBUFSIZE);

err = _fcvt_s(buf, _CVTBUFSIZE, 1.2, 5, &decimal, &sign);

if (err != 0)

printf("_fcvt_s failed with error code %d\n", err);

exit(1);

printf("Converted value: %s\n", buf);

Output

Converted value: 120000

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l

_ecvt_s

_gcvt_s

_fcvt
fdim , fdimf , fdiml
Статья • 03.04.2023

Определяет положительную разность между первым и вторым значениями.

Синтаксис
C

double fdim(

double x,

double y

);

float fdim(

float x,

float y

); //C++ only

long double fdim(

long double x,

long double y

); //C++ only

float fdimf(

float x,

float y

);

long double fdiml(

long double x,

long double y

);

#define fdim(X) // Requires C11 or higher

Параметры
x

Первое значение в вычитании.

Второе значение в вычитании.

Возвращаемое значение
Возвращает положительную разность между x и y :

Возвращаемое значение Сценарий

x-y Если x > y

0 if x <= y

В случае неудачи может возвращать одну из следующих ошибок:

Проблема Возвращает

Ошибка переполнения диапазона +HUGE_VAL, +HUGE_VALF или +HUGE_VALL

Ошибка недостаточного заполнения диапазона правильное значение (после округления)

x или y имеет значение NaN Не число

Ошибки отображаются в соответствии с указанными в _matherr.

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции fdim ,
принимающие и возвращающие типы float и long double . В программе на языке
C, если вы не используете <макрос tgmath.h> для вызова этой функции, fdim
всегда принимает и возвращает double .

При использовании <макроса tgmath.h> fdim() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

За исключением обработки NaN, эта функция эквивалентна fmax(x - y, 0) .

Требования
Компонент Заголовок C Заголовок C++

fdim , fdimf , fdiml <math.h> <cmath>

fdim Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Алфавитный указатель функций

fmax, fmaxf, fmaxl

abs, labs, llabs, _abs64\


fdopen
Статья • 03.04.2023

Имя fdopen функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _fdopen для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _fdopen . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_fdopen , _wfdopen
Статья • 03.04.2023

Связывает поток с файлом, который ранее был открыт для низкоуровневого ввода-
вывода.

Синтаксис
C

FILE *_fdopen(

int fd,

const char *mode

);

FILE *_wfdopen(

int fd,

const wchar_t *mode

);

Параметры
fd

Дескриптор открытого файла.

mode

Тип доступа к файлу.

Возвращаемое значение
Каждая из этих функций возвращает указатель на открытый поток. Значение
указателя null обозначает ошибку. При возникновении ошибки вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, параметр errno
устанавливается в значение EBADF , означающее недопустимый идентификатор
файла, или в значение EINVAL , означающее, что параметр mode был пустым
указателем.

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.
Комментарии
Функция _fdopen связывает поток ввода-вывода с файлом, который определяется
параметром fd , таким образом обеспечивая возможность буферизации и
форматирования файла, открытого для низкоуровневого ввода-вывода. _wfdopen
— это версия _fdopen с расширенными символами; аргумент mode для _wfdopen —
строка расширенных символов. В остальных отношениях поведение функций
_wfdopen и _fdopen идентично.

Дескрипторы файлов, передаваемые в _fdopen , принадлежат возвращаемого FILE


* потока. В _fdopen случае успешного выполнения не вызывайте _close дескриптор
файла. Вызов fclose возвращенного FILE * также закрывает дескриптор файла.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, просмотрите глобальное состояние в CRT.

Символьная mode строка указывает тип доступа к файлу, запрошенного для файла:

mode Access

"r" Открывает для чтения. Если файл не существует или не удается найти, вызов
завершается ошибкой fopen .

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление). Создает файл, если он не
существует.

"r+" Открывает для чтения и записи. Файл должен существовать.

"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое
удаляется.

"a+" Открывается для чтения и добавления. Создает файл, если он не существует.

Если файл открыт с помощью типа доступа "a" или "a+" , все операции записи
выполняются в конце файла. Указатель на файл можно переместить с помощью
fseek или rewind, но он всегда перемещается обратно в конец файла перед
выполнением любой операции записи. Таким образом, существующие данные не
могут быть перезаписаны. Если задан тип доступа "r+" , "w+" или "a+" , чтение и
запись разрешены (считается, что файл открыт для "обновления"). Однако при
переключении между чтением и записью должны быть промежуточные операции
fflush, fsetpos, fseek или rewind. Если требуется, можно указать текущую позицию
для операции fsetpos или fseek.
Помимо указанных выше значений, можно также включить mode следующие
символы, чтобы указать режим перевода для символов новой строки:

mode Поведение
Модификатор

t Откройте файл в текстовом (переведенном) режиме. В этом режиме


сочетания символов возврата каретки и перевода строки (CR-LF)
преобразуются в один символ перевода строки (LF) на входе, а символы
перевода строки (LF) преобразуются на выходе в сочетания символов
возврата каретки и перевода строки (CR-LF). Кроме того, на входе Ctrl+Z
интерпретируется как символ конца файла.

b Открыть в двоичном (непреобразованном) режиме. Все преобразования


из режима t отключены.

c Включите флажок фиксации для связанного объекта filename , чтобы


содержимое файлового буфера записывалось непосредственно на диск
при вызове fflush или _flushall .

n Сбросьте флаг фиксации для связанного filename с "no-commit". Этот флаг


используется по умолчанию. Он также переопределяет глобальный флаг
фиксации при связывании программы с Commode.obj . Глобальный флаг
фиксации по умолчанию — "без фиксации", если вы явно не свяжите
программу с Commode.obj .

Параметры t , c и n mode являются расширениями Майкрософт для функций fopen


и _fdopen . Не используйте их, если вы хотите сохранить переносимость ANSI.

Если t или b не задано, mode режим перевода по умолчанию определяется


глобальной переменной _fmode. Если символ t или b указан как префикс
аргумента, функция завершается с ошибкой и возвращает NULL . Обсуждение
текстовых и двоичных режимов см. в разделе "Текстовый и двоичный режим
файлового ввода-вывода".

Допустимые символы для строки, используемой mode в fopen и _fdopen


соответствующие oflag аргументам, используемым и _open_sopenкак показано в
следующей таблице:

Символы в строке mode Эквивалентное oflag значение для _open и _sopen

a _O_WRONLY | _O_APPEND (обычно _O_WRONLY | _O_CREAT | _O_APPEND )

a+ _O_RDWR | _O_APPEND (обычно _O_RDWR | _O_APPEND | _O_CREAT )

r _O_RDONLY
Символы в строке mode Эквивалентное oflag значение для _open и _sopen

r+ _O_RDWR

w _O_WRONLY (обычно _O_WRONLY | _O_CREAT | _O_TRUNC )

w+ _O_RDWR (обычно _O_RDWR | _O_CREAT | _O_TRUNC )

b _O_BINARY

t _O_TEXT

c Нет

n Нет

Требования
Компонент Обязательный заголовок Заголовок C++

_fdopen <stdio.h> <cstdio>

_wfdopen <stdio.h> или <wchar.h> <cstdio>

Дополнительные сведения о соответствии стандартов и соглашениях об


именовании в библиотеке среды выполнения C см. в разделе "Совместимость".

Сопоставления подпрограмм универсального текста

<tchar.h> _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfdopen _fdopen _fdopen _wfdopen

Пример
C

// crt_fdopen.c

// This program opens a file by using low-level

// I/O, then uses _fdopen to switch to stream

// access. It counts the lines in the file.

#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h>

#include <io.h>

#include <share.h>

int main( void )

FILE *stream;

int fd, count = 0;

char inbuf[128];

// Open a file.

if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )

exit( 1 );

// Get stream from file descriptor.

if( (stream = _fdopen( fd, "r" )) == NULL )

exit( 1 );

while( fgets( inbuf, 128, stream ) != NULL )

count++;

// After _fdopen, close by using fclose, not _close.

fclose( stream );

printf( "Lines in file: %d\n", count );

Входные данные: crt_fdopen.txt


Input

Line one

Line two

Вывод
Output

Lines in file: 2

См. также
Потоковый ввод-вывод

_dup, _dup2

fclose, _fcloseall

fopen, _wfopen

freopen, _wfreopen

_open, _wopen
feclearexcept
Статья • 03.04.2023

feclearexcept пытается очистить флаги исключений с плавающей запятой,

указанные аргументом .

Синтаксис
C

int feclearexcept(

int excepts

);

Параметры
excepts

Флаги состояния исключения для очистки.

Возвращаемое значение
Возвращает ноль, если excepts равно нулю, или если все указанные исключения
были успешно очищены. В противном случае возвращается ненулевое значение.

Комментарии
Функция feclearexcept пытается очистить флаги состояния исключений с
плавающей запятой, заданные excepts . Эта функция поддерживает макросы
исключений, определенные в fenv.h:

Макрос Описание
исключения

FE_DIVBYZERO При выполнении предыдущей операции с плавающей запятой произошла


ошибка сингулярности или полюса, в результате чего было получено
бесконечное значение.

FE_INEXACT Функция принудительно округлила сохраненный результат ранее


выполненной операции с плавающей запятой.
Макрос Описание
исключения

FE_INVALID Ошибка домена в ранее выполненной операции с плавающей запятой.

FE_OVERFLOW Ошибка диапазона. Ранее выполненная операция с плавающей запятой


возвратила слишком большое значение, которое не удается представить.

FE_UNDERFLOW Ранее выполненная операция с плавающей запятой возвратила слишком


малое значение, которое не удается представить с полной точностью.
Создано денормализованное значение.

FE_ALL_EXCEPT Побитовая операция ИЛИ для всех поддерживаемых исключений с


плавающей запятой.

Аргумент excepts может быть выражен нулем, побитовым значением ИЛИ одним
или несколькими поддерживаемыми макросами исключений. Результат
применения всех остальных значений аргумента не определен.

Требования
Компонент Заголовок C Заголовок C++

feclearexcept <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fetestexcept
fegetenv
Статья • 03.04.2023

Сохраняет текущую среду с плавающей запятой в указанном объекте.

Синтаксис
C

int fegetenv(

fenv_t *penv

);

Параметры
penv

Указатель на объект fenv_t , содержащий текущие значения среды с плавающей


запятой.

Возвращаемое значение
Возвращает 0, если среда с плавающей запятой успешно сохранена в penv . В
противном случае возвращается ненулевое значение.

Комментарии
Затем функция fegetenv задает текущую среду с плавающей запятой в объекте,
указанном с помощью функции penv . Среда с плавающей запятой представляет
собой набор флагов состояний и режимов управления, влияющих на вычисления с
плавающей запятой. Эта среда включает режим направления округления и флаги
состояния для исключений с плавающей запятой. Если penv не указывает на
допустимый fenv_t объект, последующее поведение не определено.

Чтобы использовать эту функцию, необходимо отключить оптимизацию


вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.
Требования
Компонент Заголовок C Заголовок C++

fegetenv <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fesetenv
fegetexceptflag
Статья • 03.04.2023

Сохраняет текущее состояние указанных флагов исключений с плавающей запятой.

Синтаксис
C

int fegetexceptflag(

fexcept_t* pstatus,

int excepts

);

Параметры
pstatus

Указатель на объект , fexcept_t содержащий текущие значения флагов


исключений, указанных параметром excepts .

excepts

Флаги исключений с плавающей запятой, которые требуется сохранить в pstatus .

Возвращаемое значение
При успешном выполнении возвращается 0. В противном случае возвращается
ненулевое значение.

Комментарии
Функция fegetexceptflag сохраняет текущее состояние флагов состояния
исключения с плавающей запятой, заданное с помощью функции excepts , в
объекте fexcept_t , на который указывает pstatus . Указатель pstatus должен
указывать на допустимый объект fexcept_t . В противном случае последующее
поведение функции будет неопределенным. Функция fegetexceptflag
поддерживает следующие макросы исключений, определенные в <файле fenv.h>:
Макрос Описание
исключения

FE_DIVBYZERO При выполнении предыдущей операции с плавающей запятой произошла


ошибка сингулярности или полюса, в результате чего было получено
бесконечное значение.

FE_INEXACT Функция принудительно округлила сохраненный результат ранее


выполненной операции с плавающей запятой.

FE_INVALID Ошибка домена в ранее выполненной операции с плавающей запятой.

FE_OVERFLOW Ошибка диапазона. Ранее выполненная операция с плавающей запятой


возвратила слишком большое значение, которое не удается представить.

FE_UNDERFLOW Ранее выполненная операция с плавающей запятой возвратила слишком


малое значение, которое не удается представить с полной точностью.
Создано денормализованное значение.

FE_ALL_EXCEPT Побитовая операция ИЛИ для всех поддерживаемых исключений с


плавающей запятой.

Аргумент excepts может быть равен нулю. Кроме того, он может определяться с
помощью поддерживаемого макроса исключения с плавающей запятой, а также
побитовой операции ИЛИ для нескольких макросов. Действие любого другого
значения аргумента не определено.

Чтобы использовать эту функцию, необходимо отключить оптимизацию


вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++

fegetexceptflag <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fesetexceptflag
fegetround , fesetround
Статья • 03.04.2023

Получает или задает текущий режим округления с плавающей запятой.

Синтаксис
C

int fegetround(void);

int fesetround(

int round_mode

);

Параметры
round_mode

Задаваемый режим округления в виде одного из округляющих макросов. Если


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

Возвращаемое значение
При успешном выполнении fegetround возвращает режим округления как одно из
значений округляющего макроса с плавающей запятой. Возвращается
отрицательное значение, если текущий режим округления невозможно
определить.

При успешном выполнении fesetround возвращает 0. В противном случае


возвращается ненулевое значение.

Комментарии
Операции с плавающей запятой могут использовать один из нескольких режимов
округления. Эти режимы управляют тем, в каком направлении результаты
операций с плавающей запятой округляются в сторону при хранении результатов.
Ниже приведены имена и поведение макросов округления с плавающей запятой,
определенных в <fenv.h>:
Макрос Описание

FE_DOWNWARD Округление в сторону отрицательной бесконечности.

FE_TONEAREST Округление в сторону ближайшего целого числа.

FE_TOWARDZERO Округление к нулю.

FE_UPWARD Округление в сторону положительной бесконечности

Поведение по умолчанию FE_TONEAREST заключается в том, чтобы округить


результаты посередине между представляемыми значениями в сторону
ближайшего значения с четным (0) наименее значимым битом.

Текущий режим округления затрагивает следующие операции.

Преобразование строк.

Результаты арифметических операций с плавающей запятой за пределами


константных выражений.

Округляющие функции библиотеки, такие как rint и nearbyint .

Значения, возвращаемые из математических функций стандартной


библиотеки.

Текущий режим округления не влияет на следующие операции:

Функции библиотеки trunc , ceil , floor и lround .

Приведения и преобразования с плавающей запятой, которые всегда


округляются в сторону нуля.

Результаты арифметических операторов с плавающей запятой в константных


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

Чтобы использовать эти функции, необходимо выключить оптимизации с


плавающей запятой, которые могут препятствовать доступу, с помощью директивы
#pragma fenv_access(on) перед вызовом. Для получения дополнительной

информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++
Компонент Заголовок C Заголовок C++

fegetround , fesetround <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

nearbyint, nearbyintf, nearbyintl

rint, rintf, rintl

lrint, lrintf, lrintl, llrint, llrintf, llrintl


feholdexcept
Статья • 03.04.2023

Сохраняет текущую среду с плавающей запятой в указанном объекте, очищает


флаги состояния с плавающей запятой и, по возможности, помещает среду с
плавающей запятой в режим без остановки.

Синтаксис
C

int feholdexcept(

fenv_t *penv

);

Параметры
penv

Указатель на объект fenv_t , содержащий копию среды с плавающей запятой.

Возвращаемое значение
Возвращает ноль, только если функция может успешно включить обработку
исключений с плавающей запятой без остановки.

Комментарии
Функция feholdexcept используется для сохранения состояния текущей среды с
плавающей запятой в объект fenv_t , на который указывает penv , и настройки
среды таким образом, чтобы при возникновении исключений с плавающей
запятой выполнение не прерывалось. Этот режим называется режимом без
остановки. Этот режим продолжается до тех пор, пока среда не будет
восстановлена с помощью fesetenv или feupdateenv.

Эту функцию можно использовать в начале подпрограммы, который должна


скрывать от вызывающей стороны одно или несколько исключений с плавающей
запятой. Чтобы сообщить об исключении, можно очистить нежелательные
исключения с помощью feclearexcept, а затем завершить режим без остановки
вызовом feupdateenv .

Чтобы использовать эту функцию, необходимо отключить оптимизацию


вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++

feholdexcept <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

feclearexcept
fesetenv

feupdateenv
feof
Статья • 03.04.2023

Определяет окончание файла в потоке.

Синтаксис
C

int feof(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
Функция feof возвращает ненулевое значение, если операция чтения пытается
продолжить чтение файла после того, как он закончился; в противном случае
возвращается значение 0. Если указатель потока имеет значение NULL , функция
вызывает обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, параметр errno
принимает значение EINVAL , а функция feof возвращает значение 0.

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Подпрограмма feof (реализованная и как функция, и как макрос) определяет,
пройден ли конец stream . Если конец файла пройден, операции чтения
возвращают индикатор окончания файла, пока поток не будет закрыт или пока для
него не будет вызвана функция rewind, fsetpos , fseek или clearerr .
Например, если файл содержит 10 байтов и вы читаете 10 байт из файла,
возвращает значение 0, feof так как, несмотря на то, что указатель на файл
находится в конце файла, вы не пытались прочитать после конца. Функция feof
вернет ненулевое значение только после того, как вы попытаетесь прочитать 11-й
байт.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

feof <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_feof.c

// This program uses feof to indicate when

// it reaches the end of the file CRT_FEOF.TXT. It also

// checks for errors with ferror.


//

#include <stdio.h>

#include <stdlib.h>

int main( void )

int count, total = 0;

char buffer[100];

FILE *stream;

fopen_s( &stream, "crt_feof.txt", "r" );

if( stream == NULL )


exit( 1 );

// Cycle until end of file reached:

while( !feof( stream ) )

// Attempt to read in 100 bytes:

count = fread( buffer, sizeof( char ), 100, stream );

if( ferror( stream ) ) {

perror( "Read error" );

break;

// Total up actual bytes read

total += count;

printf( "Number of bytes read = %d\n", total );

fclose( stream );

Входные данные: crt_feof.txt


Input

Line one.

Line two.

Вывод
Output

Number of bytes read = 19

См. также
Обработка ошибок

Потоковый ввод-вывод

clearerr

_eof

ferror

perror, _wperror
feraiseexcept
Статья • 03.04.2023

Вызывает указанные исключения с плавающей запятой.

Синтаксис
C

int feraiseexcept(

int excepts

);

Параметры
excepts

Исключения с плавающей запятой, которые необходимо вызвать.

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

Комментарии
Функция feraiseexcept пытается очистить исключения с плавающей запятой,
заданные функцией excepts . Функция feraiseexcept поддерживает эти макросы
исключений, определенные в <fenv.h>:

Макрос Описание
исключения

FE_DIVBYZERO При выполнении предыдущей операции с плавающей запятой произошла


ошибка сингулярности или полюса, в результате чего было получено
бесконечное значение.

FE_INEXACT Функция принудительно округлила сохраненный результат ранее


выполненной операции с плавающей запятой.

FE_INVALID Ошибка домена в ранее выполненной операции с плавающей запятой.


Макрос Описание
исключения

FE_OVERFLOW Ошибка диапазона. Ранее выполненная операция с плавающей запятой


возвратила слишком большое значение, которое не удается представить.

FE_UNDERFLOW Ранее выполненная операция с плавающей запятой возвратила слишком


малое значение, которое не удается представить с полной точностью.
Создано денормализованное значение.

FE_ALL_EXCEPT Побитовая операция ИЛИ для всех поддерживаемых исключений с


плавающей запятой.

Аргумент excepts может быть равен нулю, значению одного из макросов


исключений, побитовой операции ИЛИ двух или больше поддерживаемых
макросов исключений. Если один из указанных макросов исключений или
FE_OVERFLOW FE_UNDERFLOW , FE_INEXACT исключение может быть создано как

побочный эффект.

Чтобы использовать эту функцию, необходимо отключить оптимизацию


вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Для конкретной корпорации Майкрософт: Исключения, указанные в excepts


порядке FE_INVALID , FE_DIVBYZERO , , FE_OVERFLOW , FE_UNDERFLOW FE_INEXACT . FE_INEXACT
Однако может возникать при FE_OVERFLOW возникновении или FE_UNDERFLOW
возникновении, даже если он не указан в excepts .

Требования
Компонент Заголовок C Заголовок C++

feraiseexcept <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fesetexceptflag

feholdexcept

fetestexcept

feupdateenv
ferror
Статья • 03.04.2023

Проверяет наличие ошибок в потоке.

Синтаксис
C

int ferror(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
Если ошибок в потоке stream нет, подпрограмма ferror возвращает 0. В
противном случае возвращается ненулевое значение. Если поток имеет значение
NULL , ferror вызывает обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если продолжение выполнения разрешено, эта
функции задает для errno значение EINVAL и возвращает 0.

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Подпрограмма ferror (реализованная и как функция, и как макрос) проверяет
наличие ошибок чтения или записи в файле, связанном с потоком stream . Если
произошла ошибка, индикатор ошибки для потока остается установленным до тех
пор, пока поток не будет закрыт или перемотан назад или пока для потока не будет
вызвана функция clearerr .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

ferror <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для feof.

См. также раздел


Обработка ошибок

Потоковый ввод-вывод

clearerr

_eof

feof

fopen, _wfopen

perror, _wperror
fesetenv
Статья • 03.04.2023

Задает текущую среду с плавающей запятой.

Синтаксис
C

int fesetenv(

const fenv_t *penv

);

Параметры
penv

Указатель на fenv_t объект, содержащий среду с плавающей запятой, заданную


вызовом fegetenv или feholdexcept. Вы также можете указать среду с плавающей
запятой по умолчанию с помощью FE_DFL_ENV макроса.

Возвращаемое значение
Возвращает 0, если среда был успешно установлена. В противном случае
возвращается ненулевое значение.

Комментарии
Затем функция fesetenv задает текущую среду вычислений с плавающей запятой
на основе значения, сохраненного в объекте fenv_t , на который указывает penv .
Среда с плавающей запятой представляет собой набор флагов состояний и
режимов управления, влияющих на вычисления с плавающей запятой. Среда
включает режим округления и флаги состояния для исключений с плавающей
запятой. Если penv он не FE_DFL_ENV указан или не указывает на допустимый fenv_t
объект, последующее поведение не определено.

Вызов этой функции задает флаги состояния исключения, которые находятся в


объекте penv , но не вызывают эти исключения.
Чтобы использовать эту функцию, необходимо отключить оптимизацию
вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++

fesetenv <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fegetenv

feclearexcept
feholdexcept

fesetexceptflag
fesetexceptflag
Статья • 03.04.2023

Задает указанные флаги состояний с плавающей запятой в текущей среде


вычислений с плавающей запятой.

Синтаксис
C

int fesetexceptflag(

const fexcept_t *pstatus,

int excepts

);

Параметры
pstatus

Указатель на fexcept_t объект, содержащий значения, для установки флагов


состояния исключения. Объект может быть задан предыдущим вызовом
fegetexceptflag.

excepts

Флаги состояний исключения с плавающей запятой, которые требуется задать.

Возвращаемое значение
Если успешно заданы все указанные флаги состояний исключения, возвращает 0. В
противном случае возвращается ненулевое значение.

Комментарии
Функция fesetexceptflag присваивает состоянию флагов состояний исключения с
плавающей запятой, заданных с помощью excepts , соответствующие значения
объекта fexcept_t , на который указывает pstatus . Это не вызывает исключения.
Указатель pstatus должен указывать на допустимый объект fexcept_t . В
противном случае последующее поведение функции будет неопределенным.
Функция fesetexceptflag поддерживает следующие значения макросов
исключения в excepts , определенных в <fenv.h>:

Макрос Описание
исключения

FE_DIVBYZERO При выполнении предыдущей операции с плавающей запятой произошла


ошибка сингулярности или полюса, в результате чего было получено
бесконечное значение.

FE_INEXACT Функция принудительно округлила сохраненный результат ранее


выполненной операции с плавающей запятой.

FE_INVALID Ошибка домена в ранее выполненной операции с плавающей запятой.

FE_OVERFLOW Ошибка диапазона. Ранее выполненная операция с плавающей запятой


возвратила слишком большое значение, которое не удается представить.

FE_UNDERFLOW Ранее выполненная операция с плавающей запятой возвратила слишком


малое значение, которое не удается представить с полной точностью.
Создано денормализованное значение.

FE_ALL_EXCEPT Побитовая операция ИЛИ для всех поддерживаемых исключений с


плавающей запятой.

Аргумент excepts может быть равен нулю. Кроме того, он может определяться с
помощью поддерживаемого макроса исключения с плавающей запятой, а также
побитовой операции ИЛИ для нескольких макросов. Действие любого другого
значения аргумента не определено.

Чтобы использовать эту функцию, необходимо отключить оптимизацию


вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++

fesetexceptflag <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fegetexceptflag
fetestexcept
Статья • 03.04.2023

Определяет, какие из указанных флагов состояний исключения с плавающей


запятой в настоящее время заданы.

Синтаксис
C

int fetestexcept(

int excepts

);

Параметры
excepts

Побитовое ЗНАЧЕНИЕ ИЛИ флагов состояния с плавающей запятой для


тестирования.

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

Комментарии
Чтобы определить исключения, которые были вызваны операцией с плавающей
запятой, используйте функцию fetestexcept. Чтобы указать флаги состояний
исключения, которые требуется проверить, используйте параметр excepts .
Функция fetestexcept использует эти макросы исключений, определенные в
<файле fenv.h> и excepts возвращаемое значение:

Макрос Описание
исключения
Макрос Описание
исключения

FE_DIVBYZERO При выполнении предыдущей операции с плавающей запятой произошла


ошибка сингулярности или полюса, в результате чего было получено
бесконечное значение.

FE_INEXACT Функция принудительно округлила сохраненный результат ранее


выполненной операции с плавающей запятой.

FE_INVALID Ошибка домена в ранее выполненной операции с плавающей запятой.

FE_OVERFLOW Ошибка диапазона. Ранее выполненная операция с плавающей запятой


возвратила слишком большое значение, которое не удается представить.

FE_UNDERFLOW Ранее выполненная операция с плавающей запятой возвратила слишком


малое значение, которое не удается представить с полной точностью.
Создано денормализованное значение.

FE_ALL_EXCEPT Побитовая операция ИЛИ для всех поддерживаемых исключений с


плавающей запятой.

Аргумент excepts может быть равен 0. Кроме того, он может определяться с


помощью поддерживаемого макроса исключения с плавающей запятой, а также
побитовой операции ИЛИ для нескольких макросов. Действие любого другого
значения аргумента excepts не определено.

Чтобы использовать эту функцию, необходимо отключить оптимизацию


вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++

fetestexcept <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

feclearexcept
feraiseexcept
feupdateenv
Статья • 03.04.2023

Сохраняет вызванные в данный момент исключения с плавающей запятой,


восстанавливает указанное состояние среды вычислений с плавающей запятой,
после чего вызывает сохраненные исключения с плавающей запятой.

Синтаксис
C

int feupdateenv(

const fenv_t* penv

);

Параметры
penv

Указатель на fenv_t объект, содержащий среду с плавающей запятой, заданную


вызовом fegetenv или feholdexcept. Вы также можете указать среду с плавающей
запятой по умолчанию с помощью FE_DFL_ENV макроса.

Возвращаемое значение
Если все действия успешно завершены, возвращает 0. В противном случае
возвращается ненулевое значение.

Комментарии
Функция feupdateenv выполняет несколько действий. Сначала она автоматически
сохраняет вызванные на данный момент флаги состояний исключения с
плавающей запятой. Затем эта функция задает текущую среду вычислений с
плавающей запятой на основе значения, сохраненного в объекте fenv_t , на
который указывает penv . Если penv объект не FE_DFL_ENV указан или не указывает
на допустимый fenv_t объект, последующее поведение не определено. После
этого функция feupdateenv вызывает локально сохраненные исключения с
плавающей запятой.
Чтобы использовать эту функцию, необходимо отключить оптимизацию
вычислений с плавающей запятой, которая может препятствовать доступу. Для
этого следует использовать директиву #pragma fenv_access(on) перед вызовом. Для
получения дополнительной информации см. fenv_access.

Требования
Компонент Заголовок C Заголовок C++

feupdateenv <fenv.h> <cfenv>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


fegetenv

feclearexcept
feholdexcept

fesetexceptflag
fflush
Статья • 03.04.2023

Записывает содержимое потока на диск.

Синтаксис
C

int fflush(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
Функция fflush возвращает 0, если содержимое буфера было успешно записано
на диск. Кроме того, значение 0 также возвращается в случаях, когда указанный
поток не имеет буфера или открыт только для чтения. Возвращаемое значение EOF
указывает на ошибку.

7 Примечание

Если функция fflush возвращает EOF , возможна потеря данных из-за ошибки
записи. При настройке обработчика критической ошибки лучше всего
отключить буферизацию с помощью функции setvbuf или использовать
процедуры низкоуровневого ввода-вывода, такие как _open , _close и _write ,
вместо функций ввода-вывода потока.

Комментарии
Функция fflush записывает на диск поток stream . Если поток был открыт в режиме
записи или был открыт в режиме обновления, а последняя операция была
записью, fflush записывает содержимое буфера потока в базовый файл или
устройство, а буфер удаляется. Если поток был открыт в режиме чтения или не
имеет буфера, вызов функции fflush не дает никаких результатов, и содержимое
буфера сохраняется. Вызов функции fflush отменяет результат любого
предыдущего вызова функции ungetc для потока. После вызова поток остается
открытым.

Если stream имеет значение NULL , поведение будет таким же, как при вызове
функции fflush для каждого открытого потока. Выполняется запись на диск всех
потоков, открытых в режиме записи, а также всех потоков в режиме обновления,
для которых последней была выполнена операция записи. Вызов не влияет на
другие потоки.

Эти буферы обычно обслуживаются операционной системой, которая


автоматически определяет оптимальное время записи данных на диск: при
заполнении буфера, при закрытии потока или при нормальном завершении
программы без закрытия потоков. Предусмотренная в библиотеке времени
выполнения возможность фиксации на диск позволяет обеспечить запись
критически важных данных непосредственно на диск, а не в буферы операционной
системы. Без перезаписи существующей программы эту функцию можно включить,
связав объектные файлы программы с COMMODE.OBJ . В создаваемом исполняемом
файле вызовы функции _flushall записывают содержимое всех буферов на диск.
Влияет только _flushall и fflush на них влияет COMMODE.OBJ .

Сведения об управлении функцией фиксации на диск см. в разделе Stream I/Ofopen


и _fdopen.

Функция блокирует вызывающий поток, поэтому она потокобезопасна. Сведения о


неблокирующей версии см. в описании функции _fflush_nolock .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

fflush <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_fflush.c

// Compile with: cl /W4 crt_fflush.c

// This sample gets a number from the user, then writes it to a file.

// It ensures the write isn't lost on crash by calling fflush.

#include <stdio.h>

int * crash_the_program = 0;

int main(void)

FILE * my_file;

errno_t err = fopen_s(&my_file, "myfile.txt", "w");

if (my_file && !err)

printf("Write a number: ");

int my_number = 0;

scanf_s("%d", &my_number);

fprintf(my_file, "User selected %d\n", my_number);

// Write data to a file immediately instead of buffering.

fflush(my_file);

if (my_number == 5)

// Without using fflush, no data was written to the file

// prior to the crash, so the data is lost.

*crash_the_program = 5;

// Normally, fflush is not needed as closing the file will write the
buffer.

// Note that files are automatically closed and flushed during


normal termination.

fclose(my_file);

return 0;

Input

myfile.txt

User selected 5

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

_flushall

setvbuf
_fflush_nolock
Статья • 03.04.2023

Записывает поток на диск без блокирования потока.

Синтаксис
C

int _fflush_nolock(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
См. раздел fflush.

Комментарии
Эта функция представляет собой неблокирующую версию функции fflush . Он
идентичен fflush , за исключением того, что он не защищен от вмешательства
другими потоками. Это может быть быстрее, так как это не приводит к
дополнительным издержкам блокировки других потоков. Используйте эту функции
только в потокобезопасных контекстах, например в однопоточных приложениях
или если вызываемая область уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок
Компонент Обязательный заголовок

_fflush_nolock <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

_flushall

setvbuf
fgetc , fgetwc
Статья • 03.04.2023

Считывает символ из потока.

Синтаксис
C

int fgetc(

FILE *stream

);

wint_t fgetwc(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
fgetc возвращает символ, считанный как int , или EOF для отображения ошибки
или конца файла. fgetwc возвращает расширенный wint_tсимвол, соответствующий
считываемой или возвращаемой WEOF символу, чтобы указать ошибку или конец
файла. Для обеих функций следует использовать feof или ferror , чтобы различать
ошибки и конец файла. Если возникает ошибка чтения, то для потока
устанавливается индикатор ошибки. Если stream это NULL так, fgetc и fgetwc
вызовите обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, эти функции
устанавливают параметр errno в значение EINVAL и возвращают значение EOF .

Комментарии
Каждая из этих функций считывает один символ в текущей позиции файла,
связанного со stream . Функция затем увеличивает указатель связанного файла
(если определен), чтобы он указывал на следующий символ. Если поток находится
в конце файла, для него устанавливается индикатор конца файла.
fgetc эквивалентна getc , но реализуется только как функция, а не как функция и

макрос.

fgetwc — это версия расширенных символов fgetc ; она считывает c как

многобайтовый символ или расширенный символ при stream открытии в


текстовом режиме или двоичном режиме соответственно.

Версии с суффиксом _nolock идентичны, за исключением того, что они не


защищены от помех другими потоками.

Дополнительные сведения об обработке расширенных символов и многобайтовых


символов в текстовых и двоичных режимах см. в потоках ввода-вывода в Юникоде
в текстовых и двоичных режимах.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_fgettc fgetc fgetc fgetwc

Требования
Компонент Обязательный заголовок

fgetc <stdio.h>

fgetwc <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fgetc.c

// This program uses getc to read the first

// 80 input characters (or until the end of input)

// and place them into a string named buffer.

#include <stdio.h>

#include <stdlib.h>

int main( void )

FILE *stream;

char buffer[81];

int i, ch;

// Open file to read line from:

fopen_s( &stream, "crt_fgetc.txt", "r" );

if( stream == NULL )


exit( 0 );

// Read in first 80 characters and place them in "buffer":

ch = fgetc( stream );

for( i=0; (i < 80 ) && ( feof( stream ) == 0 ); i++ )

buffer[i] = (char)ch;

ch = fgetc( stream );

// Add null to end string

buffer[i] = '\0';

printf( "%s\n", buffer );

fclose( stream );

Input: crt_fgetc.txt
Input

Line one.

Line two.

Вывод
Output

Line one.

Line two.

См. также
Потоковый ввод-вывод

fputc, fputwc

getc, getwc
_fgetc_nolock , _fgetwc_nolock
Статья • 03.04.2023

Считывает символ из потока без блокирования потока.

Синтаксис
C

int _fgetc_nolock(

FILE *stream

);

wint_t _fgetwc_nolock(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
См.fgetcfgetwc

Комментарии
_fgetc_nolock и _fgetwc_nolock идентичны fgetc fgetwc и соответственно, за
исключением того, что они не защищены от помех другими потоками. Они могут
быть быстрее, так как они не влечет за собой затраты на блокировку других
потоков. Используйте эти функции только в потокобезопасных контекстах,
например в однопоточных приложениях или если вызываемая область уже
обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста


Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_fgettc_nolock _fgetc_nolock _fgetc_nolock _fgetwc_nolock

Требования
Компонент Обязательный заголовок

_fgetc_nolock <stdio.h>

_fgetwc_nolock <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fgetc_nolock.c

// This program uses getc to read the first

// 80 input characters (or until the end of input)

// and place them into a string named buffer.

#include <stdio.h>

#include <stdlib.h>

int main( void )

FILE *stream;

char buffer[81];

int i, ch;

// Open file to read line from:

if( fopen_s( &stream, "crt_fgetc_nolock.txt", "r" ) != 0 )

exit( 0 );

// Read in first 80 characters and place them in "buffer":

ch = fgetc( stream );

for( i=0; (i < 80 ) && ( feof( stream ) == 0 ); i++ )

buffer[i] = (char)ch;

ch = _fgetc_nolock( stream );

// Add null to end string

buffer[i] = '\0';

printf( "%s\n", buffer );

fclose( stream );

Входные данные: crt_fgetc_nolock.txt


Input

Line one.

Line two.

Вывод
Output

Line one.

Line two.

См. также
Потоковый ввод-вывод

fputc, fputwc

getc, getwc
fgetchar
Статья • 03.04.2023

Имя fgetchar функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _fgetchar функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _fgetchar . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_fgetchar , _fgetwchar
Статья • 03.04.2023

Считывает символ из stdin .

Синтаксис
C

int _fgetchar( void );

wint_t _fgetwchar( void );

Возвращаемое значение
_fgetchar возвращает символ, считывающийся как или int возвращающийся EOF ,
чтобы указать ошибку или конец файла. _fgetwchar возвращает расширенный
символ, wint_tсоответствующий считываемой или возвращаемой WEOF символу,
чтобы указать ошибку или конец файла. Для обеих функций следует использовать
feof или ferror , чтобы различать ошибки и конец файла.

Комментарии
Эти функции считывают один символ из stdin . Функция затем увеличивает
указатель связанного файла (если определен), чтобы он указывал на следующий
символ. Если поток находится в конце файла, для него устанавливается индикатор
конца файла.

_fgetchar равно fgetc( stdin ) . Он также эквивалентен getchar , но реализуется

только как функция, а не как функция и макрос. _fgetwchar — версия _fgetchar с


расширенными символами.

Эти функции несовместимы со стандартом ANSI.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста


Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_fgettchar _fgetchar _fgetchar _fgetwchar

Требования
Компонент Обязательный заголовок

_fgetchar <stdio.h>

_fgetwchar <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью stdin , stdout и
stderr должны быть перенаправлены, прежде чем функции времени выполнения C

смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_fgetchar.c

// This program uses _fgetchar to read the first

// 80 input characters (or until the end of input)

// and place them into a string named buffer.

//

#include <stdio.h>

#include <stdlib.h>

int main( void )

char buffer[81];

int i, ch;

// Read in first 80 characters and place them in "buffer":

ch = _fgetchar();

for( i=0; (i < 80 ) && ( feof( stdin ) == 0 ); i++ )

buffer[i] = (char)ch;

ch = _fgetchar();

// Add null to end string

buffer[i] = '\0';

printf( "%s\n", buffer );

Output

Line one.

Line two.Line one.

Line two.

См. также раздел


Потоковый ввод-вывод

fputc, fputwc

getc, getwc
fgetpos
Статья • 03.04.2023

Получает индикатор позиции файла потока.

Синтаксис
C

int fgetpos(

FILE *stream,

fpos_t *pos

);

Параметры
stream

Целевой поток.

pos

Хранилище индикатора позиции.

Возвращаемое значение
В случае успеха fgetpos возвращает 0. При сбое возвращает ненулевое значение и
задает errno одну из следующих констант манифеста (определенных в STDIO. H):
EBADF это означает, что указанный поток не является допустимым указателем файла

или недоступен, или EINVAL означает stream , что значение или значение pos
недопустимо, например, если какой-либо из них является пустым указателем. Если
stream или pos является указателем NULL , функция вызывает обработчик
недопустимых параметров, как описано в разделе "Проверка параметров".

Комментарии
Функция fgetpos возвращает текущее значение индикатора позиции файла для
аргумента stream и сохраняет его в объекте, на который указывает pos . После
этого функция fsetpos может использовать данные, хранящиеся в указателе pos ,
для сброса указателя аргумента stream в позицию на момент времени, когда была
вызвана функция fgetpos . Значение pos хранится во внутреннем формате и
предназначено для использования только в функциях fgetpos и fsetpos .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

fgetpos <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fgetpos.c

// This program uses fgetpos and fsetpos to

// return to a location in a file.

#include <stdio.h>

int main( void )

FILE *stream;

fpos_t pos;

char buffer[20];

if( fopen_s( &stream, "crt_fgetpos.txt", "rb" ) ) {

perror( "Trouble opening file" );

return -1;

// Read some data and then save the position.

fread( buffer, sizeof( char ), 8, stream );

if( fgetpos( stream, &pos ) != 0 ) {

perror( "fgetpos error" );

return -1;

fread( buffer, sizeof( char ), 13, stream );

printf( "after fgetpos: %.13s\n", buffer );

// Restore to old position and read data

if( fsetpos( stream, &pos ) != 0 ) {

perror( "fsetpos error" );

return -1;

fread( buffer, sizeof( char ), 13, stream );

printf( "after fsetpos: %.13s\n", buffer );

fclose( stream );

Входные данные: crt_fgetpos.txt


Input

fgetpos gets a stream's file-position indicator.

Выходные данные: crt_fgetpos.txt


Output

after fgetpos: gets a stream

after fsetpos: gets a stream

См. также раздел


Потоковый ввод-вывод

fsetpos
fgets , fgetws
Статья • 03.04.2023

Получает строку из потока.

Синтаксис
C

char *fgets(

char *str,

int numChars,

FILE *stream

);

wchar_t *fgetws(

wchar_t *str,

int numChars,

FILE *stream

);

Параметры
str

Место хранения данных.

numChars

Максимальное число считываемых символов.

stream

Указатель на структуру FILE .

Возвращаемое значение
Каждая из этих функций возвращает str . NULL возвращается в случае ошибки или
достижения конца файла. Чтобы определить, произошла ли ошибка, используйте
feof или ferror . Если str или stream является пустым указателем или numChars

меньше или равен нулю, эта функция вызывает обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, параметр errno устанавливается в значение EINVAL , и функция
возвращает значение NULL .
Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,
_sys_errlistи _sys_nerr.

Комментарии
Функция fgets считывает строку из входного аргумента stream и сохраняет ее в
str . fgets считывает символы из текущей позиции потока в и включая первый

символ новой строки, в конец потока или до тех пор, пока число прочитанных
символов не будет равно numChars - 1, в зависимости от того, что происходит
первым. Результат сохраняется в str с добавлением символа NULL. Считываемый
символ новой строки (если такой есть) включается в строку.

fgetws  — это версия функции fgets для расширенных символов.

fgetws считывает аргумент str расширенных символов в виде многобайтовой


строки или строки расширенных символов, если stream открыт в текстовом или
двоичном режиме соответственно. Дополнительные сведения об использовании
текстового и двоичного режимов в Юникоде и многобайтовом потоковом вводе-
выводе см. в разделе Текстовый и двоичный режимы ввода-вывода файлов и
потокового ввода-вывода Юникода в текстовом и двоичном режимах.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_fgetts fgets fgets fgetws

Требования
Компонент Обязательный заголовок

fgets <stdio.h>

fgetws <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_fgets.c

// This program uses fgets to display

// the first line from a file.

#include <stdio.h>

int main( void )

FILE *stream;

char line[100];

if( fopen_s( &stream, "crt_fgets.txt", "r" ) == 0 )

if( fgets( line, 100, stream ) == NULL)

printf( "fgets error\numChars" );

else

printf( "%s", line);

fclose( stream );

Вход: crt_fgets.txt
Input

Line one.

Line two.

Вывод
Output

Line one.

См. также
Потоковый ввод-вывод

fputs, fputws

gets, _getws

puts, _putws
filelength
Статья • 03.04.2023

Имя filelength функции, зависят от Майкрософт, является устаревшим


псевдонимом _filelength для функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _filelength . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_filelength , _filelengthi64
Статья • 03.04.2023

Получает длину файла.

Синтаксис
C

long _filelength(

int fd

);

__int64 _filelengthi64(

int fd

);

Параметры
fd

Указывает дескриптор файла.

Возвращаемое значение
Функции _filelength и _filelengthi64 возвращают длину целевого файла (в
байтах), связанного с дескриптором fd . Если fd дескриптор недопустимого файла,
эта функция вызывает обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если выполнение разрешено продолжать, обе
функции возвращают -1L, чтобы указать ошибку EBADF и задать значение errno .

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок
Компонент Обязательный заголовок

_filelength <io.h>

_filelengthi64 <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _chsize.

См. также раздел


Обработка файлов

_chsize

_fileno

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

_stat, _wstat функции


fileno
Статья • 03.04.2023

Имя fileno функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _fileno функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _fileno . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_fileno
Статья • 03.04.2023

Получает дескриптор файла, связанного с потоком.

Синтаксис
C

int _fileno(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
_fileno возвращает дескриптор файла. Ошибка не возвращается. Результат не
определен, если stream не указан открытый файл. Если поток имеет значение NULL ,
_fileno вызывает обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если продолжение выполнения разрешено, эта функция
возвращает -1 и задает для errno значение EINVAL .

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno,


_doserrnoи _sys_errlist_sys_nerr.

7 Примечание

Если stdout или stderr не связаны с выходным потоком (например, в


приложении Windows без окна консоли), возвращается дескриптор файла -2. В
предыдущих версиях возвращался дескриптор файла -1. Это изменение
позволяет приложениям отличить это условие от ошибки.

Комментарии
Подпрограмма _fileno возвращает дескриптор файла, в данный момент
связанный с stream . Эта подпрограмма реализуется как функция и макрос.
Сведения о выборе любой реализации см. в рекомендациях по выбору между
функциями и макросами.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

_fileno <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fileno.c

// This program uses _fileno to obtain

// the file descriptor for some standard C streams.

//

#include <stdio.h>

int main( void )

printf( "The file descriptor for stdin is %d\n", _fileno( stdin ) );

printf( "The file descriptor for stdout is %d\n", _fileno( stdout ) );

printf( "The file descriptor for stderr is %d\n", _fileno( stderr ) );

Output

The file descriptor for stdin is 0

The file descriptor for stdout is 1

The file descriptor for stderr is 2

См. также раздел


Потоковый ввод-вывод

_fdopen, _wfdopen

_filelength, _filelengthi64

fopen, _wfopen

freopen, _wfreopen
_findclose
Статья • 03.04.2023

Закрывает указанный дескриптор поиска и освобождает связанные ресурсы.

Синтаксис
C

int _findclose(

intptr_t handle

);

Параметры
handle

Дескриптор поиска, возвращаемый предыдущим вызовом _findfirst .

Возвращаемое значение
В случае успеха _findclose возвращает 0. В противном случае возвращает
значение -1 и задает errno ENOENT значение, указывающее, что не удалось найти
соответствующие файлы.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_findclose <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Системные вызовы

Функции поиска имени файла


_findfirst , _findfirst32 ,
_findfirst32i64 , _findfirst64 ,
_findfirst64i32 , _findfirsti64 ,
_wfindfirst , _wfindfirst32 ,
_wfindfirst32i64 , _wfindfirst64 ,
_wfindfirst64i32 , _wfindfirsti64
Статья • 03.04.2023

Предоставляет сведения о первом экземпляре имени файла, соответствующему


файлу, указанному в аргументе filespec .

Синтаксис
C

intptr_t _findfirst(

const char *filespec,

struct _finddata_t *fileinfo

);

intptr_t _findfirst32(

const char *filespec,

struct _finddata32_t *fileinfo


);

intptr_t _findfirst64(

const char *filespec,

struct _finddata64_t *fileinfo


);

intptr_t _findfirsti64(

const char *filespec,

struct _finddatai64_t *fileinfo

);

intptr_t _findfirst32i64(

const char *filespec,

struct _finddata32i64_t *fileinfo

);

intptr_t _findfirst64i32(

const char *filespec,

struct _finddata64i32_t *fileinfo

);

intptr_t _wfindfirst(

const wchar_t *filespec,

struct _wfinddata_t *fileinfo

);

intptr_t _wfindfirst32(

const wchar_t *filespec,

struct _wfinddata32_t *fileinfo

);

intptr_t _wfindfirst64(

const wchar_t *filespec,

struct _wfinddata64_t *fileinfo

);

intptr_t _wfindfirsti64(

const wchar_t *filespec,

struct _wfinddatai64_t *fileinfo

);

intptr_t _wfindfirst32i64(

const wchar_t *filespec,

struct _wfinddata32i64_t *fileinfo

);

intptr_t _wfindfirst64i32(

const wchar_t *filespec,

struct _wfinddata64i32_t *fileinfo

);

Параметры
filespec

Спецификация целевого файла (может содержать подстановочные знаки).

fileinfo

Буфер сведений о файле.

Возвращаемое значение
В случае успешного выполнения возвращает уникальный дескриптор поиска,
_findfirst определяющий файл или группу файлов, соответствующих filespec

спецификации, которые можно использовать при последующем вызове _findnext


или ._findclose В противном _findfirst случае возвращает значение -1 и задает
errno одно из следующих значений.

Значение Условие
errno

EINVAL Недопустимый параметр: filespec или fileinfo имеет значение NULL . Или
операционная система возвратила непредвиденную ошибку.

ENOENT Не удалось сопоставить спецификацию файла.


Значение Условие
errno

ENOMEM Недостаточно памяти.

EINVAL Недопустимая спецификация имени файла или длина заданного имени файла
больше MAX_PATH .

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Если передается недопустимый параметр, эти функции вызывают обработчик


недопустимых параметров, как описано в разделе Проверка параметров.

Комментарии
После завершения необходимо вызвать _findclose функцию _findfirst или
_findnext (или любые варианты), если вызов _findfirst выполнен успешно.
_findclose освобождает ресурсы, используемые этими функциями в приложении.

Вызов _findclose недопустимого дескриптора возвращает -1 и задает значение


errno EINVAL .

Варианты этих функций с w префиксом являются версиями расширенных


символов; в противном случае они идентичны соответствующим однобайтовым
функциям.

Варианты этих функций поддерживают 32- или 64-разрядные типы времени и 32-
или 64-разрядные размеры файлов. Первый числовой суффикс ( 32 или 64 )
указывает размер типа времени; второй суффикс i32 или i64 показывает,
представлен ли размер файла как 32- или 64-разрядное целое число. Сведения о
том, какие версии поддерживают 32- и 64-разрядные типы времени и размеры
файлов, см. в следующей таблице. Суффикс i32 или i64 опущен, если он совпадает
с размером типа времени, поэтому _findfirst64 также поддерживает длину 64-
разрядных файлов и _findfirst32 поддерживает только 32-разрядную длину
файлов.

Эти функции используют различные формы структуры _finddata_t для параметра


fileinfo . Дополнительные сведения о структуре см. в разделе Функции поиска

имен файлов.

Варианты, использующие 64-разрядный тип времени, допускают даты создания


файлов до 23:59:59 31-го декабря 3000 года, время в формате UTC. Те, которые
используют 32-разрядные типы времени, представляют даты только до 23:59:59 18
января 2038 года в формате UTC. Полночь 1 января 1970 года — нижняя граница
диапазона дат для всех этих функций.

Если нет какой-либо определенной причины использовать версии, указывающие


размер времени явно, используйте функцию _findfirst или _wfindfirst или, если
необходима поддержка размеров файлов больше 3 ГБ, используйте функцию
_findfirsti64 или _wfindfirsti64 . Все эти функции используют 64-разрядный тип
времени. В более ранних версиях этих функций использовался 32-разрядный тип
времени. Если это изменение является критическим для приложения, вы можете
определить _USE_32BIT_TIME_T , как вернуться к старому поведению. Если
определена директива _USE_32BIT_TIME_T , функции _findfirst , _finfirsti64 и
соответствующие версии Юникода используют 32-разрядное время.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Варианты типов времени и типов длины файлов в


функции _findfirst

Функции Директива _USE_32BIT_TIME_T Тип времени Тип длины


определена? файла

_findfirst , _wfindfirst Не определено 64-разрядная 32-разрядная


версия

_findfirst , _wfindfirst Определено 32-битная 32-битная

_findfirst32 , Не затрагивается 32-битная 32-битная


_wfindfirst32 определением макроса

_findfirst64 , Не затрагивается 64-разрядная 64-разрядная


_wfindfirst64 определением макроса система система

_findfirsti64 , Не определено 64-разрядная 64-разрядная


_wfindfirsti64 система система

_findfirsti64 , Определено 32-разрядная 64-разрядная


_wfindfirsti64 версия версия

_findfirst32i64 , Не затрагивается 32-разрядная 64-разрядная


_wfindfirst32i64 определением макроса версия версия

_findfirst64i32 , Не затрагивается 64-разрядная 32-разрядная


_wfindfirst64i32 определением макроса версия
Сопоставления подпрограмм с универсальным
текстом

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfindfirst _findfirst _findfirst _wfindfirst

_tfindfirst32 _findfirst32 _findfirst32 _wfindfirst32

_tfindfirst64 _findfirst64 _findfirst64 _wfindfirst64

_tfindfirsti64 _findfirsti64 _findfirsti64 _wfindfirsti64

_tfindfirst32i64 _findfirst32i64 _findfirst32i64 _wfindfirst32i64

_tfindfirst64i32 _findfirst64i32 _findfirst64i32 _wfindfirst64i32

Требования
Компонент Обязательный заголовок

_findfirst <io.h>

_findfirst32 <io.h>

_findfirst64 <io.h>

_findfirsti64 <io.h>

_findfirst32i64 <io.h>

_findfirst64i32 <io.h>

_wfindfirst <io.h> или <wchar.h>

_wfindfirst32 <io.h> или <wchar.h>

_wfindfirst64 <io.h> или <wchar.h>

_wfindfirsti64 <io.h> или <wchar.h>

_wfindfirst32i64 <io.h> или <wchar.h>

_wfindfirst64i32 <io.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Системные вызовы

Функции поиска имени файла


_findnext , _findnext32 , _findnext32i64 ,
_findnext64 , _findnext64i32 ,
_findnexti64 , _wfindnext , _wfindnext32 ,
_wfindnext32i64 , _wfindnext64 ,
_wfindnext64i32 , _wfindnexti64
Статья • 03.04.2023

Найдите следующее имя , если оно есть, которое соответствует аргументу filespec
в предыдущем вызове _findfirst, а затем измените содержимое fileinfo структуры
соответствующим образом.

Синтаксис
C

int _findnext(

intptr_t handle,

struct _finddata_t *fileinfo

);

int _findnext32(

intptr_t handle,

struct _finddata32_t *fileinfo


);

int _findnext64(

intptr_t handle,

struct __finddata64_t *fileinfo

);

int _findnexti64(

intptr_t handle,

struct __finddatai64_t *fileinfo

);

int _findnext32i64(

intptr_t handle,

struct _finddata32i64_t *fileinfo

);

int _findnext64i32(

intptr_t handle,

struct _finddata64i32_t *fileinfo

);

int _wfindnext(

intptr_t handle,

struct _wfinddata_t *fileinfo

);

int _wfindnext32(

intptr_t handle,

struct _wfinddata32_t *fileinfo

);

int _wfindnext64(

intptr_t handle,

struct _wfinddata64_t *fileinfo

);

int _wfindnexti64(

intptr_t handle,

struct _wfinddatai64_t *fileinfo

);

int _wfindnext32i64(

intptr_t handle,

struct _wfinddatai64_t *fileinfo

);

int _wfindnext64i32(

intptr_t handle,

struct _wfinddata64i32_t *fileinfo

);

Параметры
handle

Дескриптор поиска, возвращенный предыдущим вызовом . _findfirst

fileinfo

Буфер сведений о файле.

Возвращаемое значение
В случае успеха возвращает 0. В противном случае возвращает значение -1 и
задает errno значение, указывающее характер сбоя. Возможные коды ошибок
приведены в следующей таблице.

Значение Условие
errno

EINVAL Недопустимый параметр: fileinfo имеет значение NULL . Или операционная


система возвратила непредвиденную ошибку.

ENOENT Больше не удалось найти ни одного соответствующего файла.

ENOMEM Недостаточно памяти или длина имени файла превысила MAX_PATH .

Если передается недопустимый параметр, эти функции вызывают обработчик


недопустимых параметров, как описано в разделе Проверка параметров.
Комментарии
После завершения необходимо вызвать _findclose функцию _findfirst или
_findnext (или любые варианты). _findclose освобождает ресурсы, используемые

этими функциями в приложении.

Варианты этих функций с префиксом w являются версиями расширенных


символов; В противном случае они идентичны соответствующим однобайтовой
функции.

Варианты этих функций поддерживают 32- или 64-разрядные типы времени и 32-
или 64-разрядные размеры файлов. Первый числовой суффикс ( 32 или 64 )
указывает размер используемого типа времени; второй суффикс i32 или
i64 показывает, представлен ли размер файла как 32- или 64-разрядное целое
число. Сведения о том, какие версии поддерживают 32- и 64-разрядные типы
времени и размеры файлов, см. в следующей таблице. Варианты, использующие
64-разрядный тип времени, допускают значение даты создания файла до 23:59:59
31 декабря 3000 года, время в формате UTC; варианты, использующие 32-
разрядные типы, могут представлять дату только до 23:59:59 18 января 2038 года,
время в формате UTC. Полночь 1 января 1970 года — нижняя граница диапазона
дат для всех этих функций.

Если нет какой-либо определенной причины использовать версии, указывающие


размер времени явно, используйте функцию _findnext или _wfindnext или, если
необходима поддержка размеров файлов больше 3 ГБ, используйте функцию
_findnexti64 или _wfindnexti64 . Все эти функции используют 64-разрядный тип

времени. В предыдущих версиях эти функции использовали 32-разрядный тип


времени. Если это изменение является критическим для приложения, вы можете
определить _USE_32BIT_TIME_T , чтобы получить старое поведение. Если определена
директива _USE_32BIT_TIME_T , функции _findnext , _findnexti64 и соответствующие
версии Юникода используют 32-разрядное время.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Варианты типов времени и типов длины файлов в


функции _findnext

Функции Директива _USE_32BIT_TIME_T Тип времени Тип длины


определена? файла
Функции Директива _USE_32BIT_TIME_T Тип времени Тип длины
определена? файла

_findnext , _wfindnext Не определено 64-разрядная 32-разрядная


версия

_findnext , _wfindnext Определено 32-битная 32-битная

_findnext32 , Не затрагивается 32-битная 32-битная


_wfindnext32 определением макроса

_findnext64 , Не затрагивается 64-разрядная 64-разрядная


_wfindnext64 определением макроса система система

_findnexti64 , Не определено 64-разрядная 64-разрядная


_wfindnexti64 система система

_findnexti64 , Определено 32-разрядная 64-разрядная


_wfindnexti64 версия версия

_findnext32i64 , Не затрагивается 32-разрядная 64-разрядная


_wfindnext32i64 определением макроса версия версия

_findnext64i32 , Не затрагивается 64-разрядная 32-разрядная


_wfindnext64i32 определением макроса версия

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tfindnext _findnext _findnext _wfindnext

_tfindnext32 _findnext32 _findnext32 _wfindnext32

_tfindnext64 _findnext64 _findnext64 _wfindnext64

_tfindnexti64 _findnexti64 _findnexti64 _wfindnexti64

_tfindnext32i64 _findnext32i64 _findnext32i64 _wfindnext32i64

_tfindnext64i32 _findnext64i32 _findnext64i32 _wfindnext64i32

Требования
Компонент Обязательный заголовок

_findnext <io.h>

_findnext32 <io.h>

_findnext64 <io.h>

_findnexti64 <io.h>

_findnext32i64 <io.h>

_findnext64i32 <io.h>

_wfindnext <io.h> или <wchar.h>

_wfindnext32 <io.h> или <wchar.h>

_wfindnext64 <io.h> или <wchar.h>

_wfindnexti64 <io.h> или <wchar.h>

_wfindnext32i64 <io.h> или <wchar.h>

_wfindnext64i32 <io.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Системные вызовы

Функции поиска имени файла


Примитивы с плавающей запятой
Статья • 03.04.2023

Примитивные функции, относящиеся к Корпорации Майкрософт, которые


используются для реализации некоторых стандартных функций библиотеки
времени выполнения CRT с плавающей запятой. Они описаны здесь для полноты,
но не рекомендуются для использования. Некоторые из этих функций отмечены
как неиспользуемые, так как они, как известно, имеют проблемы с точностью,
обработкой исключений и соответствием поведению IEEE-754. Они существуют в
библиотеке только для обратной совместимости. Для правильного поведения,
переносимости и соблюдения стандартов предпочтите стандартные функции с
плавающей запятой по сравнению с этими функциями.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

_dclass , _ldclass , _fdclass

Синтаксис
C

short __cdecl _dclass(double x);

short __cdecl _ldclass(long double x);

short __cdecl _fdclass(float x);

Параметры
x

Аргумент функции с плавающей запятой.

Комментарии
Эти примитивы с плавающей запятой реализуют версии макроса fpclassify CRT для
типов с плавающей запятой. Классификация аргумента x возвращается как одна из
этих констант, определенная в math.h:

Значение Описание
Значение Описание

FP_NAN Сигнальное, несигнальное или неопределенное значение NaN

FP_INFINITE Положительная или отрицательная бесконечность

FP_NORMAL Положительное или отрицательное нормализованное ненулевое значение

FP_SUBNORMAL Положительное или отрицательное субнормальное значение


(денормализованное)

FP_ZERO Положительное или отрицательное нулевое значение

Для получения дополнительных сведений можно использовать функции,


относящиеся _fpclass_fpclassf к Корпорации Майкрософт. fpclassify Используйте
макрос или функцию для переносимости.

_dsign , _ldsign , _fdsign

Синтаксис
C

int __cdecl _dsign(double x);

int __cdecl _ldsign(long double x);

int __cdecl _fdsign(float x);

Параметры
x

Аргумент функции с плавающей запятой.

Комментарии
Эти примитивы с плавающей запятой реализуют signbit макрос или функцию в CRT.
Они возвращают ненулевое значение, если бит знака задан в символике (мантиссе)
аргумента x . В противном случае они возвращают значение 0, если бит знака не
задан.

_dpcomp, _ldpcomp, _fdpcomp


Синтаксис
C

int __cdecl _dpcomp(double x, double y);

int __cdecl _ldpcomp(long double x, long double y);

int __cdecl _fdpcomp(float x, float y);

Параметры
x, y

Аргументы функции с плавающей запятой.

Комментарии
Эти примитивы с плавающей запятой принимают два аргумента, x а y также
возвращают значение, показывающее их отношение упорядочения, выраженное
как побитовое или из этих констант, определенное в math.h:

Значение Описание

_FP_LT x может считаться меньше, чем y

_FP_EQ x может считаться равным y

_FP_GT x может считаться больше, чем y

Эти примитивы реализуют isgreaterв islessislessgreaterisgreaterequalislessequalCRT


макросы, макросы и isunordered функции, а также макросы и функции.

_dtest, _ldtest, _fdtest

Синтаксис
C

short __cdecl _dtest(double* px);

short __cdecl _ldtest(long double* px);

short __cdecl _fdtest(float* px);

Параметры
px

Указатель на аргумент с плавающей запятой.

Комментарии
Эти примитивы с плавающей запятой реализуют версии C++ функции fpclassify CRT
для типов с плавающей запятой. Аргумент x вычисляется, а классификация
возвращается как одна из этих констант, определенных в math.h:

Значение Описание

FP_NAN Сигнальное, несигнальное или неопределенное значение NaN

FP_INFINITE Положительная или отрицательная бесконечность

FP_NORMAL Положительное или отрицательное нормализованное ненулевое значение

FP_SUBNORMAL Положительное или отрицательное субнормальное значение


(денормализованное)

FP_ZERO Положительное или отрицательное нулевое значение

Для получения дополнительных сведений можно использовать функции,


относящиеся _fpclass_fpclassf к Корпорации Майкрософт. Используйте функцию
fpclassify для переносимости.

_d_int, _ld_int, _fd_int

Синтаксис
C

short __cdecl _d_int(double* px, short exp);

short __cdecl _ld_int(long double* px, short exp);

short __cdecl _fd_int(float* px, short exp);

Параметры
px

Указатель на аргумент с плавающей запятой.

exp

Экспонент как целочисленный тип.


Комментарии
Эти примитивы с плавающей запятой принимают указатель на значение с
плавающей запятой и экспонентное значение px exp , а также удаляют дробную
часть значения с плавающей запятой ниже заданного экспонента, если это
возможно. Возвращаемое значение является результатом fpclassify входного
значения в px том случае, если это naN или бесконечность, а выходное значение
— в px противном случае.

_dscale, _ldscale, _fdscale

Синтаксис
C

short __cdecl _dscale(double* px, long exp);

short __cdecl _ldscale(long double* px, long exp);

short __cdecl _fdscale(float* px, long exp);

Параметры
px

Указатель на аргумент с плавающей запятой.

exp

Экспонент как целочисленный тип.

Комментарии
Эти примитивы с плавающей запятой принимают указатель на значение px с
плавающей запятой и экспонентное значение exp , а по возможности
масштабируйте значение на px 2 exp . Возвращаемое значение является результатом
fpclassify входного значения в px том случае, если это naN или бесконечность, а
выходное значение — в px противном случае. Для переносимости предпочтите
ldexp, ldexpfфункции. ldexpl

_dunscale, _ldunscale, _fdunscale


Синтаксис
C

short __cdecl _dunscale(short* pexp, double* px);

short __cdecl _ldunscale(short* pexp, long double* px);

short __cdecl _fdunscale(short* pexp, float* px);

Параметры
pexp

Указатель на экспоненту в виде целочисленного типа.

px

Указатель на аргумент с плавающей запятой.

Комментарии
Эти примитивы с плавающей запятой разбивают значение с плавающей запятой,
указываемое на px знаки (мантисса) и экспоненту, если это возможно. Знак
масштабируется таким образом, что абсолютное значение больше или равно 0,5 и
меньше 1,0. Экспонентой является значение n , в котором исходное значение с
плавающей запятой равно масштабируемому признаку, равному 2n. Эта
целочисленная экспонента n хранится в расположении, на которое указывает
pexp . Возвращаемое значение является результатом fpclassify входного значения
в px том случае, если это naN или бесконечность, а в противном случае —
выходное значение. Для переносимости предпочтите frexp, frexpfфункции. frexpl

_dexp, _ldexp, _fdexp

Синтаксис
C

short __cdecl _dexp(double* px, double y, long exp);

short __cdecl _ldexp(long double* px, long double y, long exp);

short __cdecl _fdexp(float* px, float y, long exp);

Параметры
y

Аргумент функции с плавающей запятой.

px

Указатель на аргумент с плавающей запятой.

exp

Экспонент как целочисленный тип.

Комментарии
Эти примитивы с плавающей запятой создают значение с плавающей запятой в
расположении, px y на которое указывает значение * 2exp. Возвращаемое значение
является результатом fpclassify входного значения в y том случае, если это naN
или бесконечность, а выходное значение — в px противном случае. Для
переносимости предпочтите ldexp, ldexpfфункции. ldexpl

_dnorm, _fdnorm

Синтаксис
C

short __cdecl _dnorm(unsigned short* ps);

short __cdecl _fdnorm(unsigned short* ps);

Параметры
ps

Указатель на побитовое представление значения с плавающей запятой,


выраженное в виде массива unsigned short .

Комментарии
Эти примитивы с плавающей запятой нормализуют дробную часть
недополученного значения с плавающей запятой и корректируют характеристику
или предвзятую степень в соответствии с ней. Значение передается в виде
побитового представления типа с плавающей запятой, преобразованного в массив
unsigned short через _double_val объединение , или _float_val объединения типа
punning, _ldouble_val объявленного в math.h. Возвращаемое значение является
результатом входного fpclassify значения с плавающей запятой, если это NaN или
бесконечность, а в противном случае — значение выходных данных.

_dpoly, _ldpoly, _fdpoly

Синтаксис
C

double __cdecl _dpoly(double x, double const* table, int n);

long double __cdecl _ldpoly(long double x, long double const* table, int n);

float __cdecl _fdpoly(float x, _float const* table, int n);

Параметры
x

Аргумент функции с плавающей запятой.

table

Указатель на таблицу постоянных коэффициентов для полиномиальной.

Порядок вычисляемого полиномиала.

Комментарии
Эти примитивы с плавающей запятой возвращают оценку x в полиномиале
порядка n , коэффициенты которого представлены соответствующими
постоянными значениями в table . Например, если table[0] = 3,0, table[1] = 4,0,
table[2] = 5,0 и n = 2, он представляет полиномиальный 5,0x2 + 4,0x + 3,0. Если

этот полиномиал вычисляется для x 2,0, результат будет равен 31,0. Эти функции
не используются внутри системы.

_dlog, _dlog, _dlog

Синтаксис
C
double __cdecl _dlog(double x, int base_flag);

long double __cdecl _ldlog(long double x, int base_flag);

float __cdecl _fdlog(float x, int base_flag);

Параметры
x

Аргумент функции с плавающей запятой.

base_flag

Флаг, который управляет используемой базой, 0 для базового e и ненулевых для


base 10.

Комментарии
Эти примитивы с плавающей запятой возвращают естественный журнал x (ln(x)
или loge(x)), если base_flag равен 0. Они возвращают базу журнала 10 или
журнал10 x (x), если base_flag значение не равно нулю. Эти функции не
используются внутри системы. Для переносимости предпочтите функцииlog, , logf, ,
logllog10, log10fа также log10l.

_dsin, _ldsin, _fdsin

Синтаксис
C

double __cdecl _dsin(double x, unsigned int quadrant);

long double __cdecl _ldsin(long double x, unsigned int quadrant);

float __cdecl _fdsin(float x, unsigned int quadrant);

Параметры
x

Аргумент функции с плавающей запятой.

quadrant

Смещение квадранта от 0, 1, 2 или 3 для получения sin , cos -sin и -cos


результатов.
Комментарии
Эти примитивы с плавающей запятой возвращают синус x смещения по quadrant
модулю 4. Фактически, они возвращают синус, косинус, -синус и -косинус x , когда
quadrant модулю 4 равно 0, 1, 2 или 3 соответственно. Эти функции не

используются внутри системы. Для переносимости предпочтите sin, , sinf, sinlcos,


cosfcosl функции.

Требования
Заголовок: <math.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
fpclassify

_fpclass, _fpclassf

isfinite, _finite, _finitef

isinf

isnan, _isnan, _isnanf

isnormal

cos, cosf, cosl

frexp, frexpf, frexpl

ldexp, ldexpf, ldexpl

log, logf, logl, log10, log10f, log10l

sin, sinf, sinl


floor , floorf , floorl
Статья • 03.04.2023

Округляет значение вниз до целого числа.

Синтаксис
C

double floor(

double x

);

float floor(

float x

); // C++ only

long double floor(

long double x

); // C++ only

float floorf(

float x

);

long double floorl(

long double x

);

#define floor(X) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функции floor возвращают значение с плавающей запятой, которое представляет
наибольшее целое число, не превосходящее x . Ошибка не возвращается.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

Функция floor содержит реализацию, которая использует Streaming SIMD


Extensions 2 (SSE2). Сведения и ограничения по использованию реализации SSE2
см. в разделе _set_SSE2_enable.
Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки floor , которые
принимают и возвращают значения типов float и long double . В программе C,
если вы не используете <макрос tgmath.h> для вызова этой функции, floor всегда
принимает и возвращает double .

Если вы используете <макрос tgmath.h> floor() , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Обязательный заголовок

floor , floorf , floorl <math.h>

floor Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_floor.c

// This example displays the largest integers

// less than or equal to the floating-point values 2.8

// and -2.8. It then shows the smallest integers greater

// than or equal to 2.8 and -2.8.

#include <math.h>

#include <stdio.h>

int main( void )

double y;

y = floor( 2.8 );

printf( "The floor of 2.8 is %f\n", y );

y = floor( -2.8 );

printf( "The floor of -2.8 is %f\n", y );

y = ceil( 2.8 );

printf( "The ceil of 2.8 is %f\n", y );

y = ceil( -2.8 );

printf( "The ceil of -2.8 is %f\n", y );

Output

The floor of 2.8 is 2.000000

The floor of -2.8 is -3.000000

The ceil of 2.8 is 3.000000

The ceil of -2.8 is -2.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ceil, ceilf, ceill

round, roundf, roundl

fmod, fmodf
flushall
Статья • 03.04.2023

Имя flushall функции, зависят от Майкрософт, является устаревшим псевдонимом


_flushall для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _flushall . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_flushall
Статья • 03.04.2023

Сбрасывает все потоки; очищает все буферы.

Синтаксис
C

int _flushall( void );

Возвращаемое значение
_flushall возвращает число открытых потоков (ввода и вывода). Ошибка не
возвращается.

Комментарии
По умолчанию функция _flushall записывает в соответствующие файлы
содержимое всех буферов, связанных с открытыми потоками вывода. Все буферы,
связанные с открытыми входными потоками, очищаются. (Эти буферы обычно
обслуживаются операционной системой, которая автоматически определяет
оптимальное время записи данных на диск: при заполнении буфера, при закрытии
потока или при нормальном завершении программы без закрытия потоков).

Если после вызова функции _flushall выполняется операция чтения, из входных


файлов в буферы считываются новые данные. После вызова функции _flushall все
потоки остаются открытыми.

Предусмотренная в библиотеке времени выполнения функция фиксации на диск


позволяет обеспечить запись критически важных данных непосредственно на диск,
а не в буферы операционной системы. Без перезаписи существующей программы
эту функцию можно включить, связав файлы объектов программы с Commode.obj.
В результирующем исполняемом файле вызывает запись _flushall содержимого
всех буферов на диск. Файл Commode.obj влияет только на функции _flushall и
fflush.

Сведения об управлении функцией фиксации на диск см. в разделе Stream I/Ofopen


и _fdopen.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

_flushall <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_flushall.c

// This program uses _flushall

// to flush all open buffers.

#include <stdio.h>

int main( void )

int numflushed;

numflushed = _flushall();

printf( "There were %d streams flushed\n", numflushed );

Output

There were 3 streams flushed

См. также раздел


Потоковый ввод-вывод

_commit

fclose, _fcloseall

fflush

setvbuf
fma , fmaf , fmal
Статья • 09.05.2023

Умножает два значения вместе, добавляет третье значение, а затем округляет


результат, теряя при этом лишь небольшое количество точности из-за
промежуточного округления.

Синтаксис
C

double fma(

double x,

double y,

double z

);

float fma(

float x,

float y,

float z

); //C++ only

long double fma(

long double x,

long double y,

long double z

); //C++ only

float fmaf(

float x,

float y,

float z

);

long double fmal(

long double x,

long double y,

long double z

);

#define fma(X, Y, Z) // Requires C11 or higher

Параметры
x

Первое значение для перемножения.

Второе значение для перемножения.

Значение для сложения.

Возвращаемое значение
Возвращает приблизительно (x * y) + z . Возвращаемое значение затем
округляется с использованием текущего формата округления, хотя во многих
случаях оно возвращает неправильно округленные результаты, поэтому значение
может быть неточным до половины ULP от правильного значения.

В случае неудачи может возвращать одно из следующих значений:

Проблема Возвращает

x = INFINITY, y = 0 или
Не число

x = 0, y = INFINITY

x или y = точное значение ± INFINITY, z = INFINITY с Не число


противоположным знаком

x или y = NaN Не число

не ( x = 0, y = неопределенное значение) и z = NaN


Не число

не ( x = неопределенное значение, y =0) и z = NaN

Ошибка переполнения диапазона HUGE_VAL ±, ± HUGE_VALF или


± HUGE_VALL

Ошибка недостаточного заполнения диапазона правильное значение (после


округления).

Ошибки отображаются в соответствии с указанными в _matherr.

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции fma ,
принимающие и возвращающие типы float и long double . В программе C, если вы
не используете <макрос tgmath.h> для вызова этой функции, fma всегда
принимает и возвращает double .

При использовании <макроса tgmath.h> fma() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

Эта функция вычисляет значение с бесконечной точностью, после чего округляет


результат.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

fma , fmaf , fmal <math.h> <cmath>

fma Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

remainder, remainderf, remainderl

remquo, remquof, remquol


fmax , fmaxf , fmaxl
Статья • 03.04.2023

Определяет большее из двух указанных числовых значений.

Синтаксис
C

double fmax(

double x,

double y

);

float fmax(

float x,

float y

); //C++ only

long double fmax(

long double x,

long double y

); //C++ only

float fmaxf(

float x,

float y

);

long double fmaxl(

long double x,

long double y

);

#define fmax(X, Y) // Requires C11 or higher

Параметры
x

Первое сравниваемое значение.

Второе сравниваемое значение.

Возвращаемое значение
В случае успешного выполнения возвращает большее из значений x или y .
Возвращаемое значение является точным и не зависит от любой формы
округления.

В случае неудачи может возвращать одно из следующих значений:

Проблема Возвращает

x = не число y

y = не число x

x и y = NaN Не число

Эта функция не использует ошибки, указанные в ._matherr

Комментарии
Так как C++ разрешает перегрузку, можно вызывать перегрузки fmax, которые
принимают и возвращают float long double и типы. В программе C, если вы не
используете <макрос tgmath.h> для вызова этой функции, fmax всегда принимает и
возвращает значение double.

При использовании <макроса tgmath.h> fmax() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

Требования
Компонент Заголовок C Заголовок C++

fmax , fmaxf , fmaxl <math.h> <cmath> или <math.h>

fmax Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fmin, fminf, fminl


fmin , fminf , fminl
Статья • 03.04.2023

Определяет наименьшее из двух указанных значений.

Синтаксис
C

double fmin(

double x,

double y

);

float fmin(

float x,

float y

); //C++ only

long double fmin(

long double x,

long double y

); //C++ only

float fminf(

float x,

float y

);

long double fminl(

long double x,

long double y

);

#define fmin(x) // Requires C11 or higher

Параметры
x

Первое сравниваемое значение.

Второе сравниваемое значение.

Возвращаемое значение
В случае успешного выполнения возвращает меньшее из значений x или y .

Входные данные Результат

x имеет значение NaN y

y имеет значение NaN x

x и y имеют значения NaN Не число

Функция не вызывает _matherr вызов, не вызывает исключения с плавающей


запятой или не изменяет значение errno .

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции fmin ,
принимающие и возвращающие типы float и long double . В программе C, если вы
не используете <макрос tgmath.h> для вызова этой функции, fmin всегда
принимает и возвращает значение double .

При использовании <макроса tgmath.h> fmin() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

Требования
Подпрограмма Обязательный заголовок

fmin , fminf , fminl C: <math.h>

C++: <math.h> или <cmath>

fmin Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

fmax, fmaxf, fmaxl


fmod , fmodf , fmodl
Статья • 03.04.2023

Вычисляет остаток с плавающей запятой.

Синтаксис
C

double fmod(

double x,

double y

);

float fmod(

float x,

float y

); // C++ only

long double fmod(

long double x,

long double y

); // C++ only

float fmodf(

float x,

float y

);

long double fmodl(

long double x,

long double y

);

#define fmod(X, Y) // Requires C11 or higher

Параметры
x, y

Значения с плавающей запятой.

Возвращаемое значение
Функция fmod возвращает остаток от деления x / y в виде числа с плавающей
запятой. Если значение y равно 0,0, fmod возвращает тихий NaN . Сведения о
представлении тихой NaN семьей см. в printf разделе printf.
Комментарии
Функция fmod вычисляет остаток f от деления x / y в виде числа с плавающей
запятой следующим образом: x = i * y + f , где i  — это целое число, f имеет тот
же знак, что и x , а абсолютное значение f меньше абсолютного значения y .

Так как C++ допускает перегрузку, можно вызывать перегрузки fmod , которые
принимают и возвращают значения типов float и long double . В программе C,
если вы не используете <tgmath.h> макрос для вызова этой функции, fmod всегда
принимает два double аргумента и возвращает . double

Если вы используете fmod макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Обязательный заголовок

fmod , fmodf , fmodl <math.h>

fmod Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fmod.c

// This program displays a floating-point remainder.

#include <math.h>

#include <stdio.h>

int main( void )

double w = -10.0, x = 3.0, z;

z = fmod( w, x );

printf( "The remainder of %.2f / %.2f is %f\n", w, x, z );

Output

The remainder of -10.00 / 3.00 is -1.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ceil, ceilf, ceill

fabs, fabsf, fabsl

floor, floorf, floorl

_CIfmod
fopen , _wfopen
Статья • 27.04.2023

Открывает файл. Доступны более безопасные версии этих функций, которые


выполняют большую проверку параметров и возвращают коды ошибок; См.
разделfopen_s , _wfopen_s.

Синтаксис
C

FILE *fopen(

const char *filename,

const char *mode

);

FILE *_wfopen(

const wchar_t *filename,

const wchar_t *mode

);

Параметры
filename

Имя файла.

mode

Включенный тип доступа.

Возвращаемое значение
Каждая из этих функций возвращает указатель на открытый файл. Значение
указателя null обозначает ошибку. Если filename или mode является NULL или
пустой строкой, эти функции активируют обработчик недопустимых параметров,
как описано в разделе Проверка параметров. Если продолжение выполнения
разрешено, эти функции возвращают NULL и устанавливают для errno значение
EINVAL .

Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функция fopen открывает файл, указанный параметром filename . По умолчанию
узкая filename строка интерпретируется с помощью кодовой страницы ANSI
( CP_ACP ). В классических приложениях Windows ее можно изменить на кодовую
страницу изготовителя оборудования ( CP_OEMCP ) с помощью SetFileApisToOEM
функции . Функцию можно использовать, AreFileApisANSI чтобы определить,
интерпретируется ли filename она с помощью ANSI или системной кодовой
страницы OEM по умолчанию. _wfopen — это версия расширенных символов
fopen ; _wfopen аргументы являются строками расширенных символов. В противном

случае поведение _wfopen и fopen идентично. Простое использование _wfopen не


влияет на набор закодированных символов, используемый в потоке файлов.

fopen принимает пути, допустимые в файловой системе, в точке выполнения;

fopen принимает UNC-пути и пути, содержащие сопоставленные сетевые диски,


если выполняющая код система имеет доступ к общей папке или сопоставленному
диску во время выполнения. При создании путей для fopen убедитесь, что диски,
пути или сетевые ресурсы доступны в среде выполнения. В качестве разделителей
каталогов в пути можно использовать косую черту ( / ) или обратную косую черту
( \ ).

Перед выполнением других операций с файлом всегда проверка возвращаемое


значение, чтобы узнать, имеет ли указатель значение NULL. При возникновении
ошибки задается глобальная переменная errno , которая может использоваться
для получения определенных сведений об ошибке. Дополнительные сведения см.
в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе Глобальное состояние в CRT.

Поддержка Юникода
fopen поддерживает файловые потоки Юникода. Чтобы открыть файл Юникода,
передайте флаг ccs=encoding , задающий нужную кодировку, в fopen следующим
образом.

FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");

Допустимые значения для ccs кодирования: UNICODE , UTF-8 и UTF-16LE .

Если файл открывается в режиме Юникода, функции ввода преобразуют данные,


считываемые из файла в данные UTF-16, хранимые с типом wchar_t . Затем
функции, которые выполняют запись в файл, открытый в режиме Юникода,
ожидают буферы, содержащие данные UTF-16, хранимые с типом wchar_t . Если
файл закодирован как UTF-8, то при записи данные UTF-16 претворяются в UTF-8.
Содержимое файла в кодировке UTF-8 преобразуется в UTF-16 при чтении.
Попытка чтения или записи нечетного числа байтов в режиме Юникода вызывает
ошибку проверки параметров . Для чтения или записи данных, хранимых в
программе в кодировке UTF-8, используйте режим текстового или двоичного
файла вместо режима Юникода. Вы несете ответственность за любой необходимый
перевод кодирования.

Если файл уже существует и открыт для чтения или добавления, кодировку
определяет любая метка порядка байтов (BOM) в файле. Кодировка BOM имеет
приоритет над кодировкой, указанной флагом ccs . Кодирование ccs
используется, только если метка BOM отсутствует или речь идет о новом файле.

7 Примечание

Обнаружение метки BOM применяется только к файлам, которые будут


открываться в режиме Юникода (т е путем передачи флага ccs ).

В следующей таблице приведены режимы, которые используются для различных


флагов ccs , присвоенных fopen и метка порядка байтов в файле.

Кодировки, используемые на основе флага ccs и BOM

Флаг ccs Нет метки BOM (или новый файл) BOM: UTF-8 BOM: UTF-16

UNICODE UTF-16LE UTF-8 UTF-16LE

UTF-8 UTF-8 UTF-8 UTF-16LE

UTF-16LE UTF-16LE UTF-8 UTF-16LE

В файлы, открытые для записи в режиме Юникода, метка BOM записывается


автоматически.

Если mode параметр имеет a, ccs=encoding какое-то encoding значение, fopen


сначала пытается открыть файл с помощью доступа для чтения и записи. Если это
действие выполнено успешно, функция считывает BOM, чтобы определить
кодировку для файла. В случае сбоя функция использует кодировку по умолчанию
для файла. В любом случае fopen повторно открывает файл с доступом только для
записи. (Это поведение относится только к режиму "a" , а не к режиму "a+" .)
Сопоставления подпрограмм с универсальным
текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfopen fopen fopen _wfopen

Символьная строка mode указывает тип доступа, который запрошен для файла,
следующим образом.

mode Access

"r" Открывает для чтения. Если файл не существует или его не удается найти, вызов
завершается ошибкой fopen .

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление) без удаления маркера в конце
файла (EOF) перед записью новых данных в файл. Создает файл, если он не
существует.

"r+" Открывает для чтения и записи. Файл должен существовать.

"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое
удаляется.

"a+" Открывается для чтения и добавления. Операция добавления включает удаления


маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается
после завершения записи. Создает файл, если он не существует.

Если файл открывается с помощью типа доступа "a" или "a+" , все операции
записи выполняются в конце файла. Указатель файла может быть перемещен с
помощью fseek или rewind, но он всегда возвращается в конец файла перед
выполнением любой операции записи. Таким образом, существующие данные
нельзя перезаписать.

Режим "a" не удаляет маркер EOF перед добавлением в файл. После добавления
команда MS-DOS TYPE отображает данные только до первоначального маркера
EOF и не отображает данные, добавленные в файл. Перед добавлением в файл
режим "a+" удаляет маркер EOF. После добавления команда TYPE MS-DOS
отображает все данные в файле. Режим "a+" требуется для добавления в файл
потока, который завершается маркером CTRL +Z EOF.
Если задан тип доступа "r+" , "w+" или "a+" , чтение и запись разрешены (считается,
что файл открыт для обновления). Однако при переходе от чтения к записи
операция ввода должна получить маркер конца файла. Если EOF отсутствует,
необходимо использовать промежуточный вызов функции позиционирования
файлов. Функции размещения файла — fsetpos , fseekи rewind. При переходе от
записи к чтению необходимо воспользоваться промежуточным вызовом функции
fflush или функции размещения файла.

В дополнение к указанным ранее значениям можно добавить в mode следующие


символы, чтобы задать режим перевода для символов новой строки.

mode Режим перевода


Модификатор

t Откройте файл в текстовом (переведенном) режиме. Комбинации


обратной строки каретки (CR-LF) преобразуются в однострочные каналы
(LF) на входе, а символы LF преобразуются в сочетания CR-LF на выходе.
Кроме того, при вводе символ CTRL+Z интерпретируется как символ конца
файла.

b Открыть в двоичном (непереводимый) режиме; Переводы, включающие


символы возврата каретки и перевода строки, подавляются.

В текстовом режиме CTRL +Z интерпретируется как символ EOF при входе. В


файлах, открытых для чтения и записи с помощью "a+" , fopen проверяет наличие
CTRL +Z в конце файла и удаляет его, если это возможно. Он удален, так как
использование fseek и ftell для перемещения в файле, который заканчивается на
CTRL +Z , может привести fseek к неправильному поведению в конце файла.

В текстовом режиме сочетания перевода строки возврата каретки (CRLF)


преобразуются в символы однострочного перевода (LF) на входе, а символы LF
преобразуются в сочетания CRLF на выходе. Если функция ввода-вывода потока
Юникода работает в текстовом режиме (по умолчанию) исходный или конечный
поток рассматривается как последовательность многобайтовых символов. Поэтому
входные функции потока Юникода преобразуют многобайтовые символы в
расширенные (как если бы для этого вызывалась функция mbtowc ). По той же
причине выходные функции потока Юникода преобразуют расширенные символы
в многобайтовые (как если бы для этого вызывалась функция wctomb ).

Если t или b не задано в mode , режим преобразования по умолчанию


определяется глобальной переменной _fmode. Если символ t или b указан как
префикс аргумента, функция завершается с ошибкой и возвращает NULL .
Дополнительные сведения об использовании текстовых и двоичных режимов в
Юникоде и многобайтовом потоковом вводе-выводе см. в разделах Текстовый и
двоичный режим файлового ввода-вывода и Потоковые операции ввода-вывода
Юникода в текстовом и двоичном режимах.

Следующие параметры можно добавить в , mode чтобы указать дополнительные


варианты поведения.

mode Поведение
Модификатор

x Вызывает сбой функции, если filename она уже существует. Может


использоваться только с описателями "w" или "w+".

c Включите флажок фиксации для связанного объекта filename , чтобы


содержимое файлового буфера записывалось непосредственно на диск
при вызове fflush или _flushall .

n Сбросьте флаг фиксации для связанного filename объекта на "нет


фиксации". Этот флаг используется по умолчанию. Оно также
переопределяет глобальный флаг фиксации при соединении программы с
COMMODE.OBJ. Глобальный флаг фиксации по умолчанию — "без
фиксации", если вы явно не привязываете программу к COMMODE. OBJ
(см. раздел Параметры ссылки).

N Указывает, что файл не наследуется дочерними процессами.

S Указывает, что кэширование оптимизировано для последовательного


доступа с диска, но не ограничивается им.

R Указывает, что кэширование оптимизировано для случайного доступа с


диска, но не ограничивается им.

T Указывает файл, который не записывается на диск, если это не требует


нехватки памяти.

D Указывает временный файл, который удаляется при закрытии последнего


указателя на него.

ccs=encoding Задает кодировку, используемую для данного файла (один из UTF-8 , UTF-
16LE или UNICODE ). Не указывайте никакое значение, если требуется
использовать кодировку ANSI. Этот флаг отделен от флагов, которые
предшествуют ему запятой ( , ). Пример: FILE *f = fopen("newfile.txt",
"rt+, ccs=UTF-8");

Допустимые символы для строки, используемой mode в fopen , и _fdopen


соответствуют аргументам oflag , используемым в _open и _sopen, как показано
ниже.
Символы в строке mode Эквивалентное значение oflag для _open / _sopen

a _O_WRONLY | _O_APPEND (обычно _O_WRONLY | _O_CREAT | _O_APPEND )

a+ _O_RDWR | _O_APPEND (обычно _O_RDWR | _O_APPEND | _O_CREAT )

r _O_RDONLY

r+ _O_RDWR

w _O_WRONLY (обычно _O_WRONLY | _O_CREAT | _O_TRUNC )

w+ _O_RDWR (обычно _O_RDWR | _O_CREAT | _O_TRUNC )

b _O_BINARY

t _O_TEXT (переведено)

x _O_EXCL

c Нет

n Нет

S _O_SEQUENTIAL

R _O_RANDOM

T _O_SHORTLIVED

D _O_TEMPORARY

ccs=UNICODE _O_WTEXT

* ccs=UTF-8* _O_UTF8

ccs=UTF-16LE _O_UTF16

Если вы используете rb режим, вам не нужно переносить код, и если вы


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

В отношении T и D :

T позволяет избежать записи файла на диск, если он не требует нехватки

памяти. Дополнительные сведения см. в разделе


FILE_ATTRIBUTE_TEMPORARY Константы атрибута файла, а также в этой записи
блога Это только временные действия.
D указывает обычный файл, записываемый на диск. Разница заключается в

том, что он автоматически удаляется при закрытии.


Можно объединить TD ,
чтобы получить обе семантики.

Параметры c , n , R , S , t , T и D mode являются расширениями Майкрософт для


fopen и _wfopen и не должны использоваться, если требуется переносимость ANSI.

Требования
Компонент Обязательный заголовок

fopen <stdio.h>

_wfopen <stdio.h> или <wchar.h>

_wfopen является расширением Майкрософт. Дополнительные сведения о

совместимости см. в разделе Совместимость.

Параметры c , n , t , S , R , T и D mode являются расширениями Майкрософт для


fopen и _fdopen и не должны использоваться, если необходимо переносимость

ANSI.

Пример 1
Следующая программа открывает два файла. Она использует fclose для закрытия
первого файла и _fcloseall для закрытия всех остальных файлов.

// crt_fopen.c

// compile with: /W3

// This program opens two files. It uses

// fclose to close the first file and

// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )

int numclosed;

// Open for read (will fail if file "crt_fopen.c" does not exist)

if( (stream = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996

// Note: fopen is deprecated; consider using fopen_s instead

printf( "The file 'crt_fopen.c' was not opened\n" );

else

printf( "The file 'crt_fopen.c' was opened\n" );

// Open for write

if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996

printf( "The file 'data2' was not opened\n" );

else

printf( "The file 'data2' was opened\n" );

// Close stream if it is not NULL

if( stream)

if ( fclose( stream ) )

printf( "The file 'crt_fopen.c' was not closed\n" );

// All other files are closed:

numclosed = _fcloseall( );

printf( "Number of files closed by _fcloseall: %u\n", numclosed );

Output

The file 'crt_fopen.c' was opened


The file 'data2' was opened

Number of files closed by _fcloseall: 1

Пример 2
Следующая программа создает файл (или перезаписывает его, если имеется) в
текстовом режиме с кодировкой Юникода. Затем она записывает две строки в
файл и закрывает его. Выходные данные — это файл с именем _wfopen_test.xml ,
который содержит данные из раздела выходных данных.

// crt__wfopen.c

// compile with: /W3

// This program creates a file (or overwrites one if

// it exists), in text mode using Unicode encoding.

// It then writes two strings into the file

// and then closes the file.

#include <stdio.h>

#include <stddef.h>

#include <stdlib.h>

#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)

wchar_t str[BUFFER_SIZE];

size_t strSize;

FILE* fileHandle;

// Create an the xml file in text and Unicode encoding mode.

if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) ==


NULL) // C4996

// Note: _wfopen is deprecated; consider using _wfopen_s instead

wprintf(L"_wfopen failed!\n");

return(0);

// Write a string into the file.

wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");

strSize = wcslen(str);

if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)

wprintf(L"fwrite failed!\n");

// Write a string into the file.

wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");

strSize = wcslen(str);

if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)

wprintf(L"fwrite failed!\n");

// Close the file.

if (fclose(fileHandle))

wprintf(L"fclose failed!\n");

return 0;

См. также раздел


Потоковый ввод-вывод

Интерпретация последовательностей многобайтовых символов

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode

_sopen, _wsopen
fopen_s , _wfopen_s
Статья • 27.04.2023

Открывает файл. Эти версии fopenимеют _wfopen улучшения безопасности, как


описано в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t fopen_s(

FILE** pFile,

const char *filename,

const char *mode

);

errno_t _wfopen_s(

FILE** pFile,

const wchar_t *filename,

const wchar_t *mode

);

Параметры
pFile

Указатель на файл, который получает указатель на открытый файл.

filename

Имя файла, который необходимо открыть.

mode

Тип разрешенного доступа.

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.
Дополнительные сведения об этих кодах ошибок см. в разделах errno, _doserrno,
_sys_errlistи _sys_nerr.

Условия ошибок

pFile filename mode Возвращаемое значение Содержимое pFile


pFile filename mode Возвращаемое значение Содержимое pFile

NULL any any EINVAL без изменений

any NULL any EINVAL без изменений

any any NULL EINVAL без изменений

Комментарии
Функции fopen_s и _wfopen_s не могут открыть файл для общего доступа. Если вам
нужно предоставить общий доступ к файлу, используйте _fsopen или _wfsopen с
соответствующей константой режима общего доступа, например используйте
_SH_DENYNO для общего доступа для чтения и записи.

Функция fopen_s открывает файл, указанный параметром filename . _wfopen_s —


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

Функция fopen_s принимает пути, допустимые в файловой системе во время


выполнения; UNC-пути и пути, в которых фигурируют сопоставленные сетевых
диски, принимаются функцией fopen_s , если система, которая выполняет код,
имеет доступ к общему или сетевому диску в момент выполнения. При построении
путей для fopen_s убедитесь, что драйверы, пути или сетевые общие папки будут
доступны в среде выполнения. В пути в качестве разделителей каталогов можно
использовать прямую (/) или обратную (\) косую черту.

Эти функции проверяют свои параметры. Если pFile , filename или mode является
пустым указателем, эти функции создают исключение недопустимого параметра,
как описано в разделе Проверка параметров.

Всегда проверка возвращаемое значение, чтобы узнать, успешно ли выполнена


функция, прежде чем выполнять дополнительные операции с файлом. При
возникновении ошибки возвращается код ошибки и задается глобальная
переменная errno . Дополнительные сведения см. в разделах errno, _doserrno,
_sys_errlistи _sys_nerr.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, см. статью Глобальное состояние в CRT.
Поддержка Юникода
fopen_s поддерживает файловые потоки Юникода. Чтобы открыть новый или

существующий ccs файл Юникода, передайте флаг, указывающий нужную


кодировку fopen_s , в , например:

fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");

Допустимые значения флага ccs : UNICODE , UTF-8 и UTF-16LE . Если значение не


указано для ccs , fopen_s использует кодировку ANSI.

Если файл уже существует и открыт для чтения или добавления, кодировку
определяет метка порядка байтов (BOM), если она присутствует в файле.
Кодировка, заданная меткой BOM, имеет приоритет над кодировкой, заданной
флагом ccs . Заданная флагом ccs кодировка используется, только если метка BOM
отсутствует или речь идет о новом файле.

7 Примечание

Обнаружение метки BOM применяется только к файлам, которые будут


открываться в режиме Юникода (т. е. путем передачи флага ccs ).

В следующей таблице перечислены режимы для различных ccs значений флагов,


которые присваиваются fopen_s и для BOM в файле .

Кодировки, используемые на ccs основе флага и


спецификации

Флаг ccs Нет метки BOM (или новый файл) BOM: UTF-8 BOM: UTF-16

UNICODE UTF-8 UTF-8 UTF-16LE

UTF-8 UTF-8 UTF-8 UTF-16LE

UTF-16LE UTF-16LE UTF-8 UTF-16LE

В файлы, открываемые для записи в режиме Юникода, метка BOM записывается


автоматически.

Если mode имеет значение "a, ccs=UNICODE" , "a, ccs=UTF-8" или "a, ccs=UTF-16LE" ,
fopen_s сначала пытается открыть файл с доступом на чтение и запись. Если эта
операция завершается успешно, функция считывает метку BOM, чтобы определить
кодировку для файла; если операция завершается сбоем, функция использует для
файла кодировку по умолчанию. В любом случае fopen_s повторно открывает
файл с доступом только для записи. (Это поведение относится только к режиму a ,
а не a+ к .)

Символьная строка mode указывает тип доступа, который запрошен для файла,
следующим образом.

mode Access

"r" Открывает для чтения. Если файл не существует или его не удается найти, вызов
завершается ошибкой fopen_s .

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление) без удаления маркера в конце
файла (EOF) перед записью новых данных в файл. Создает файл, если он не
существует.

"r+" Открывает для чтения и записи. Файл должен существовать.

"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое
удаляется.

"a+" Открывается для чтения и добавления. Операция добавления включает удаления


маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается
после завершения записи. Создает файл, если он не существует.

Если файл открывается с использованием типа доступа "a" или "a+" , все операции
записи выполняются в конце файла. Указатель на файл можно изменить с
помощью fseek или rewind, но он всегда перемещается обратно в конец файла
перед выполнением любой операции записи, чтобы существующие данные не
могли быть перезаписаны.

Режим "a" не удаляет маркер EOF перед добавлением в файл. После добавления
команда MS-DOS TYPE отображает только данные до исходного маркера EOF, но
не все данные, добавленные в файл. Перед добавлением в файл режим "a+"
удаляет маркер конца файла. После добавления команда MS-DOS TYPE отображает
все данные в файле . Режим "a+" необходим для добавления в файл потока,
который завершается маркером CTRL +Z EOF.

"r+" Если указан тип доступа , "w+" или "a+" , разрешено чтение и запись. (Файл

открыт для обновления.) Однако при переключении с чтения на запись операция


ввода должна наткнуться на маркер EOF. Если маркер EOF отсутствует, необходимо
использовать промежуточный вызов функции позиционирования файлов. Функции
позиционирования в файле — это fsetpos , fseek и rewind. При переходе от записи
к чтению необходимо воспользоваться промежуточным вызовом либо функции
fflush , либо функции позиционирования в файле.

Начиная с C11, можно добавить "x" "w" в или "w+" , чтобы вызвать сбой функции,
если файл существует, вместо его перезаписи.

В дополнение к предыдущим значениям в можно включить mode следующие


символы, чтобы указать режим преобразования для символов новой строки:

mode Режим перевода


Модификатор

t Откройте файл в текстовом (переведенном) режиме. Сочетания перевода


обратной строки каретки (CR-LF) преобразуются в однострочные каналы
(LF) на входе, а символы LF преобразуются в сочетания CR-LF на выходе.
Ctrl+Z интерпретируется как символ конца файла при входе.

b Открытие в двоичном (непереложенном) режиме; Переводы, включающие


символы возврата каретки и перевода строки, подавляются.

В текстовом (переведенном) режиме CTRL +Z интерпретируется как символ конца


файла при входе. Для файлов, открытых для чтения и записи с помощью "a+" ,
fopen_s проверяет наличие CTRL +Z в конце файла и удаляет его, если это

возможно. Он удаляется, так как использование fseek и ftell для перемещения в


файле, который заканчивается CTRL +на Z, может привести fseek к неправильному
поведению в конце файла.

Кроме того, в текстовом режиме сочетания возврата каретки и перевода строки


(CRLF) преобразуются в символы однострочного канала (LF) на входе, а символы LF
преобразуются в сочетания CRLF на выходных данных. Если функция ввода-вывода
потока Юникода работает в текстовом режиме (по умолчанию) исходный или
конечный поток рассматривается как последовательность многобайтовых
символов. Потоковые входные функции Юникода преобразуют многобайтовые
символы в расширенные (как при вызове mbtowc функции). По той же причине
выходные функции потока Юникода преобразуют расширенные символы в
многобайтовые (как если бы для этого вызывалась функция wctomb ).

Если t или b не задано в mode , режим преобразования по умолчанию


определяется глобальной переменной _fmode. Если символ t или b указан как
префикс аргумента, функция завершается с ошибкой и возвращает NULL .
Дополнительные сведения об использовании текстового и двоичного режимов в
Юникоде и многобайтовом потоковом вводе-выводе см. в разделе Текстовый и
двоичный режимы ввода-вывода файлов и потокового ввода-вывода Юникода в
текстовом и двоичном режимах.

mode Поведение
Модификатор

c Включите флажок фиксации для связанного объекта filename , чтобы


содержимое файлового буфера записывалось непосредственно на диск
при вызове fflush или _flushall .

n Сбросьте флаг фиксации для связанного filename объекта на "нет


фиксации". Этот флаг используется по умолчанию. Он также
переопределяет глобальный флаг фиксации, если вы связываете
программу с COMMODE.OBJ . Глобальный флаг фиксации по умолчанию —
"без фиксации", если вы явным образом не связываете программу с
COMMODE.OBJ (см. раздел Параметры связи).

N Указывает, что файл не наследуется дочерними процессами.

S Указывает, что кэширование оптимизировано для последовательного


доступа с диска, но не ограничивается им.

R Указывает, что кэширование оптимизировано для случайного доступа с


диска, но не ограничивается им.

T Указывает файл, который не записывается на диск, если для этого не


требуется нехватка памяти.

D Указывает временный файл, который удаляется при закрытии последнего


указателя на него.

ccs=UNICODE Указывает ЮНИКОД в качестве кодировки кодировки, используемой для


этого файла. Не указывайте никакое значение, если требуется
использовать кодировку ANSI.

ccs=UTF-8 Указывает UTF-8 в качестве кодировки кодировки, используемой для этого


файла. Не указывайте никакое значение, если требуется использовать
кодировку ANSI.

ccs=UTF-16LE Указывает UTF-16LE в качестве кодировки, используемой для этого файла.


Не указывайте никакое значение, если требуется использовать кодировку
ANSI.

Допустимые символы для строки, используемой mode в fopen_s , и _fdopen


соответствуют oflag аргументам, используемым в _open и _sopen, как показано
ниже.
Символы в строке mode Эквивалентное значение oflag для _open / _sopen

a _O_WRONLY | _O_APPEND (обычно _O_WRONLY | _O_CREAT | _O_APPEND )

a+ _O_RDWR | _O_APPEND (обычно _O_RDWR | _O_APPEND | _O_CREAT )

R _O_RDONLY

r+ _O_RDWR

w _O_WRONLY (обычно _O_WRONLY | _O_CREAT | _O_TRUNC )

w+ _O_RDWR (обычно ** _O_RDWR | _O_CREAT | _O_TRUNC )

b _O_BINARY

t _O_TEXT (переведено)

c Нет

n Нет

D _O_TEMPORARY

R _O_RANDOM

S _O_SEQUENTIAL

T _O_SHORTLIVED

ccs=UNICODE _O_WTEXT

ccs=UTF-8 _O_UTF8

ccs=UTF-16LE _O_UTF16

Параметры c , n , R , S , t , T и D mode являются расширениями Майкрософт для


fopen_s и _wfopen_s и не должны использоваться, если требуется переносимость
ANSI.

Если вы используете rb режим, сопоставленные с памятью файлы Win32 также


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

Относительно T и D :

T позволяет избежать записи файла на диск, если он не требует нехватки

памяти. Дополнительные сведения см. в разделе


FILE_ATTRIBUTE_TEMPORARY Файловые константы атрибутов, а также в этой

записи блога Это временное значение.


D указывает обычный файл, который записывается на диск. Разница

заключается в том, что он автоматически удаляется при закрытии.


Вы можете
объединить TD , чтобы получить обе семантики.

Требования
Компонент Обязательный заголовок Заголовок C++

fopen_s <stdio.h> <cstdio>

_wfopen_s <stdio.h> или <wchar.h> <cstdio>

Дополнительные сведения о соответствии стандартам и соглашениях об


именовании в библиотеке среды выполнения C см. в разделе Совместимость.

Сопоставления подпрограмм с универсальным


текстом

<tchar.h> _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfopen_s fopen_s fopen_s _wfopen_s

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_fopen_s.c

// This program opens two files. It uses

// fclose to close the first file and

// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )

errno_t err;

// Open for read (will fail if file "crt_fopen_s.c" doesn't exist)

err = fopen_s( &stream, "crt_fopen_s.c", "r" );

if( err == 0 )

printf( "The file 'crt_fopen_s.c' was opened\n" );


}

else

printf( "The file 'crt_fopen_s.c' was not opened\n" );

// Open for write

err = fopen_s( &stream2, "data2", "w+, ccs=UTF-8" );

if( err == 0 )

printf( "The file 'data2' was opened\n" );

else

printf( "The file 'data2' was not opened\n" );

// Close stream if it isn't NULL

if( stream )

err = fclose( stream );

if ( err == 0 )

printf( "The file 'crt_fopen_s.c' was closed\n" );

else

printf( "The file 'crt_fopen_s.c' was not closed\n" );

// All other files are closed:

int numclosed = _fcloseall( );

printf( "Number of files closed by _fcloseall: %u\n", numclosed );

Output

The file 'crt_fopen_s.c' was opened

The file 'data2' was opened

Number of files closed by _fcloseall: 1

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode
_fpclass , _fpclassf
Статья • 03.04.2023

Возвращает значение, указывающее классификацию числа с плавающей запятой


для аргумента.

Синтаксис
C

int _fpclass(

double x

);

int _fpclassf(

float x

); /* x64 only */

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
Функции _fpclass и _fpclassf возвращают целое значение, указывающее
классификацию числа с плавающей запятой для аргумента x . Классификация
может иметь одно из следующих значений, определенных в <float.h> .

Значение Описание

_FPCLASS_SNAN Сигнальное значение NaN

_FPCLASS_QNAN Несигнальное значение NaN

_FPCLASS_NINF Отрицательная бесконечность ( -INF )

_FPCLASS_NN Отрицательное ненулевое нормализованное значение

_FPCLASS_ND Отрицательное денормализованное значение

_FPCLASS_NZ Отрицательный ноль (-0)


Значение Описание

_FPCLASS_PZ Положительный 0 (+ 0)

_FPCLASS_PD Положительное денормализованное значение

_FPCLASS_PN Положительное ненулевое нормализованное значение

_FPCLASS_PINF Положительная бесконечность ( +INF )

Комментарии
_fpclassf Эти _fpclass функции зависят от корпорации Майкрософт. Они похожи

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


_fpclassf доступна только в случае компиляции для платформы x64.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

_fpclass , _fpclassf <float.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
isnan, _isnan, _isnanf

fpclassify
fpclassify
Статья • 03.04.2023

Возвращает значение, указывающее классификацию числа с плавающей запятой


для аргумента.

Синтаксис
C

int fpclassify(

/* floating-point */ x

);

int fpclassify(

float x

); // C++ only

int fpclassify(

double x

); // C++ only

int fpclassify(

long double x

); // C++ only

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
Функция fpclassify возвращает целое значение, указывающее классификацию
числа с плавающей запятой для аргумента x . В этой таблице показаны возможные
значения, возвращаемые параметром fpclassify <math.h>.

Значение Описание

FP_NAN Сигнальное, несигнальное или неопределенное значение NaN

FP_INFINITE Положительная или отрицательная бесконечность


Значение Описание

FP_NORMAL Положительное или отрицательное нормализованное ненулевое значение

FP_SUBNORMAL Положительное или отрицательное денормализованное значение

FP_ZERO Положительное или отрицательное нулевое значение

Комментарии
В языке C функция fpclassify реализована как макрос, а в C++ fpclassify  — это
функция, перегружаемая с использованием аргументов типа float , double или
long double . В обоих случаях возвращаемое значение зависит от действительного
типа выражения аргумента, а не от промежуточного представления. Например,
обычное значение double или long double при преобразовании в значение float
может становиться бесконечным, денормализованным или нулевым значением.

Требования
Функция или макрос Обязательный заголовок (C) Обязательный заголовок (C++)

fpclassify <math.h> <math.h> или <cmath>

Макрос fpclassify и fpclassify функции соответствуют спецификациям ISO C99 и


C++11. Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
isnan, _isnan, _isnanf
_fpieee_flt
Статья • 03.04.2023

Вызывает определяемый пользователем обработчик исключений и прерываний


для исключений IEEE с плавающей запятой.

Синтаксис
C

int _fpieee_flt(

unsigned long excCode,

struct _EXCEPTION_POINTERS *excInfo,

int handler(_FPIEEE_RECORD *)

);

Параметры
excCode

Код исключения.

excInfo

Указатель на структуру сведений об исключении Windows NT.

handler

Указатель на пользовательскую подпрограмму обработчика исключений и


прерываний IEEE.

Возвращаемое значение
Возвращаемое значение _fpieee_flt представляет собой значение, возвращенное
handler . Как таковая, подпрограмма фильтра IEEE может быть использована в
выражении except механизма структурной обработки исключений (SEH).

Комментарии
Функция _fpieee_flt вызывает определяемый пользователем обработчик
исключений и прерываний для исключений IEEE с плавающей запятой и
предоставляет ему всю требуемую информацию. Эта подпрограмма выполняет
роль фильтра исключений в механизме SEH, который вызывает ваш собственные
обработчик исключений IEEE в случае необходимости.

Структура _FPIEEE_RECORD , определенная в Fpieee.h, содержит сведения,


относящиеся к исключениям IEEE с плавающей запятой. Эта структура передается
функцией _fpieee_flt обработчику исключений и прерываний, определяемому
пользователем.

Поле Описание
_FPIEEE_RECORD

RoundingMode
Эти unsigned int поля содержат сведения о среде с плавающей запятой
Precision во время возникновения исключения.

Operation Это unsigned int поле указывает тип операции, вызвавшей ловушку. Если
тип является сравнением ( _FpCodeCompare ), можно указать одно из
специальных _FPIEEE_COMPARE_RESULT значений (как определено в
Fpieee.h) в поле Result.Value . Тип преобразования ( _FpCodeConvert )
указывает на то, что захват произошел во время операции
преобразования числа с плавающей запятой. Типы Operand1 и Result
позволяют определить тип этого преобразования.

Operand1
Эти _FPIEEE_VALUE структуры указывают типы и значения предлагаемых
Operand2
результатов и операндов. Каждая структура содержит следующие поля:
Result
OperandValid — Флаг, указывающий, является ли значение ответа
допустимым.

Format — тип данных соответствующего значения. Тип формата может


быть возвращен, даже если соответствующее значение недопустимо.

Value — значение данных результата или операнда.

Cause
_FPIEEE_EXCEPTION_FLAGS содержит битовое поле для каждого типа
Enable
исключения с плавающей запятой. Между этими полями и аргументами,
Status используемыми для маскирования предоставленных
_controlfpисключений, существует корреспонденция. Точное смысловое
значение каждого бита зависит от контекста:

Cause — Каждый бит набора указывает конкретное исключение, которое


было создано.

Enable — Каждый бит набора указывает на то, что конкретное


исключение в настоящее время не маскируется.

Status — Каждый бит набора указывает, что конкретное исключение в


настоящее время ожидается, в том числе исключения, которые не были
созданы, так как они были маскированы _controlfp .

Отключенные ожидающие исключения вызываются при их включении. Эти


исключения могут привести к неопределенному поведению при использовании
_fpieee_flt в качестве фильтра исключений. Всегда вызывайте _clearfp перед

включением исключений с плавающей запятой.

Требования
Компонент Обязательный заголовок

_fpieee_flt <fpieee.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fpieee.c

// This program demonstrates the implementation of

// a user-defined floating-point exception handler using the

// _fpieee_flt function.

#include <fpieee.h>

#include <excpt.h>

#include <float.h>

#include <stddef.h>

int fpieee_handler( _FPIEEE_RECORD * );

int fpieee_handler( _FPIEEE_RECORD *pieee )

// user-defined ieee trap handler routine:

// there is one handler for all

// IEEE exceptions

// Assume the user wants all invalid

// operations to return 0.

if ((pieee->Cause.InvalidOperation) &&

(pieee->Result.Format == _FpFormatFp32))

pieee->Result.Value.Fp32Value = 0.0F;

return EXCEPTION_CONTINUE_EXECUTION;

else

return EXCEPTION_EXECUTE_HANDLER;

#define _EXC_MASK \

_EM_UNDERFLOW + \

_EM_OVERFLOW + \

_EM_ZERODIVIDE + \

_EM_INEXACT

int main( void )

// ...

__try {

// unmask invalid operation exception

_controlfp_s(NULL, _EXC_MASK, _MCW_EM);

// code that may generate

// fp exceptions goes here

__except ( _fpieee_flt( GetExceptionCode(),

GetExceptionInformation(),

fpieee_handler ) ){

// code that gets control

// if fpieee_handler returns

// EXCEPTION_EXECUTE_HANDLER goes here

// ...

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_control87, _controlfp, __control87_2

_controlfp_s
_fpreset
Статья • 03.04.2023

Сбрасывает пакет вычислений с плавающей запятой.

Синтаксис
C

void _fpreset( void );

Remarks
Функция _fpreset повторно инициализирует пакет вычислений с плавающей
запятой. _fpreset часто используется с signal , system или с функциями _exec . _spawn
Если программа перехватывает сигналы ошибок в вычислениях с плавающей
запятой ( SIGFPE ) с аргументом signal , для безопасного восстановления после таких
ошибок необходимо вызвать функцию _fpreset с использованием longjmp .

Эта функция не рекомендуется использовать при компиляции с параметром /clr


(компиляция clr), так как среда CLR поддерживает только точность с плавающей
запятой по умолчанию.

Требования
Компонент Обязательный заголовок

_fpreset <float.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fpreset.c

// This program uses signal to set up a

// routine for handling floating-point errors.

#include <stdio.h>

#include <signal.h>

#include <setjmp.h>

#include <stdlib.h>

#include <float.h>

#include <math.h>

#include <string.h>

jmp_buf mark; // Address for long jump to jump to

int fperr; // Global error number

void __cdecl fphandler( int sig, int num ); // Prototypes

void fpcheck( void );

int main( void )

double n1 = 5.0;

double n2 = 0.0;

double r;

int jmpret;

// Unmask all floating-point exceptions.

_control87( 0, _MCW_EM );

// Set up floating-point error handler. The compiler

// will generate a warning because it expects

// signal-handling functions to take only one argument.

if( signal( SIGFPE, (void (__cdecl *)(int)) fphandler ) == SIG_ERR )

fprintf( stderr, "Couldn't set SIGFPE\n" );

abort();

// Save stack environment for return in case of error. First

// time through, jmpret is 0, so true conditional is executed.

// If an error occurs, jmpret will be set to -1 and false

// conditional will be executed.

jmpret = setjmp( mark );

if( jmpret == 0 )

printf( "Dividing %4.3g by %4.3g...\n", n1, n2 );

r = n1 / n2;

// This won't be reached if error occurs.

printf( "\n\n%4.3g / %4.3g = %4.3g\n", n1, n2, r );

r = n1 * n2;

// This won't be reached if error occurs.

printf( "\n\n%4.3g * %4.3g = %4.3g\n", n1, n2, r );

else

fpcheck();

// fphandler handles SIGFPE (floating-point error) interrupt. Note

// that this prototype accepts two arguments and that the

// prototype for signal in the run-time library expects a signal

// handler to have only one argument.

//

// The second argument in this signal handler allows processing of

// _FPE_INVALID, _FPE_OVERFLOW, _FPE_UNDERFLOW, and

// _FPE_ZERODIVIDE, all of which are Microsoft-specific symbols

// that augment the information provided by SIGFPE. The compiler

// will generate a warning, which is harmless and expected.

void fphandler( int sig, int num )

// Set global for outside check since we don't want

// to do I/O in the handler.

fperr = num;

// Initialize floating-point package. */

_fpreset();

// Restore calling environment and jump back to setjmp. Return

// -1 so that setjmp will return false for conditional test.

longjmp( mark, -1 );

void fpcheck( void )

char fpstr[30];

switch( fperr )

case _FPE_INVALID:

strcpy_s( fpstr, sizeof(fpstr), "Invalid number" );

break;

case _FPE_OVERFLOW:

strcpy_s( fpstr, sizeof(fpstr), "Overflow" );

break;

case _FPE_UNDERFLOW:

strcpy_s( fpstr, sizeof(fpstr), "Underflow" );

break;

case _FPE_ZERODIVIDE:

strcpy_s( fpstr, sizeof(fpstr), "Divide by zero" );

break;

default:

strcpy_s( fpstr, sizeof(fpstr), "Other floating point error" );

break;

printf( "Error %d: %s\n", fperr, fpstr );

Output

Dividing 5 by 0...

Error 131: Divide by zero

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_exec, _wexec функции

signal

_spawn, _wspawn функции

system, _wsystem
fprintf , _fprintf_l , fwprintf ,
_fwprintf_l
Статья • 03.04.2023

Печатает форматированные данные в поток. Доступны более безопасные версии


этих функций; См. разделfprintf_s , _fprintf_s_l, fwprintf_s, . _fwprintf_s_l

Синтаксис
C

int fprintf(

FILE *stream,

const char *format [,

argument ]...

);

int _fprintf_l(

FILE *stream,

const char *format,

_locale_t locale [,

argument ]...

);

int fwprintf(

FILE *stream,

const wchar_t *format [,

argument ]...

);

int _fwprintf_l(

FILE *stream,

const wchar_t *format,

_locale_t locale [,

argument ]...

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.

argument

Необязательные аргументы.
locale

Используемый языковой стандарт.

Возвращаемое значение
fprintf возвращает число записанных байтов. fwprintf возвращает число
записанных расширенных символов. В случае ошибки вывода каждая из этих
функций возвращает отрицательное значение. Если stream или format имеет
значение NULL , эти функции вызывают обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если продолжение выполнения
разрешено, функции возвращают значение -1 и задают для errno значение EINVAL .
Строка форматирования не проверяется на допустимость символов
форматирования, как при использовании fprintf_s или fwprintf_s .

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Функция fprintf форматирует и выводит набор символов и значений в выходной
поток stream . Каждый argument функции (при наличии) преобразуется и выводится
согласно соответствующей спецификации формата в format . format Для
fprintf аргумент имеет тот же синтаксис, что и в printf .

fwprintf  — версия функции fprintf для расширенных символов; в функции

fwprintf параметр format  — это строка расширенных символов. Эти функции

ведут себя одинаково, если поток открыт в режиме ANSI. Функция fprintf на
данный момент не поддерживает вывод данных в поток в кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_ftprintf fprintf fprintf fwprintf

_ftprintf_l _fprintf_l _fprintf_l _fwprintf_l

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования.

Требования
Компонент Обязательный заголовок

fprintf , _fprintf_l <stdio.h>

fwprintf , _fwprintf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fprintf.c

/* This program uses fprintf to format various

* data and print it to the file named FPRINTF.OUT. It

* then displays FPRINTF.OUT on the screen using the system

* function to invoke the operating-system TYPE command.

*/

#include <stdio.h>

#include <process.h>

FILE *stream;

int main( void )

int i = 10;

double fp = 1.5;

char s[] = "this is a string";

char c = '\n';

fopen_s( &stream, "fprintf.out", "w" );

fprintf( stream, "%s%c", s, c );

fprintf( stream, "%d\n", i );

fprintf( stream, "%f\n", fp );

fclose( stream );

system( "type fprintf.out" );

Output

this is a string

10

1.500000

См. также раздел


Потоковый ввод-вывод

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fscanf, _fscanf_l, fwscanf, _fwscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, _swprintf_l

Синтаксис спецификации формата: printf и wprintf функции


_fprintf_p , _fprintf_p_l , _fwprintf_p ,
_fwprintf_p_l
Статья • 03.04.2023

Выводит форматированные данные в поток.

Синтаксис
C

int _fprintf_p(

FILE *stream,

const char *format [,

argument ]...

);

int _fprintf_p_l(

FILE *stream,

const char *format,

_locale_t locale [,

argument ]...

);

int _fwprintf_p(

FILE *stream,

const wchar_t *format [,

argument ]...

);

int _fwprintf_p_l(

FILE *stream,

const wchar_t *format,

_locale_t locale [,

argument ]...

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.

argument

Необязательные аргументы.
locale

Используемый языковой стандарт.

Возвращаемое значение
Функции _fprintf_p и _fwprintf_p возвращают число выведенных символов или
отрицательное значение в случае ошибки.

Комментарии
Функция _fprintf_p форматирует и выводит набор символов и значений в
выходной поток stream . Каждый argument функции (при наличии) преобразуется и
выводится согласно соответствующей спецификации формата в format . Для
_fprintf_p аргумента format используется тот же синтаксис, что и в _printf_p . Эти

функции поддерживают позиционные параметры, это означает, что можно


изменить порядок параметров, используемых в строке формата. Дополнительные
сведения см. в разделе Позиционные параметры printf_p.

_fwprintf_p  — версия функции _fprintf_p для расширенных символов; в функции


_fwprintf_p параметр format  — это строка расширенных символов. Эти функции

ведут себя одинаково, если поток открыт в режиме ANSI. Функция _fprintf_p на
данный момент не поддерживает вывод данных в поток в кодировке Юникод.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5

округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно


представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Как и небезопасные версии (см fprintf. , _fprintf_l, fwprintf), _fwprintf_lэти функции


проверяют свои параметры и вызывают обработчик недопустимых параметров,
как описано в проверке параметров, если или является пустым указателем или есть
какие-либо stream format неизвестные или неправильно сформированные
описатели форматирования. Если продолжение выполнения разрешено, функции
возвращают значение -1 и задают для errno значение EINVAL .

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_ftprintf_p _fprintf_p _fprintf_p _fwprintf_p

_ftprintf_p_l _fprintf_p_l _fprintf_p_l _fwprintf_p_l

Дополнительные сведения см. в описании синтаксиса спецификации формата.

Требования
Компонент Обязательный заголовок

_fprintf_p , _fprintf_p_l <stdio.h>

_fwprintf_p , _fwprintf_p_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fprintf_p.c

// This program uses _fprintf_p to format various

// data and print it to the file named FPRINTF_P.OUT. It

// then displays FPRINTF_P.OUT on the screen using the system

// function to invoke the operating-system TYPE command.

//

#include <stdio.h>

#include <process.h>

int main( void )

FILE *stream = NULL;

int i = 10;

double fp = 1.5;

char s[] = "this is a string";

char c = '\n';

// Open the file

if ( fopen_s( &stream, "fprintf_p.out", "w" ) == 0)

// Format and print data

_fprintf_p( stream, "%2$s%1$c", c, s );

_fprintf_p( stream, "%d\n", i );

_fprintf_p( stream, "%f\n", fp );

// Close the file

fclose( stream );

// Verify our data

system( "type fprintf_p.out" );

Output

this is a string

10

1.500000

См. также раздел


Потоковый ввод-вывод

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fscanf, _fscanf_l, fwscanf, _fwscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

printf_p позиционные параметры

_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l

_cprintf_s, _cprintf_s_l, _cwprintf_s, _cwprintf_s_l

printf_p позиционные параметры

fscanf_s, _fscanf_s_l, fwscanf_s, _fwscanf_s_l


fprintf_s , _fprintf_s_l , fwprintf_s ,
_fwprintf_s_l
Статья • 03.04.2023

Печатает форматированные данные в поток. Эти функции являются версиями ,


_fprintf_lfwprintf_fwprintf_lс улучшениями безопасности, как описано в
функцияхfprintfбезопасности в CRT.

Синтаксис
C

int fprintf_s(

FILE *stream,

const char *format [,

argument_list ]

);

int _fprintf_s_l(

FILE *stream,

const char *format,

_locale_t locale [,

argument_list ]

);

int fwprintf_s(

FILE *stream,

const wchar_t *format [,

argument_list ]

);

int _fwprintf_s_l(

FILE *stream,

const wchar_t *format,

_locale_t locale [,

argument_list ]

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.


argument_list

Необязательные аргументы для строки формата.

locale

Используемый языковой стандарт.

Возвращаемое значение
fprintf_s возвращает число записанных байтов. fwprintf_s возвращает число
записанных расширенных символов. В случае ошибки вывода каждая из этих
функций возвращает отрицательное значение.

Комментарии
Функция fprintf_s форматирует и выводит набор символов и значений в
выходной поток stream . Каждый аргумент в argument_list (при наличии)
преобразуется и выводится в соответствии с соответствующей спецификацией
формата в format . Аргумент format использует синтаксис спецификации формата
для printf и wprintf функций.

fwprintf_s  — версия функции fprintf_s для расширенных символов; в функции

fwprintf_s параметр format  — это строка расширенных символов. Эти функции


ведут себя одинаково, если поток открыт в режиме ANSI. Функция fprintf_s на
данный момент не поддерживает вывод данных в поток в кодировке Юникод.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5
округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно
представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Как и небезопасные версии (см fprintf. , _fprintf_l, fwprintf), _fwprintf_lэти функции


проверяют свои параметры и вызывают обработчик недопустимых параметров,
как описано в проверке параметров, если или stream format является NULL
указателем. Также проверяется сама строка формата. При наличии любых
неизвестных или неправильно сформированных описателей форматирования эти
функции создают исключение недопустимого параметра. Во всех случаях, если
выполнение может быть продолжено, функции возвращают –1 и устанавливают
параметр errno в значение EINVAL . Дополнительные сведения о кодах возврата см.
в разделе errno, _doserrnoи _sys_nerr_sys_errlist.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_ftprintf_s fprintf_s fprintf_s fwprintf_s

_ftprintf_s_l _fprintf_s_l _fprintf_s_l _fwprintf_s_l

Дополнительные сведения см. в описании синтаксиса спецификации формата.

Требования
Компонент Обязательный заголовок

fprintf_s , _fprintf_s_l <stdio.h>

fwprintf_s , _fwprintf_s_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_fprintf_s.c

// This program uses fprintf_s to format various

// data and print it to the file named FPRINTF_S.OUT. It

// then displays FPRINTF_S.OUT on the screen using the system

// function to invoke the operating-system TYPE command.

#include <stdio.h>

#include <process.h>

FILE *stream;

int main( void )

int i = 10;

double fp = 1.5;

char s[] = "this is a string";

char c = '\n';

fopen_s( &stream, "fprintf_s.out", "w" );

fprintf_s( stream, "%s%c", s, c );

fprintf_s( stream, "%d\n", i );

fprintf_s( stream, "%f\n", fp );

fclose( stream );

system( "type fprintf_s.out" );

Output

this is a string

10

1.500000

См. также раздел


Потоковый ввод-вывод

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fscanf, _fscanf_l, fwscanf, _fwscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l


fputc , fputwc
Статья • 03.04.2023

Записывает символ в поток.

Синтаксис
C

int fputc(

int c,

FILE *stream

);

wint_t fputwc(

wchar_t c,

FILE *stream

);

Параметры
c

Символ, который требуется записать.

stream

Указатель на структуру FILE .

Возвращаемое значение
Каждая из этих функций возвращает записанный символ. Для fputc возвращаемое
значение EOF указывает на ошибку. Для fputwc возвращаемое значение WEOF
указывает на ошибку. Если stream это NULL так, эти функции вызывают обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, они возвращают EOF и устанавливают для
errno значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrnoи


_sys_nerr_sys_errlist.

Комментарии
Каждая из этих функций записывает один символ c в файл в позиции, указанной
соответствующим индикатором положения файла, если он определен. Функции
перемещают индикатор соответствующим образом. В fputc и fputwc , файл связан
с stream . Если файл не поддерживает запросы на размещение или был открыт в
режиме добавления, символ добавляется в конец потока.

Эти две функции ведут себя одинаково, если поток открыт в режиме ANSI. Функция
fputc на данный момент не поддерживает вывод данных в поток в кодировке
Юникод.

Версии с суффиксом _nolock идентичны, за исключением того, что они не


защищены от вмешательства другими потоками. Дополнительные сведения см. в
разделе_fputc_nolock_fputwc_nolock .

Ниже приводятся примечания для конкретных подпрограмм.

Подпрограмма Комментарии

fputc Эквивалент putc , однако реализуется только как функция, а не как


функция и макрос.

fputwc Версия fputc для расширенных символов. c Записывается в виде


многобайтового символа или широкого символа при stream открытии в
текстовом режиме или двоичном режиме соответственно.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_fputtc fputc fputc fputwc

Требования
Компонент Обязательный заголовок

fputc <stdio.h>

fputwc <stdio.h> или <wchar.h>


Консоль не поддерживается в приложениях универсальная платформа Windows
(UWP). Стандартные дескрипторы потоков, связанные с консолью stdin , stdout и
stderr должны быть перенаправлены, прежде чем функции времени выполнения C

могут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_fputc.c

// This program uses fputc

// to send a character array to stdout.

#include <stdio.h>

int main( void )

char strptr1[] = "This is a test of fputc!!\n";

char *p;

// Print line to stream using fputc.

p = strptr1;

while( (*p != '\0') && fputc( *(p++), stdout ) != EOF ) ;

Output

This is a test of fputc!!

См. также раздел


Потоковый ввод-вывод

fgetc, fgetwc

putc, putwc
_fputc_nolock , _fputwc_nolock
Статья • 03.04.2023

Записывает символ в поток без блокировки потока.

Синтаксис
C

int _fputc_nolock(

int c,

FILE *stream

);

wint_t _fputwc_nolock(

wchar_t c,

FILE *stream

);

Параметры
c

Символ, который требуется записать.

stream

Указатель на структуру FILE .

Возвращаемое значение
Каждая из этих функций возвращает записанный символ. Сведения об ошибке см. в
разделеfputc . fputwc

Комментарии
_fputc_nolock и _fputwc_nolock идентичны fputc fputwc и соответственно, за

исключением того, что они не защищены от помех другими потоками. Они могут
быть быстрее, так как они не влечет за собой затраты на блокировку других
потоков. Используйте эти функции только в потокобезопасных контекстах,
например в однопоточных приложениях или если вызываемая область уже
обрабатывает изоляцию потоков.
Эти две функции ведут себя одинаково, если поток открыт в режиме ANSI. Функция
_fputc_nolock на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_fputtc_nolock _fputc_nolock _fputc_nolock _fputwc_nolock

Требования
Компонент Обязательный заголовок

_fputc_nolock <stdio.h>

_fputwc_nolock <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потоков, связанные с консолью stdin , stdout и
stderr должны быть перенаправлены, прежде чем функции времени выполнения C
могут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_fputc_nolock.c

// This program uses _fputc_nolock

// to send a character array to stdout.

#include <stdio.h>

int main( void )

char strptr1[] = "This is a test of _fputc_nolock!!\n";

char *p;

// Print line to stream using fputc.

p = strptr1;

while( (*p != '\0') && _fputc_nolock( *(p++), stdout ) != EOF ) ;

Output

This is a test of _fputc_nolock!!

См. также раздел


Потоковый ввод-вывод

fgetc, fgetwc

putc, putwc
fputchar
Статья • 03.04.2023

Имя fputchar функции, зависят от Майкрософт, является устаревшим псевдонимом


_fputchar для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _fputchar . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_fputchar , _fputwchar
Статья • 03.04.2023

Записывает символ в поток stdout .

Синтаксис
C

int _fputchar(

int c

);

wint_t _fputwchar(

wchar_t c

);

Параметры
c

Символ, который требуется записать.

Возвращаемое значение
Каждая из этих функций возвращает записанный символ. Для _fputchar
возвращаемое значение EOF указывает на ошибку. Для _fputwchar возвращаемое
значение WEOF указывает на ошибку. Если задано значение NULL c, эти функции
создают исключение недопустимого параметра, как описано в разделе "Проверка
параметров". Если выполнение разрешено продолжать, возвращается EOF
( _fputwchar возвращается WEOF ) и задано значение errno EINVAL . _fputchar

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Обе эти функции записывают один символьный аргумент c stdout и перемещают
индикатор соответствующим образом. _fputchar равно fputc( stdout ) . Он также
эквивалентен putchar , но реализуется только как функция, а не как функция и
макрос. В отличие от fputc этих функций, putchar эти функции несовместимы со
стандартом ANSI.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_fputtchar _fputchar _fputchar _fputwchar

Требования
Компонент Обязательный заголовок

_fputchar <stdio.h>

_fputwchar <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью stdin , stdout и
stderr должны быть перенаправлены, прежде чем функции времени выполнения C
смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_fputchar.c

// This program uses _fputchar

// to send a character array to stdout.

#include <stdio.h>

int main( void )

char strptr[] = "This is a test of _fputchar!!\n";

char *p = NULL;

// Print line to stream using _fputchar.

p = strptr;

while( (*p != '\0') && _fputchar( *(p++) ) != EOF )

Output

This is a test of _fputchar!!

См. также раздел


Потоковый ввод-вывод

fgetc, fgetwc

putc, putwc
fputs , fputws
Статья • 03.04.2023

Записывает строку в поток.

Синтаксис
C

int fputs(

const char *str,

FILE *stream

);

int fputws(

const wchar_t *str,

FILE *stream

);

Параметры
str

Выходная строка.

stream

Указатель на структуру FILE .

Возвращаемое значение
При успешном выполнении каждой из этих функций возвращается
неотрицательное значение. В случае ошибки функции fputs и fputws возвращают
EOF . Если str или stream является пустым указателем, эти функции вызывают

обработчик недопустимых параметров, как описано в разделе "Проверка


параметров". Если выполнение разрешено продолжать, эти функции задаются
errno EINVAL и возвращаются EOF .

Дополнительные сведения о кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Каждая из этих функций копирует str в выходной поток stream в текущей
позиции. fputws копирует аргумент str wide-character в stream виде
многобайтовой строки или строки расширенных символов при stream открытии в
текстовом режиме или двоичном режиме соответственно. Ни одна из функций не
копирует завершающий нуль-символ.

Эти две функции ведут себя одинаково, если поток открыт в режиме ANSI. Функция
fputs на данный момент не поддерживает вывод данных в поток в кодировке
Юникод.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, просмотрите глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_fputts fputs fputs fputws

Требования
Компонент Обязательный заголовок

fputs <stdio.h>

fputws <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескриптора потока, связанные с консолью stdin , stdout и
stderr должны быть перенаправлены, прежде чем функции среды выполнения C

смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_fputs.c

// This program uses fputs to write

// a single line to the stdout stream.

#include <stdio.h>

int main( void )

fputs( "Hello world from fputs.\n", stdout );

Output

Hello world from fputs.

См. также раздел


Потоковый ввод-вывод

fgets, fgetws

gets, _getws

puts, _putws
fread
Статья • 03.04.2023

Считывает данные из потока.

Синтаксис
C

size_t fread(

void *buffer,

size_t size,

size_t count,

FILE *stream

);

Параметры
buffer

Место хранения данных.

size

Размер элемента в байтах.

count

Максимальное число читаемых элементов.

stream

Указатель на структуру FILE .

Возвращаемое значение
fread возвращает количество полных элементов, считываемых функцией, которая

может быть меньше, чем count при возникновении ошибки, или если она
встречает конец файла до достижения count . Отличить ошибку чтения от
состояния, связанного с достижением конца файла, можно с помощью функции
feof или ferror . Если size или count равно 0, функция fread возвращает 0, а
содержимое буфера не изменяется. Если stream или buffer является пустым
указателем, fread вызывает обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если продолжение выполнения разрешено, эта
функции задает для errno значение EINVAL и возвращает 0.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrnoи


_sys_nerr_sys_errlist.

Комментарии
Функция fread считывает максимум count элементов размером size байт из
входного потока stream и сохраняет их в buffer . Указатель файла, связанный с
stream (если он существует), расширен по количеству считываемых байтов fread .

Если заданный поток открыт в текстовом режиме, новые строки в стиле Windows
преобразуются в новые строки в стиле Unix. То есть пары возврата каретки (CRLF)
заменяются символами однострочного канала (LF). Замена не влияет на указатель
файла или возвращаемое значение. В случае ошибки позиция указателя файла
будет неопределенной. Невозможно определить значение частично прочитанного
элемента.

При использовании в потоке текстового режима, если запрошенный объем данных


(т size * count . е. ) больше или равен размеру внутреннего FILE * буфера (по
умолчанию размер составляет 4096 байт, настраиваемый с помощью),
setvbufпотоковые данные копируются непосредственно в предоставленный
пользователем буфер, и преобразование новой строки выполняется в этом буфере.
Так как преобразованные данные могут быть короче, чем данные потока,
скопированные в буфер, данные в прошлом buffer [ return_value * size ] (где
return_value является возвращаемым значением fread ) могут содержать

неконвертированные данные из файла. По этой причине рекомендуется завершать


символьные данные со значением NULL по адресу buffer [ return_value * size ],
если цель буфера — выступать в качестве строки в стиле C. Дополнительные fopen
сведения о влиянии текстового режима и двоичного режима.

Эта функция блокирует работу других потоков. Неблокирующая версия функции


называется _fread_nolock .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок
Компонент Обязательный заголовок

fread <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fread.c

// This program opens a file named FREAD.OUT and

// writes 25 characters to the file. It then tries to open

// FREAD.OUT and read in 25 characters. If the attempt succeeds,

// the program displays the number of actual items read.

#include <stdio.h>

int main( void )

FILE *stream;

char list[30];

int i, numread, numwritten;

// Open file in text mode:

if( fopen_s( &stream, "fread.out", "w+t" ) == 0 )

for ( i = 0; i < 25; i++ )

list[i] = (char)('z' - i);

// Write 25 characters to stream

numwritten = fwrite( list, sizeof( char ), 25, stream );

printf( "Wrote %d items\n", numwritten );

fclose( stream );

else

printf( "Problem opening the file\n" );

if( fopen_s( &stream, "fread.out", "r+t" ) == 0 )

// Attempt to read in 25 characters

numread = fread( list, sizeof( char ), 25, stream );

printf( "Number of items read = %d\n", numread );

printf( "Contents of buffer = %.25s\n", list );

fclose( stream );

else

printf( "File could not be opened\n" );

Output

Wrote 25 items

Number of items read = 25

Contents of buffer = zyxwvutsrqponmlkjihgfedcb

См. также раздел


Потоковый ввод-вывод

Файловый ввод-вывод в текстовом и двоичном режиме

fopen

fwrite

_read
fread_s
Статья • 03.04.2023

Считывает данные из потока. Эта версия fread имеет улучшения безопасности, как
описано в функциях безопасности в CRT.

Синтаксис
C

size_t fread_s(

void *buffer,

size_t bufferSize,

size_t elementSize,

size_t count,

FILE *stream

);

Параметры
buffer

Место хранения данных.

bufferSize

Размер буфера назначения в байтах.

elementSize

Размер читаемого элемента в байтах.

count

Максимальное число читаемых элементов.

stream

Указатель на структуру FILE .

Возвращаемое значение
Функция fread_s возвращает число полностью считанных в буфер элементов,
которое может быть меньше count , если произошла ошибка чтения или конец
файла был достигнут до того, как достигнуто значение count . Отличить ошибку от
состояния, связанного с достижением конца файла, можно с помощью функции
feof или ferror . Если size или count равно 0, функция fread_s возвращает 0, а

содержимое буфера не изменяется. Если stream или buffer является пустым


указателем, fread_s вызывает обработчик недопустимых параметров, как описано
в разделе "Проверка параметров". Если продолжение выполнения разрешено, эта
функции задает для errno значение EINVAL и возвращает 0.

Дополнительные сведения о кодах ошибок см. в разделе errno, ,


_doserrno_sys_errlistи _sys_nerr.

Комментарии
Функция fread_s считывает максимум count элементов размером elementSize байт
из входного потока stream и сохраняет их в buffer . Указатель на файл, связанный
stream с (если таковой есть), является расширенным по количеству считываемых
байтов fread_s . Если заданный поток открыт в текстовом режиме, пары веб-
канала возврата каретки заменяются символами однострочного веб-канала.
Замена не влияет на указатель файла или возвращаемое значение. В случае
ошибки позиция указателя файла будет неопределенной. Значение частично
прочитанного элемента не может быть определено.

Эта функция блокирует работу других потоков. Неблокирующая версия функции


называется _fread_nolock .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

fread_s <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_fread_s.c

// Command line: cl /EHsc /nologo /W4 crt_fread_s.c

//

// This program opens a file that's named FREAD.OUT and

// writes characters to the file. It then tries to open

// FREAD.OUT and read in characters by using fread_s. If the attempt


succeeds,

// the program displays the number of actual items read.

#include <stdio.h>

#define BUFFERSIZE 30

#define DATASIZE 22

#define ELEMENTCOUNT 2

#define ELEMENTSIZE (DATASIZE/ELEMENTCOUNT)

#define FILENAME "FREAD.OUT"

int main( void )

FILE *stream;

char list[30];

int i, numread, numwritten;

for ( i = 0; i < DATASIZE; i++ )

list[i] = (char)('z' - i);

list[DATASIZE] = '\0'; // terminal null so we can print it

// Open file in text mode:

if( fopen_s( &stream, FILENAME, "w+t" ) == 0 )

// Write DATASIZE characters to stream

printf( "Contents of buffer before write/read:\n\t%s\n\n", list );

numwritten = fwrite( list, sizeof( char ), DATASIZE, stream );

printf( "Wrote %d items\n\n", numwritten );

fclose( stream );

} else {

printf( "Problem opening the file\n" );

return -1;

if( fopen_s( &stream, FILENAME, "r+t" ) == 0 ) {

// Attempt to read in characters in 2 blocks of 11

numread = fread_s( list, BUFFERSIZE, ELEMENTSIZE, ELEMENTCOUNT, stream


);

printf( "Number of %d-byte elements read = %d\n\n", ELEMENTSIZE,


numread );

printf( "Contents of buffer after write/read:\n\t%s\n", list );

fclose( stream );

} else {

printf( "File could not be opened\n" );

return -1;

Output
Contents of buffer before write/read:

zyxwvutsrqponmlkjihgfe

Wrote 22 items

Number of 11-byte elements read = 2

Contents of buffer after write/read:

zyxwvutsrqponmlkjihgfe

См. также раздел


Потоковый ввод-вывод

fwrite

_read
_fread_nolock
Статья • 03.04.2023

Читает данные из потока, не блокируя другие потоки.

Синтаксис
C

size_t _fread_nolock(

void *buffer,

size_t size,

size_t count,

FILE *stream

);

Параметры
buffer

Место хранения данных.

size

Размер элемента в байтах.

count

Максимальное число читаемых элементов.

stream

Указатель на структуру FILE .

Возвращаемое значение
См. раздел fread.

Комментарии
Эта функция представляет собой неблокирующую версию функции fread . Он
идентичен fread , за исключением того, что он не защищен от вмешательства
другими потоками. Это может быть быстрее, так как это не приводит к
дополнительным издержкам блокировки других потоков. Используйте эту функции
только в потокобезопасных контекстах, например в однопоточных приложениях
или если вызываемая область уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_fread_nolock <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

fwrite

_read
_fread_nolock_s
Статья • 03.04.2023

Читает данные из потока, не блокируя другие потоки. Эта версия fread_nolock


имеет улучшения безопасности, как описано в функциях безопасности в CRT.

Синтаксис
C

size_t _fread_nolock_s(

void *buffer,

size_t bufferSize,

size_t elementSize,

size_t elementCount,
FILE *stream

);

Параметры
buffer

Место хранения данных.

bufferSize

Размер буфера назначения в байтах.

elementSize

Размер читаемого элемента в байтах.

elementCount

Максимальное число читаемых элементов.

stream

Указатель на структуру FILE .

Возвращаемое значение
См. раздел fread_s.

Комментарии
Эта функция представляет собой неблокирующую версию функции fread_s . Он
идентичен fread_s , за исключением того, что он не защищен от вмешательства
другими потоками. Это может быть быстрее, так как это не приводит к
дополнительным издержкам блокировки других потоков. Используйте эту функции
только в потокобезопасных контекстах, например в однопоточных приложениях
или если вызываемая область уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_fread_nolock_s C: <stdio.h>; C++: <cstdio> или <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

fwrite

_read
free
Статья • 03.04.2023

Освобождает блок памяти.

Синтаксис
C

void free(

void *memblock

);

Параметры
memblock

Ранее выделенный блок памяти, который требуется освободить.

Комментарии
Функция free освобождает блок памяти ( memblock ), который был выделен ранее
вызовом функции calloc , malloc или realloc . Число освобожденных байтов
эквивалентно количеству байтов, запрошенных при выделении блока (или
перераспределении для realloc ). Если memblock имеет значение NULL , указатель
игнорируется и free немедленно возвращается. Попытка освободить
недопустимый указатель (указатель на блок памяти, который не был выделен
calloc , malloc или realloc ) может повлиять на последующие запросы на

выделение и вызвать ошибки.

В случае возникновения ошибки при освобождении памяти для errno задаются


сведения о характере сбоя, полученные от операционной системы.
Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

После освобождения блока памяти уменьшает объем свободной памяти в куче,


_heapmin объединяя неиспользуемые области и освобождая их обратно в
операционную систему. Освобожденная память, которая не освобождается в
операционной системе, восстанавливается в свободном пуле и снова становится
доступной для выделения.
Если приложение связано с отладочной версией библиотек времени выполнения
C, free разрешается в _free_dbg. Дополнительные сведения об управлении кучи во
время отладки см. в разделе Отладочная куча CRT.

Функция free помечена как __declspec(noalias) ; это означает, что функция


гарантировано не изменяет глобальные переменные. Для получения
дополнительной информации см. noalias.

Чтобы освободить память, выделенную с _mallocaпомощью , используйте _freea.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Обязательный заголовок

free <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для malloc.

См. также раздел


Выделение памяти

_alloca

calloc

malloc

realloc

_free_dbg

_heapmin

_freea
_free_dbg
Статья • 03.04.2023

Освобождает блок памяти в куче (только в отладочной версии).

Синтаксис
C

void _free_dbg(

void *userData,

int blockType

);

Параметры
userData

Указатель на выделенный блок памяти, который требуется освободить.

blockType

Тип выделенного блока памяти, который требуется освободить: _CLIENT_BLOCK ,


_NORMAL_BLOCK или _IGNORE_BLOCK .

Комментарии
Функция _free_dbg является отладочной версией free функции. Если _DEBUG
параметр не определен, каждый вызов _free_dbg сводится к вызову free . И free , и
_free_dbg освобождают блок памяти в основной куче, однако _free_dbg включает
две возможности отладки: возможность хранить освободившиеся блоки в
связанном списке кучи для моделирования условий недостатка памяти, а также
параметр типа блока для освобождения блоков выделенной памяти конкретного
типа.

_free_dbg выполняет проверку действительности для всех указанных файлов и


расположений блоков перед выполнением операции освобождения. Приложение
не должно предоставлять эти сведения. При освобождении блока памяти
диспетчер отладочной кучи автоматически проверяет целостность буферов по обе
стороны пользовательской части. Он выдает отчет об ошибках, если обнаруживает
перезапись. _CRTDBG_DELAY_FREE_MEM_DF Если задано битовое _crtDbgFlag поле флага,
освобожденный блок заполняется значением, 0xDD, назначается _FREE_BLOCK тип
блока и сохраняется в связанном списке блоков памяти кучи.

В случае возникновения ошибки при освобождении памяти для errno задаются


сведения о характере сбоя, полученные от операционной системы.
Дополнительные сведения см. в разделах errno, _doserrno, _sys_errlistи _sys_nerr.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между вызовом стандартной
функции кучи и отладочной версией см. в разделе Отладка версий функций
выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_free_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Пример использования _free_dbg см. в разделе crt_dbg2 .

См. также раздел


Подпрограммы отладки

_malloc_dbg
_free_locale
Статья • 03.04.2023

Освобождает объект языкового стандарта.

Синтаксис
C

void _free_locale(

_locale_t locale

);

Параметры
locale

Объект языкового стандарта, который необходимо освободить.

Комментарии
Функция _free_locale используется, чтобы освободить объект языкового
стандарта, полученный из вызова функции _get_current_locale или _create_locale .

Предыдущее название данной функции __free_locale (с 2 символами


подчеркивания в начале) использовать не рекомендуется.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Routine Обязательный заголовок

_free_locale <locale.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_get_current_locale

_create_locale, _wcreate_locale
_freea
Статья • 03.04.2023

Освобождает блок памяти.

Синтаксис
C

void _freea(

void *memblock

);

Параметры
memblock

Ранее выделенный блок памяти, который требуется освободить.

Возвращаемое значение
Нет.

Remarks
Функция _freea освобождает блок памяти ( memblock ), который ранее был выделен
вызовом _malloca. Функция _freea проверяет, была ли память выделена в стеке
или в куче. Если она была выделена в стеке, функция _freea не выполняет никаких
действий. Если память выделена в куче, число освобожденных байтов
эквивалентно количеству байтов, запрошенному при выделении блока. Если
memblock имеет значение NULL , указатель игнорируется и _freea немедленно
возвращается. Попытка освободить недопустимый указатель (указатель на блок
памяти, который не был выделен ) _malloca может повлиять на последующие
запросы выделения и привести к ошибкам.

_freea вызывает внутренние вызовы free , если обнаруживается, что память

выделена в куче. Информация о том, выделена ли память в куче или в стеке,


определяется меткой, которая устанавливается в памяти по адресу,
непосредственно предшествующему выделенному блоку памяти.
В случае возникновения ошибки при освобождении памяти для errno задаются
сведения о характере сбоя, полученные от операционной системы.
Дополнительные сведения см. в разделах errno, _doserrno, _sys_errlistи _sys_nerr.

После освобождения блока памяти минимизирует объем свободной памяти в куче,


_heapmin объединяя неиспользуемые регионы и отпуская их обратно в
операционную систему. Освобожденная память, которая не освобождена в
операционной системе, восстанавливается в свободном пуле и снова становится
доступной для выделения.

Вызов _freea должен сопровождать все вызовы _malloca . Кроме того, возникает
ошибка при двойном вызове _freea в одной памяти. Если приложение связано с
отладочной версией библиотек времени выполнения C, особенно с _malloc_dbg
функциями, включенными путем определения _CRTDBG_MAP_ALLOC , проще найти
отсутствующие или дублирующиеся _freea вызовы . Дополнительные сведения об
управлении кучей в процессе отладки см. в разделе Куча отладки CRT.

Функция _freea помечена как __declspec(noalias) ; это означает, что функция


гарантировано не изменяет глобальные переменные. Для получения
дополнительной информации см. noalias.

Требования
Компонент Обязательный заголовок

_freea <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _malloca.

См. также раздел


Выделение памяти

_malloca

calloc

malloc

_malloc_dbg

realloc

_free_dbg

_heapmin
freopen , _wfreopen
Статья • 03.04.2023

Переназначает указатель файла. Доступны более безопасные версии функций; См.


разделfreopen_s , _wfreopen_s.

Синтаксис
C

FILE *freopen(

const char *path,

const char *mode,

FILE *stream

);

FILE *_wfreopen(

const wchar_t *path,


const wchar_t *mode,
FILE *stream

);

Параметры
path

Путь к новому файлу.

mode

Тип разрешенного доступа.

stream

Указатель на структуру FILE .

Возвращаемое значение
Каждая из этих функций возвращает указатель на вновь открытый файл. При
возникновении ошибки исходный файл закрывается, а функция возвращает NULL
значение указателя. Если path , mode или stream является пустым указателем или
filename является пустой строкой, эти функции вызывают обработчик

недопустимых параметров, как описано в разделе Проверка параметров. Если


выполнение может быть продолжено, эти функции устанавливают параметр errno
в значение EINVAL и возвращают значение NULL .
Дополнительные сведения о кодах ошибок см. в разделах errno, _doserrno,
_sys_errlistи _sys_nerr.

Комментарии
Существуют более безопасные версии этих функций, см. разделfreopen_s ,
_wfreopen_s.

Функция freopen закрывает файл, в данный момент связанный с stream , и


переназначает stream файлу, который указан в path . _wfreopen  — это версия
функции _freopen для расширенных символов; аргументы path и mode для функции
_wfreopen представляют собой строки расширенных символов.
Поведение _wfreopen и _freopen идентично в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfreopen freopen freopen _wfreopen

freopen обычно используется для перенаправления заранее открытых файлов


stdin , stdout и stderr на файлы, определенные пользователем. Новый файл,

связанный с stream , открывается с mode ,, — символьной строкой, указывающей


запрошенный тип доступа для файла, следующим образом:

mode Access

"r" Открывает для чтения. Если файл не существует или его не удается найти, вызов
завершается ошибкой freopen .

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление) без удаления маркера в конце
файла (EOF) перед записью новых данных в файл. Создает файл, если он не
существует.

"r+" Открывает для чтения и записи. Файл должен существовать.


mode Access

"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое
удаляется.

"a+" Открывается для чтения и добавления. Операция добавления включает удаления


маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается
после завершения записи. Создает файл, если он не существует.

Используйте типы "w" и "w+" с осторожностью, поскольку они могут приводить к


уничтожению существующих файлов. Начиная с C11, можно добавить "x" "w" в
или "w+" , чтобы вызвать сбой функции, если файл существует, вместо его
перезаписи.

Если файл открывается с помощью типа доступа "a" или "a+" , все операции
записи выполняются в конце файла. Хотя указатель на файл можно изменить с
помощью fseek или rewind, указатель на файл всегда перемещается обратно в
конец файла перед выполнением любой операции записи. Таким образом,
существующие данные нельзя перезаписать.

Режим "a" не удаляет маркер EOF перед добавлением в файл. После добавления
команда MS-DOS TYPE отображает данные только до первоначального маркера
EOF и не отображает данные, добавленные в файл. Перед добавлением в файл
режим "a+" удаляет маркер конца файла. После добавления команда TYPE MS-DOS
отображает все данные в файле. Режим "a+" необходим для добавления в
потоковый файл, завершаемый маркером конца файла CTRL+Z.

Если задан тип доступа "r+" , "w+" или "a+" , чтение и запись разрешены (считается,
что файл открыт для "обновления"). Однако при переключении между чтением и
записью должна быть промежуток fsetposfseekвремени, или rewind операция . При
необходимости для операции или fseek можно указать текущее fsetpos положение.
Помимо вышеуказанных значений один из следующих символов может быть
включен в строку mode для определения режима преобразования новых строк.

mode Режим перевода


Модификатор

t Откройте файл в текстовом (переведенном) режиме.

b Открытие в двоичном (непереложенном) режиме; Переводы, включающие


символы возврата каретки и перевода строки, подавляются.

В текстовом режиме (переведено) сочетания перевода обратной строки каретки


(CR-LF) преобразуются в символы однострочного перевода (LF) на входе; Символы
LF претворяются в сочетания CR-LF на выходе. Кроме того, при вводе символ
CTRL+Z интерпретируется как символ конца файла. В файлах, открытых для чтения
или для чтения и записи с "a+" , библиотека времени выполнения проверяет на
CTRL+Z в конце файла и удаляет его, если это возможно. Он удаляется, так как
использование fseek и ftell для перемещения в файле может привести fseek к
неправильному поведению в конце файла. Не используйте параметр , t если
требуется переносимость ANSI, так как это расширение Майкрософт.

Если t или b не задано в mode , режим преобразования по умолчанию


определяется глобальной переменной _fmode. Если символ t или b указан как
префикс аргумента, функция завершается с ошибкой и возвращает NULL .

Описание текстовых и двоичных режимов см. в разделе Текстовый и двоичный


режим файлового ввода-вывода.

Требования
Компонент Обязательный заголовок

freopen <stdio.h>

_wfreopen <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C
смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_freopen.c

// compile with: /W3

// This program reassigns stderr to the file

// named FREOPEN.OUT and writes a line to that file.

#include <stdio.h>

#include <stdlib.h>

FILE *stream;

int main( void )

// Reassign "stderr" to "freopen.out":

stream = freopen( "freopen.out", "w", stderr ); // C4996

// Note: freopen is deprecated; consider using freopen_s instead

if( stream == NULL )


fprintf( stdout, "error on freopen\n" );

else

fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );

fprintf( stream, "This will go to the file 'freopen.out'\n" );

fclose( stream );

system( "type freopen.out" );

Output

successfully reassigned

This will go to the file 'freopen.out'

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

_fdopen, _wfdopen

_fileno

fopen, _wfopen

_open, _wopen

_setmode\
freopen_s , _wfreopen_s
Статья • 03.04.2023

Закрывает файл, связанный в данный момент с oldStream , и переназначает stream


файлу, указанному параметром fileName .

Эти версии freopenимеют _wfreopen улучшения безопасности, как описано в


разделе Функции безопасности в CRT.

Синтаксис
C

errno_t freopen_s(

FILE ** stream,

const char * fileName,

const char * mode,

FILE* oldStream

);

errno_t _wfreopen_s(

FILE ** stream,

const wchar_t * fileName,

const wchar_t * mode,

FILE * oldStream

);

Параметры
stream

Параметр out, указывающий на вновь открытый поток при возврате функции.

fileName

Путь к файлу для повторного открытия.

mode

Режим для вновь открываемого потока.

oldStream

Поток для повторного открытия. Он очищается, и все связанные с ним файлы


закрываются.
Возвращаемое значение
Ноль при успешном выполнении; в противном случае — код ошибки. При
возникновении ошибки исходный файл закрывается и NULL записывается в stream ,
если stream только не является NULL

Дополнительные сведения о кодах ошибок см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Функция freopen_s обычно используется для присоединения предварительно
открытых потоков, связанных с stdin , stdout и stderr к другому файлу.

Функция freopen_s закрывает файл, в данный момент связанный с stream , и


переназначает stream файлу, который указан в path . _wfreopen_s  — это версия
функции freopen_s для расширенных символов; аргументы path и mode для
функции _wfreopen_s представляют собой строки расширенных символов.
Поведение _wfreopen_s и freopen_s идентично в противном случае.

Если какой-либо из значений pFile , path mode , или NULL stream path является
пустой строкой, эти функции вызывают обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если выполнение может быть
продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfreopen_s freopen_s freopen_s _wfreopen_s

freopen_s обычно используется для перенаправления заранее открытых файлов

stdin , stdout и stderr на файлы, определенные пользователем. Новый файл,


связанный с stream , открывается с mode ,, — символьной строкой, указывающей
запрошенный тип доступа для файла, следующим образом:
mode Access

"r" Открывает для чтения. Если файл не существует или его не удается найти, вызов
завершается ошибкой freopen_s .

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление) без удаления маркера в конце
файла (EOF) перед записью новых данных в файл. Создает файл, если он не
существует.

"r+" Открывает для чтения и записи. Файл должен существовать.

"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое
удаляется.

"a+" Открывается для чтения и добавления. Операция добавления включает удаления


маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается
после завершения записи. Создает файл, если он не существует.

Используйте типы "w" и "w+" с осторожностью, поскольку они могут приводить к


уничтожению существующих файлов. Начиная с C11, вы можете добавить "x" в
"w" или "w+" , чтобы вызвать сбой функции, если файл существует, а не
перезаписывать его.

Если файл открывается с помощью типа доступа "a" или "a+" , все операции
записи выполняются в конце файла. Хотя указатель на файл можно изменить с
помощью fseek или rewind, указатель на файл всегда перемещается обратно в
конец файла перед выполнением любой операции записи. Таким образом,
существующие данные нельзя перезаписать.

Режим "a" не удаляет маркер EOF перед добавлением в файл. После добавления
команда MS-DOS TYPE отображает данные только до первоначального маркера
EOF и не отображает данные, добавленные в файл. Перед добавлением в файл
режим "a+" удаляет маркер конца файла. После добавления команда TYPE MS-DOS
отображает все данные в файле. Режим "a+" необходим для добавления в
потоковый файл, завершаемый маркером конца файла CTRL+Z.

Если задан тип доступа "r+" , "w+" или "a+" , чтение и запись разрешены (считается,
что файл открыт для "обновления"). Однако при переключении между чтением и
записью должна быть промежуток fsetposfseekвремени, или rewind операция . При
необходимости для операции или fseek можно указать текущее fsetpos положение.
Помимо вышеуказанных значений один из следующих символов может быть
включен в строку mode для определения режима преобразования новых строк.
mode Режим перевода
Модификатор

t Откройте файл в текстовом (переведенном) режиме.

b Открытие в двоичном (непереложенном) режиме; Переводы, включающие


символы возврата каретки и перевода строки, подавляются.

В текстовом режиме (переведено) сочетания перевода обратной строки каретки


(CR-LF) преобразуются в символы однострочного перевода (LF) на входе; Символы
LF претворяются в сочетания CR-LF на выходе. Кроме того, при вводе символ
CTRL+Z интерпретируется как символ конца файла. В файлах, открытых для чтения
или для чтения и записи с "a+" , библиотека времени выполнения проверяет на
CTRL+Z в конце файла и удаляет его, если это возможно. Он удаляется, так как
использование fseek и ftell для перемещения в файле может привести fseek к
неправильному поведению в конце файла. Не используйте параметр , t если
требуется переносимость ANSI, так как это расширение Майкрософт.

Если t или b не задано в mode , режим преобразования по умолчанию


определяется глобальной переменной _fmode. Если символ t или b указан как
префикс аргумента, функция завершается с ошибкой и возвращает NULL .

Описание текстовых и двоичных режимов см. в разделе Текстовый и двоичный


режим файлового ввода-вывода.

Требования
Компонент Обязательный заголовок

freopen_s <stdio.h>

_wfreopen_s <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C

смогут использовать их в приложениях UWP.

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_freopen_s.c

// This program reassigns stderr to the file

// named FREOPEN.OUT and writes a line to that file.

#include <stdio.h>

#include <stdlib.h>

FILE *stream;

int main( void )

errno_t err;

// Reassign "stderr" to "freopen.out":

err = freopen_s( &stream, "freopen.out", "w", stderr );

if( err != 0 )

fprintf( stdout, "error on freopen\n" );

else

fprintf( stdout, "successfully reassigned\n" );

fflush( stdout );
fprintf( stream, "This will go to the file 'freopen.out'\n" );

fclose( stream );

system( "type freopen.out" );

Output

successfully reassigned

This will go to the file 'freopen.out'

См. также раздел


Stream I/O

freopen, _wfreopen

fclose, _fcloseall

_fdopen, _wfdopen

_fileno

fopen, _wfopen

_open, _wopen

_setmode
frexp , frexpf , frexpl
Статья • 03.04.2023

Возвращает мантиссу и степень числа с плавающей запятой.

Синтаксис
C

double frexp(

double x,

int *expptr

);

float frexpf(

float x,

int * expptr

);

long double frexpl(

long double x,

int * expptr

);

#define frexpl(X, INT_PTR) // Requires C11 or higher

C++

float frexp(

float x,

int * expptr

); // C++ only

long double frexp(

long double x,

int * expptr

); // C++ only

Параметры
x

Значение с плавающей запятой.

expptr

Указатель на сохраненное значение целой части числа.

Возвращаемое значение
frexp возвращает мантиссу. Если x равно 0, функция возвращает значение 0 для

мантиссы и степени. В противном случае expptr NULL вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эта функции задает для errno значение
EINVAL и возвращает 0.

Комментарии
Функция frexp разбивает значение с плавающей запятой ( x ) на мантиссу ( m ) и
экспоненту ( n ), чтобы абсолютное значение m больше или равно 0,5 и меньше 1,0
и m x = * 2. n Целый показатель степени n сохраняется в расположении, на которое
указывает expptr .

Так как C++ допускает перегрузку, можно вызывать перегрузки функции frexp . В
программе C, если для вызова этой функции не используется <макрос tgmath.h> ,
frexp всегда принимает double указатель и int возвращает значение double .

При использовании <макроса tgmath.h> frexp() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в описании
универсальной математики типов .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

frexp , frexpf , frexpl <math.h>

frexp Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_frexp.c

// This program calculates frexp( 16.4, &n )

// then displays y and n.

#include <math.h>

#include <stdio.h>

int main( void )

double x, y;

int n;

x = 16.4;

y = frexp( x, &n );

printf( "frexp( %f, &n ) = %f, n = %d\n", x, y, n );

Output

frexp( 16.400000, &n ) = 0.512500, n = 5

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ldexp

modf, modff, modfl


fscanf , _fscanf_l , fwscanf , _fwscanf_l
Статья • 03.04.2023

Считывают форматированные данные из потока. Доступны более безопасные


версии этих функций; see fscanf_s, , fwscanf_s_fscanf_s_l_fwscanf_s_l.

Синтаксис
C

int fscanf(

FILE *stream,

const char *format [,

argument ]...

);

int _fscanf_l(

FILE *stream,

const char *format,

_locale_t locale [,

argument ]...

);

int fwscanf(

FILE *stream,

const wchar_t *format [,

argument ]...

);

int _fwscanf_l(

FILE *stream,

const wchar_t *format,

_locale_t locale [,

argument ]...

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.

argument

Необязательные аргументы.
locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает количество полей, успешно преобразованных
и назначенных; возвращаемое значение не содержит поля, которые были
прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не
были назначены. Если до первого преобразования возникает ошибка или
достигается конец потока файла, возвращается значение EOF для fscanf и fwscanf .

Эти функции проверяют свои параметры. Если stream или format является NULL
указателем, вызывается обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если продолжение выполнения разрешено, эти
функции возвращают EOF и устанавливают для errno значение EINVAL .

Комментарии
Функция fscanf считывает данные из текущей позиции stream в расположение, на
которое указывает argument (если такое есть). Каждый параметр argument должен
быть указателем на переменную, которая имеет тип, соответствующий
спецификатору типа в параметре format . format управляет интерпретацией полей
ввода и имеет ту же форму и функцию, что format и аргумент для scanf ; см scanf .
описание format .

fwscanf  — это версия fscanf с расширенными символами; аргумент format для

функции fwscanf  — строка расширенных символов. Эти функции ведут себя


одинаково, если поток открыт в режиме ANSI. fscanf сейчас не поддерживает ввод
из потока ЮНИКОДА.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_ftscanf fscanf fscanf fwscanf


TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_ftscanf_l _fscanf_l _fscanf_l _fwscanf_l

Дополнительные сведения см. в разделе "Поля спецификации форматирования"


scanf и wscanf "Функции".

Требования
Компонент Обязательный заголовок

fscanf , _fscanf_l <stdio.h>

fwscanf , _fwscanf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fscanf.c

// compile with: /W3

// This program writes formatted

// data to a file. It then uses fscanf to

// read the various data back from the file.

#include <stdio.h>

FILE *stream;

int main( void )

long l;

float fp;

char s[81];

char c;

if( fopen_s( &stream, "fscanf.out", "w+" ) != 0 )

printf( "The file fscanf.out was not opened\n" );

else

fprintf( stream, "%s %ld %f%c", "a-string",

65000, 3.14159, 'x' );

// Security caution!

// Beware loading data from a file without confirming its size,

// as it may lead to a buffer overrun situation.

// Set pointer to beginning of file:

fseek( stream, 0L, SEEK_SET );

// Read data back from file:

fscanf( stream, "%s", s ); // C4996

fscanf( stream, "%ld", &l ); // C4996

fscanf( stream, "%f", &fp ); // C4996

fscanf( stream, "%c", &c ); // C4996

// Note: fscanf is deprecated; consider using fscanf_s instead

// Output data read:

printf( "%s\n", s );

printf( "%ld\n", l );

printf( "%f\n", fp );

printf( "%c\n", c );

fclose( stream );

Output

a-string

65000

3.141590

См. также раздел


Потоковый ввод-вывод

_cscanf, _cscanf_l, _cwscanf, _cwscanf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

fscanf_s, _fscanf_s_l, fwscanf_s, _fwscanf_s_l


fscanf_s , _fscanf_s_l , fwscanf_s ,
_fwscanf_s_l
Статья • 03.04.2023

Считывают форматированные данные из потока. Эти версии fscanf, _fscanf_l,


fwscanf_fwscanf_l имеют улучшения безопасности, как описано в разделе Функции
безопасности в CRT.

Синтаксис
C

int fscanf_s(

FILE *stream,

const char *format [,

argument ]...

);

int _fscanf_s_l(

FILE *stream,

const char *format,

_locale_t locale [,

argument ]...

);

int fwscanf_s(

FILE *stream,

const wchar_t *format [,

argument ]...

);

int _fwscanf_s_l(

FILE *stream,

const wchar_t *format,

_locale_t locale [,

argument ]...

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.


argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые она успешно
преобразует и назначает. Возвращаемое значение не включает поля, которые
были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля
не были назначены. Если до первого преобразования возникает ошибка или
достигается конец потока файла, возвращается значение EOF для fscanf_s и
fwscanf_s .

Эти функции проверяют свои параметры. Если stream является недопустимым


указателем на файл или format является пустым указателем, эти функции вызывают
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если продолжение выполнения разрешено, эти функции возвращают
EOF и устанавливают для errno значение EINVAL .

Комментарии
Функция fscanf_s считывает данные из текущей позиции stream в расположения,
на которые указывает argument (если такие есть). Каждый параметр argument
должен быть указателем на переменную, которая имеет тип, соответствующий
спецификатору типа в параметре format . format управляет интерпретацией полей
ввода и имеет ту же форму и функцию, что format и аргумент для scanf_s ;
описание см. в разделе Форматирование полей спецификации: функции scanf и
wscanf . format fwscanf_s  — это версия fscanf_s с расширенными символами;
аргумент format для функции fwscanf_s  — строка расширенных символов. Эти
функции ведут себя одинаково, если поток открыт в режиме ANSI. fscanf_s сейчас
не поддерживает ввод из потока ЮНИКОДА.

Основное различие между более безопасными функциями (с _s суффиксом) и


другими версиями заключается в том, что первые требуют, чтобы размер каждого
поля типа c , C , s , S и [ в символах передавался как аргумент сразу после
переменной. Дополнительные сведения см. в разделе scanf_s, _scanf_s_l,
_wscanf_s_lwscanf_s и scanf Спецификация ширины.
7 Примечание

Параметр размера имеет тип unsigned , а не size_t .

Версии этих функций с суффиксом _l идентичны версиям без суффикса, за


исключением того, что они используют переданный параметр языкового стандарта
вместо языкового стандарта текущего потока.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_ftscanf_s fscanf_s fscanf_s fwscanf_s

_ftscanf_s_l _fscanf_s_l _fscanf_s_l _fwscanf_s_l

Требования
Компонент Обязательный заголовок

fscanf_s , _fscanf_s_l <stdio.h>

fwscanf_s , _fwscanf_s_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fscanf_s.c

// This program writes formatted

// data to a file. It then uses fscanf to

// read the various data back from the file.

#include <stdio.h>

#include <stdlib.h>

FILE *stream;

int main( void )

long l;

float fp;

char s[81];

char c;

errno_t err = fopen_s( &stream, "fscanf.out", "w+" );

if( err )

printf_s( "The file fscanf.out was not opened\n" );

else

fprintf_s( stream, "%s %ld %f%c", "a-string",

65000, 3.14159, 'x' );

// Set pointer to beginning of file:

fseek( stream, 0L, SEEK_SET );

// Read data back from file:

fscanf_s( stream, "%s", s, _countof(s) );

fscanf_s( stream, "%ld", &l );

fscanf_s( stream, "%f", &fp );

fscanf_s( stream, "%c", &c, 1 );

// Output data read:

printf( "%s\n", s );

printf( "%ld\n", l );

printf( "%f\n", fp );

printf( "%c\n", c );

fclose( stream );

Output

a-string

65000

3.141590

См. также раздел


Потоковый ввод-вывод

_cscanf_s, _cscanf_s_l, _cwscanf_s, _cwscanf_s_l

fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

fscanf, _fscanf_l, fwscanf, _fwscanf_l


fseek , _fseeki64
Статья • 03.04.2023

Перемещает файловый указатель в указанное местоположение.

Синтаксис
C

int fseek(

FILE *stream,

long offset,

int origin

);

int _fseeki64(

FILE *stream,

__int64 offset,

int origin

);

Параметры
stream

Указатель на структуру FILE .

offset

Количество байт начиная с origin .

origin

Первоначальная позиция.

Возвращаемое значение
Если операция завершилась удачно, fseek и _fseeki64 возвращают 0. В противном
случае возвращается ненулевое значение. Для устройств, которые не
поддерживают поиск, возвращаемое значение не определено. Если stream
является пустым указателем или origin не является одним из допустимых
значений, описанных ниже, fseek и _fseeki64 вызовите обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают -1.
Комментарии
Функции fseek и _fseeki64 перемещают файловый указатель (если он есть),
связанный с аргументом stream , в новое местоположение, которое отстоит на
offset байт от origin . Следующая операция в потоке происходит в новом
местоположении. В потоке, открытом для обновления, следующая операция может
быть либо операцией чтения, либо операцией записи. Аргумент origin должен
быть одной из следующих констант, определенных в STDIO.H :

значение источника Значение

SEEK_CUR Текущая позиция файлового указателя.

SEEK_END Конец файла.

SEEK_SET Начало файла.

С помощью функций fseek и _fseeki64 можно переместить указатель в любое


место в файле. Указатель также может быть размещен за пределами файла. fseek и
_fseeki64 очищает индикатор конца файла и отрицает влияние любых

предыдущих ungetc вызовов против stream .

Когда файл открыт для добавления данных, текущая позиция в файле определяется
последней операцией ввода-вывода, а не тем, где должна произойти следующая
запись. Если в открытом для добавления файле еще не было ни одной операции
ввода-вывода, этой позицией является начало файла.

Для потоков, открытых в текстовом режиме и _fseeki64 ограниченного


использования, fseek так как переводы веб-канала возврата каретки могут вызвать
fseek непредвиденные результаты и _fseeki64 привести к непредвиденным

результатам. Единственными fseek и _fseeki64 операциями, гарантированно


работающими в потоках, открытых в текстовом режиме, являются:

поиск со смещением 0 относительно любого из значений origin;

Поиск с начала файла со значением смещения, возвращенным из вызова ftell


при использовании fseek или _ftelli64 при использовании _fseeki64 .

Кроме того, в текстовом режиме при вводе CTRL+Z интерпретируется как символ
конца файла. В файлах, открытых для чтения/записи, функция fopen и все
связанные с ней подпрограммы проверяют наличие символа CTRL+Z в конце
файла и удаляют его, если это возможно. Он удаляется из-за того, что
использование сочетания fseek и ftell (или _fseeki64 ) _ftelli64для перемещения в
файл, заканчивающийся клавишей CTRL+Z, может привести fseek к
неправильному поведении или _fseeki64 неправильной работы в конце файла.

Когда CRT открывает файл, начинающийся с метки порядка байтов (BOM),


указатель на файл размещается после BOM. (То есть он размещается в начале
фактического содержимого файла). Если вам нужно вернуться к fseek началу
файла, используйте ftell для получения начальной позиции, а затем fseek к этой
позиции, а не к позиции 0.

Эта функция блокирует работу других потоков во время выполнения, поэтому она
потокобезопасна. Сведения о версии, отличной от блокировки, см. в разделе
_fseek_nolock. _fseeki64_nolock

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

fseek <stdio.h>

_fseeki64 <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fseek.c

// This program opens the file FSEEK.OUT and

// moves the pointer to the file's beginning.

#include <stdio.h>

int main( void )

FILE *stream;

char line[81];

int result;

if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )

printf( "The file fseek.out was not opened\n" );

return -1;

fprintf( stream, "The fseek begins here: "

"This is the file 'fseek.out'.\n" );

result = fseek( stream, 23L, SEEK_SET);

if( result )

perror( "Fseek failed" );

else

printf( "File pointer is set to middle of first line.\n" );

fgets( line, 80, stream );

printf( "%s", line );

fclose( stream );

Output

File pointer is set to middle of first line.

This is the file 'fseek.out'.

См. также раздел


Потоковый ввод-вывод

fopen, _wfopen

ftell, _ftelli64

_lseek, _lseeki64

rewind
_fseek_nolock , _fseeki64_nolock
Статья • 03.04.2023

Перемещает файловый указатель в указанное местоположение.

Синтаксис
C

int _fseek_nolock(

FILE *stream,

long offset,

int origin

);

int _fseeki64_nolock(

FILE *stream,

__int64 offset,

int origin

);

Параметры
stream

Указатель на структуру FILE .

offset

Количество байт начиная с origin .

origin

Первоначальная позиция.

Возвращаемое значение
То же, что fseek и _fseeki64соответственно.

Комментарии
Эти функции являются неблокирующими версиями fseek и _fseeki64соответственно.
Эти функции идентичны fseek и _fseeki64, за исключением того, что они не
защищены от вмешательства другими потоками. Эти функции могут быть быстрее,
так как они не повлекли за собой затраты на блокировку других потоков.
Используйте эти функции только в потокобезопасных контекстах, например в
однопоточных приложениях или если вызываемая область уже обрабатывает
изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

_fseek_nolock , _fseeki64_nolock <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

ftell, _ftelli64

_lseek, _lseeki64

rewind
fsetpos
Статья • 03.04.2023

Задает индикатор позиции в потоке.

Синтаксис
C

int fsetpos(

FILE *stream,

const fpos_t *pos

);

Параметры
stream

Указатель на структуру FILE .

pos

Хранилище индикатора позиции.

Возвращаемое значение
В случае успеха fsetpos возвращает 0. При сбое функция возвращает ненулевое
значение и задает errno одну из следующих констант манифеста (определенных в
ERRNO. H): EBADF это означает, что файл недоступен или объект, указывающий
stream на не является допустимой структурой файлов; или EINVAL означает
недопустимое значение для stream или pos передано. Если передается
недопустимый параметр, эти функции вызывают обработчик недопустимых
параметров, как описано в разделе "Проверка параметров".

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция fsetpos задает для индикатора stream положения файла значение pos ,
полученное при предыдущем вызове fgetpos . stream Функция очищает индикатор
конца файла и отменяет любые последствияungetc. stream После вызова
fsetpos следующая операция stream может быть входной или выходной.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

fsetpos <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для fgetpos.

См. также раздел


Потоковый ввод-вывод

fgetpos
_fsopen , _wfsopen
Статья • 03.05.2023

Открывает поток с совместным доступом к файлу.

Синтаксис
C

FILE *_fsopen(

const char *filename,

const char *mode,

int shflag

);

FILE *_wfsopen(

const wchar_t *filename,

const wchar_t *mode,


int shflag

);

Параметры
filename

Имя файла, который необходимо открыть.

mode

Тип разрешенного доступа.

shflag

Разрешенный тип общего доступа.

Возвращаемое значение
Каждая из этих функций возвращает указатель на поток. Значение указателя null
обозначает ошибку. Если filename или mode является NULL или пустой строкой, эти
функции вызывают обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если продолжение выполнения разрешено, эти функции
возвращают NULL и устанавливают для errno значение EINVAL .

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.
Комментарии
Функция _fsopen открывает файл, указанный в параметре filename , в качестве
потока и готовит файл для последующих операций чтения или записи с общим
доступом, как определено режимом и аргументами shflag . _wfsopen  — это версия
функции _fsopen для расширенных символов; аргументы filename и mode для
функции _wfsopen представляют собой строки расширенных символов.
Поведение _wfsopen и _fsopen идентично в противном случае.

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

Термин Определение

"r" Открывает для чтения. Если файл не существует или его не удается найти, вызов
завершается ошибкой _fsopen .

"w" Открывает пустой файл для записи. Если указанный файл существует, его
содержимое удаляется.

"a" Открывается для записи в конце файла (добавление); сначала создает файл, если
он не существует.

" r+ " Открывает для чтения и записи. (Файл должен существовать.)

" w+ " Открывает пустой файл для чтения и записи. Если указанный файл существует, его
содержимое удаляется.

" a+ " Открывается для чтения и добавления; сначала создает файл, если он не
существует.

Используйте типы " w " и " w+ " с осторожностью, так как они могут уничтожить
существующие файлы.

При открытии файла с типом доступа " a " или " a+ " все операции записи
выполняются в конце файла. Указатель на файл можно изменить с помощью fseek
или rewind, но он всегда перемещается обратно в конец файла перед выполнением
любой операции записи. Таким образом, существующие данные нельзя
перезаписать. Если указан тип доступа " r+ ", " w+ " или " a+ " , чтение и запись
разрешены (файл открыт для обновления). Однако при переключении между
чтением и записью должна существовать промежуток fsetpos, fseekили rewind
операция . При необходимости для операции fsetpos или fseek можно задать
текущее положение. Помимо вышеуказанных значений, в параметр mode можно
включить один из следующих символов для определения режима преобразования
новых строк, а также для управления файлами.
Термин Определение

t Открывает файл в текстовом режиме (с преобразованием). В этом режиме


сочетания перевода строки возврата каретки (CR-LF) преобразуются в
однострочные каналы (LF) на входе, а символы LF преобразуются в сочетания CR-
LF на выходе. Кроме того, при вводе символ CTRL+Z интерпретируется как символ
конца файла. В файлах, открытых для чтения или чтения/записи, функция _fsopen
проверяет наличие символа CTRL+Z в конце файла и удаляет его, если это
возможно. Она удалена, так как использование fseek и ftell для перемещения в
файле, который заканчивается клавишей CTRL+Z, может привести fseek к
неправильному поведению в конце файла.

b Открывает файл в двоичном (непреобразованном) режиме; вышеописанные


преобразования отключены.

D Указывает временный файл, который удаляется при закрытии последнего


указателя на него.

R Указывает, что кэширование оптимизировано для случайного доступа с диска, но


не ограничивается им.

S Указывает, что кэширование оптимизировано для последовательного доступа с


диска, но не ограничивается им.

T Указывает файл, который не записывается на диск, если это не требует нехватки


памяти.

Если t или b не задано в mode , режим преобразования определяется переменной


_fmode режима по умолчанию . Если символ t или b указан как префикс аргумента,
функция завершается с ошибкой и возвращает NULL . Описание текстовых и
двоичных режимов см. в разделе Текстовый и двоичный режим файлового ввода-
вывода.

В отношении T и D :

T позволяет избежать записи файла на диск, если он не требует нехватки


памяти. Дополнительные сведения см. в разделе
FILE_ATTRIBUTE_TEMPORARY Константы атрибута файла, а также в этой записи
блога Это только временные действия.
D указывает обычный файл, записываемый на диск. Разница заключается в

том, что он автоматически удаляется при закрытии.


Можно объединить TD ,
чтобы получить обе семантики.

_fsopen и _wfsopen — это зависящие от Майкрософт варианты fopen. Они не


являются частью стандарта ANSI. Для более переносимой и безопасной функции,
если вам не требуется общий доступ к файлам, рассмотрите или_wfopen_sfopen_s.
Аргумент shflag является константным выражением, состоящим из одной из
следующих констант манифеста, определенных в Share.h .

Термин Определение

_SH_DENYNO Разрешает доступ на чтение и запись.

_SH_DENYRD Запрещает доступ к файлу для чтения.

_SH_DENYRW Запрещает доступ к файлу для чтения и записи.

_SH_DENYWR Запрещает доступ к файлу для записи.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tfsopen _fsopen _fsopen _wfsopen

Требования
Компонент Обязательный заголовок Необязательные заголовки

_fsopen <stdio.h> <share.h>

Для константы манифеста для параметра shflag .

_wfsopen <stdio.h> или <wchar.h> <share.h>

Для константы манифеста для параметра shflag .

Пример
C

// crt_fsopen.c

#include <stdio.h>

#include <stdlib.h>

#include <share.h>

int main( void )

FILE *stream;

// Open output file for writing. Using _fsopen allows us to

// ensure that no one else writes to the file while we are

// writing to it.

//

if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )

fprintf( stream, "No one else in the network can write "

"to this file until we are done.\n" );

fclose( stream );

// Now others can write to the file while we read it.

system( "type outfile" );

Output

No one else in the network can write to this file until we are done.

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

fopen, _wfopen

freopen, _wfreopen

_open, _wopen

_setmode

_sopen, _wsopen
_fstat , _fstat32 , _fstat64 , _fstati64 ,
_fstat32i64 , _fstat64i32
Статья • 03.04.2023

Получает сведения об открытом файле.

Синтаксис
C

int _fstat(

int fd,

struct _stat *buffer

);

int _fstat32(

int fd,

struct __stat32 *buffer

);

int _fstat64(

int fd,

struct __stat64 *buffer

);

int _fstati64(

int fd,

struct _stati64 *buffer

);

int _fstat32i64(

int fd,

struct _stat32i64 *buffer

);

int _fstat64i32(

int fd,

struct _stat64i32 *buffer

);

Параметры
fd

Дескриптор открытого файла.

buffer

Указатель на структуру для хранения результатов.


Возвращаемое значение
Каждая из этих функций возвращает 0, если получена информация о состоянии
файла. Возвращаемое значение -1 указывает на ошибку. Если дескриптор файла
является недопустимым или buffer является NULL , вызывается обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение разрешено продолжить, errno установлено значение EBADF для
недопустимого дескриптора файла или EINVAL значение buffer if is NULL .

Комментарии
Функция _fstat получает сведения об открытом файле, который связан с fd , и
сохраняет их в структуре, указанной в параметре buffer . Структура _stat ,
определенная в SYS\Stat.h , содержит следующие поля.

Поле Значение

st_atime Время последнего доступа к файлу.

st_ctime Время создания файла.

st_dev Для устройства равно fd , в противном случае — 0.

st_mode Битовая маска для информации о файловом режиме. Бит _S_IFCHR


устанавливается в том случае, если fd ссылается на устройство. Бит _S_IFREG
устанавливается в том случае, если fd ссылается на обычный файл. Биты чтения/
записи устанавливаются в соответствии с режимом разрешений файла. _S_IFCHR
и другие константы определяются в SYS\Stat.h .

st_mtime Время последнего изменения файла.

st_nlink Всегда имеет значение 1 в файловых системах, отличных от NTFS.

st_rdev Для устройства равно fd , в противном случае — 0.

st_size Размер файла в байтах.

Если fd ссылается на устройство, поля st_mtime st_atime st_ctime и st_size поля не


имеют значения.

Так как Stat.h используется _dev_t тип, определенный в Types.h , необходимо


включить Types.h в код. Stat.h

Функция _fstat64 , которая использует структуру __stat64 , поддерживает даты


создания файла до 23:59:59 31 декабря 3000 года в формате UTC. При этом другие
функции представляют даты только до 23:59:59 18 января 2038 года в формате UTC.
Нижняя граница диапазона дат для всех этих функций — Полночь, 1 января 1970 г.

Варианты этих функций поддерживают 32- или 64-разрядные типы времени и 32-
или 64-разрядные размеры файлов. Первый числовой суффикс ( 32 или 64 )
указывает размер используемого типа времени; второй суффикс i32 или
i64 показывает, представлен ли размер файла как 32- или 64-разрядное целое

число.

Если не _USE_32BIT_TIME_T определено, _fstat он эквивалентен _fstat64i32 64-


разрядному времени и _stat содержит 64-разрядное время. Если
_USE_32BIT_TIME_T этот параметр определен, _fstat использует 32-разрядное

время и _stat содержит 32-разрядное время. Это же справедливо и для _fstati64 .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Варианты типов времени и длины файла _stat

Функции Директива _USE_32BIT_TIME_T Тип времени Тип длины


определена? файла

_fstat Не определено 64-разрядная 32-разрядная


версия

_fstat Определено 32-битная 32-битная

_fstat32 Не затрагивается определением 32-битная 32-битная


макроса

_fstat64 Не затрагивается определением 64-разрядная 64-разрядная


макроса система система

_fstati64 Не определено 64-разрядная 64-разрядная


система система

_fstati64 Определено 32-разрядная 64-разрядная


версия версия

_fstat32i64 Не затрагивается определением 32-разрядная 64-разрядная


макроса версия версия

_fstat64i32 Не затрагивается определением 64-разрядная 32-разрядная


макроса версия
Требования
Компонент Обязательный заголовок

_fstat <sys/stat.h> и <sys/types.h>

_fstat32 <sys/stat.h> и <sys/types.h>

_fstat64 <sys/stat.h> и <sys/types.h>

_fstati64 <sys/stat.h> и <sys/types.h>

_fstat32i64 <sys/stat.h> и <sys/types.h>

_fstat64i32 <sys/stat.h> и <sys/types.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fstat.c

// This program uses _fstat to report

// the size of a file named F_STAT.OUT.

#include <io.h>

#include <fcntl.h>

#include <time.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <share.h>

int main( void )

struct _stat buf;

int fd, result;

char buffer[] = "A line to output";

char timebuf[26];

errno_t err;

_sopen_s( &fd,

"f_stat.out",

_O_CREAT | _O_WRONLY | _O_TRUNC,

_SH_DENYNO,

_S_IREAD | _S_IWRITE );

if( fd != -1 )

_write( fd, buffer, strlen( buffer ) );

// Get data associated with "fd":

result = _fstat( fd, &buf );

// Check if statistics are valid:

if( result != 0 )

if (errno == EBADF)

printf( "Bad file descriptor.\n" );

else if (errno == EINVAL)

printf( "Invalid argument to _fstat.\n" );

else

printf( "File size : %ld\n", buf.st_size );

err = ctime_s(timebuf, 26, &buf.st_mtime);

if (err)

printf("Invalid argument to ctime_s.");

exit(1);

printf( "Time modified : %s", timebuf );

_close( fd );

Output

File size : 16

Time modified : Wed May 07 15:25:11 2003

См. также раздел


Обработка файлов

_access, _waccess

_chmod, _wchmod

_filelength, _filelengthi64

_stat, _wstat функции


ftell , _ftelli64
Статья • 03.04.2023

Получает текущее положение указателя файла.

Синтаксис
C

long ftell(

FILE *stream

);

__int64 _ftelli64(

FILE *stream

);

Параметры
stream

Целевая структура FILE .

Возвращаемое значение
Функции ftell и _ftelli64 возвращают текущее положение в файле. Значение,
возвращаемое и _ftelli64 не отражающее ftell физическое смещение байтов
для потоков, открытых в текстовом режиме, так как текстовый режим приводит к
переводу веб-канала возврата каретки. Используйте ftell для fseek правильного
возврата к расположениям файлов или _ftelli64 с _fseeki64 ним. При ошибке
ftell и _ftelli64 вызов обработчика недопустимых параметров, как описано в
разделе "Проверка параметров". Если выполнение разрешено продолжать, эти
функции возвращают -1L и устанавливают errno одну из двух констант,
определенных в ERRNO.H . Константа EBADF означает, что stream аргумент не
является допустимым значением указателя файла или не ссылается на открытый
файл. Константа EINVAL означает, что функции передан недопустимый аргумент
stream . На устройствах, которые не могут искать (например, терминалы и

принтеры) или если stream не ссылается на открытый файл, возвращаемое


значение не определено.
Дополнительные сведения о кодах возврата см. в разделе errno, и
_sys_nerr_doserrno_sys_errlist.

Комментарии
_ftelli64 Функции ftell извлекают текущую позицию указателя файла (при
наличии), связанного с stream . Позиция представляется как смещение
относительно начала потока.

Когда файл открыт для добавления данных, текущая позиция в файле определяется
последней операцией ввода-вывода, а не тем, где должна произойти следующая
запись. Например, предположим, что файл открыт для добавления, а последняя
операция была прочитана. Позиция файла — это точка начала следующей
операции чтения, а не место начала следующей записи. (При открытии файла для
добавления позиция файла перемещается в конец файла перед любой операцией
записи.) Если операция ввода-вывода еще не выполнялась в файле, открытом для
добавления, позиция файла начинается.

В текстовом режиме при вводе CTRL+Z интерпретируется как символ конца файла.
В файлах, открытых для чтения/записи, функция fopen и все связанные с ней
подпрограммы проверяют наличие символа CTRL+Z в конце файла и удаляют его,
если это возможно. Это связано с тем, что использование сочетания ftell и (
_fseeki64или _ftelli64 fseek) для перемещения в файл, который заканчивается
клавишей CTRL+Z, может привести ftell к неправильному ведении или _ftelli64
неправильной работы в конце файла.

Во время выполнения функция блокирует вызывающий поток, поэтому она


потокобезопасна. Сведения о неблокирующей версии см. в описании функции
_ftell_nolock .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок Необязательные заголовки

ftell <stdio.h> <errno.h>

_ftelli64 <stdio.h> <errno.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_ftell.c

// This program opens a file named CRT_FTELL.C

// for reading and tries to read 100 characters. It

// then uses ftell to determine the position of the

// file pointer and displays this position.

#include <stdio.h>

FILE *stream;

int main( void )

long position;

char list[100];

if( fopen_s( &stream, "crt_ftell.c", "rb" ) == 0 )

// Move the pointer by reading data:

fread( list, sizeof( char ), 100, stream );

// Get position after read:

position = ftell( stream );


printf( "Position after trying to read 100 bytes: %ld\n",

position );

fclose( stream );

Output

Position after trying to read 100 bytes: 100

См. также раздел


Потоковый ввод-вывод

fopen, _wfopen

fgetpos

fseek, _fseeki64

_lseek, _lseeki64
_ftell_nolock , _ftelli64_nolock
Статья • 03.04.2023

Получает текущее положение указателя файла, не блокируя поток.

Синтаксис
C

long _ftell_nolock(

FILE *stream

);

__int64 _ftelli64_nolock(

FILE *stream

);

Параметры
stream

Целевая структура FILE .

Возвращаемое значение
То же, что ftell и _ftelli64 . Дополнительные сведения см. в разделе ftell, _ftelli64.

Комментарии
Эти функции представляют собой неблокирующие версии функций ftell и
_ftelli64 соответственно. Они идентичны ftell и _ftelli64 за исключением того,

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

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.
Требования
Компонент Обязательный заголовок Необязательный заголовок

ftell_nolock <stdio.h> <errno.h>

_ftelli64_nolock <stdio.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

fgetpos

fseek, _fseeki64

_lseek, _lseeki64

ftell, _ftelli64
_ftime , _ftime32 , _ftime64
Статья • 03.04.2023

Получает текущее время. Доступны более безопасные версии этих функций; see
_ftime_s, , _ftime64_s_ftime32_s.

Синтаксис
C

void _ftime( struct _timeb *timeptr );

void _ftime32( struct __timeb32 *timeptr );

void _ftime64( struct __timeb64 *timeptr );

Параметры
timeptr

Указатель на _timeb __timeb32 , или __timeb64 структуру.

Комментарии
Функция _ftime получает текущее местное время и сохраняет его в структуре, на
которую указывает timeptr . , _timeb и __timeb64 структуры определяются в
<sys\timeb.h>. __timeb32 Они содержат четыре поля, которые описываются в
следующей таблице.

Поле Описание

dstflag Ненулевое значение, если для местного часового пояса в данный момент
действует летнее время. (См _tzset . объяснение того, как определяется летнее
время.)

millitm Доля секунды в миллисекундах.

time Время представляется в виде числа секунд, истекших после полуночи (00:00:00)
1 января 1970 года, время в формате UTC.

timezone Разница в минутах между временем UTC и местным временем при движении в
западном направлении. Значение timezone задается на основе значения
глобальной переменной _timezone (см. раздел _tzset ).
Функция _ftime64 , использующая структуру __timeb64 , позволяет выражать даты
создания файлов до 23:59:59, 31 декабря 3000 г. в формате UTC; в то время как
_ftime32 даты отображаются только до 23:59:59 18 января 2038 г. в формате UTC.

Полночь 1 января 1970 года — нижняя граница диапазона дат для всех этих
функций.

Функция эквивалентна _ftime64 и _timeb содержит 64-разрядное время, если не


_USE_32BIT_TIME_T определено, в этом случае старое поведение действует; _ftime
использует 32-разрядное время и _timeb содержит 32-разрядное _ftime время.

_ftime проверяет свои параметры. Если передан пустой указатель в качестве


timeptr , функция вызывает обработчик недопустимых параметров, как описано в

разделе "Проверка параметров". Если выполнение может быть продолжено, эта


функция задает для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок

_ftime <sys/types.h> и <sys/timeb.h>

_ftime32 <sys/types.h> и <sys/timeb.h>

_ftime64 <sys/types.h> и <sys/timeb.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_ftime.c

// compile with: /W3

// This program uses _ftime to obtain the current

// time and then stores this time in timebuffer.

#include <stdio.h>

#include <sys/timeb.h>

#include <time.h>

int main( void )

struct _timeb timebuffer;

char timeline[26];

errno_t err;

time_t time1;

unsigned short millitm1;

short timezone1;

short dstflag1;

_ftime( &timebuffer ); // C4996

// Note: _ftime is deprecated; consider using _ftime_s instead

time1 = timebuffer.time;

millitm1 = timebuffer.millitm;
timezone1 = timebuffer.timezone;

dstflag1 = timebuffer.dstflag;

printf( "Seconds since midnight, January 1, 1970 (UTC): %I64d\n",

time1);

printf( "Milliseconds: %d\n", millitm1);

printf( "Minutes between UTC and local time: %d\n", timezone1);

printf( "Daylight savings time flag (1 means Daylight time is in "

"effect): %d\n", dstflag1);

err = ctime_s( timeline, 26, & ( timebuffer.time ) );

if (err)

printf("Invalid argument to ctime_s. ");

printf( "The time is %.19s.%hu %s", timeline, timebuffer.millitm,

&timeline[20] );

Output

Seconds since midnight, January 1, 1970 (UTC): 1051553334

Milliseconds: 230

Minutes between UTC and local time: 480

Daylight savings time flag (1 means Daylight time is in effect): 1

The time is Mon Apr 28 11:08:54.230 2003

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

time, _time32, _time64


_ftime_s , _ftime32_s , _ftime64_s
Статья • 03.04.2023

Получает текущее время. Эти функции являются версиями , _ftime32с


усовершенствованиями_ftime безопасности, _ftime64 как описано в функциях
безопасности в CRT.

Синтаксис
C

errno_t _ftime_s( struct _timeb *timeptr );

errno_t _ftime32_s( struct __timeb32 *timeptr );

errno_t _ftime64_s( struct __timeb64 *timeptr );

Параметры
timeptr

Указатель на объект или __timeb32 __timeb64 структуру _timeb .

Возвращаемое значение
Нуль в случае успеха или код ошибки в случае неудачи. Если значение параметра
timeptr равно NULL , возвращаемым значением является EINVAL .

Комментарии
Функция _ftime_s получает текущее местное время и сохраняет его в структуре, на
которую указывает timeptr . Структуры _timeb и __timeb64 , __timeb32 как указано в
файле SYS\Timeb.h, определяются в файле SYS\Timeb.h. Они содержат четыре поля,
которые описываются в следующей таблице.

Поле Описание

dstflag Ненулевое значение, если для местного часового пояса в данный момент
действует летнее время. (См _tzset . объяснение того, как определяется летнее
время.)

millitm Доля секунды в миллисекундах.


Поле Описание

time Время представляется в виде числа секунд, истекших после полуночи (00:00:00)
1 января 1970 года, время в формате UTC.

timezone Разница в минутах между временем UTC и местным временем при движении в
западном направлении. Значение timezone задается на основе значения
глобальной переменной _timezone (см. раздел _tzset ).

Функция _ftime64_s , использующая структуру __timeb64 , позволяет выражать


даты создания файлов до 23:59:59, 31 декабря 3000 г. в формате UTC; в то время как
_ftime32_s представляет только даты до 23:59:59 18 января 2038 г., UTC. Полночь

1 января 1970 года — нижняя граница диапазона дат для всех этих функций.

Функция эквивалентна _ftime64_s и _timeb содержит 64-разрядное время, если


_USE_32BIT_TIME_T не определено, в этом случае старое поведение действует;
_ftime_s использует 32-разрядное время и _timeb содержит 32-разрядное

_ftime_s время.

_ftime_s проверяет свои параметры. Если передано значение NULL,


timeptr функция вызывает обработчик недопустимых параметров, как описано в

разделе "Проверка параметров". Если выполнение может быть продолжено, эта


функция задает для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_ftime_s <sys/types.h> и <sys/timeb.h>

_ftime32_s <sys/types.h> и <sys/timeb.h>

_ftime64_s <sys/types.h> и <sys/timeb.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
C

// crt_ftime64_s.c

// This program uses _ftime64_s to obtain the current

// time and then stores this time in timebuffer.

#include <stdio.h>

#include <sys/timeb.h>

#include <time.h>

int main( void )

struct _timeb timebuffer;

char timeline[26];

errno_t err;

time_t time1;

unsigned short millitm1;

short timezone1;

short dstflag1;

_ftime64_s( &timebuffer );

time1 = timebuffer.time;

millitm1 = timebuffer.millitm;

timezone1 = timebuffer.timezone;

dstflag1 = timebuffer.dstflag;

printf( "Seconds since midnight, January 1, 1970 (UTC): %I64d\n",

time1);

printf( "Milliseconds: %d\n", millitm1);

printf( "Minutes between UTC and local time: %d\n", timezone1);

printf( "Daylight savings time flag (1 means Daylight time is in "

"effect): %d\n", dstflag1);

err = ctime_s( timeline, 26, & ( timebuffer.time ) );

if (err)

printf("Invalid argument to ctime_s. ");

printf( "The time is %.19s.%hu %s", timeline, timebuffer.millitm,

&timeline[20] );

Output

Seconds since midnight, January 1, 1970 (UTC): 1051553334

Milliseconds: 230

Minutes between UTC and local time: 480

Daylight savings time flag (1 means Daylight time is in effect): 1

The time is Mon Apr 28 11:08:54.230 2003

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

time, _time32, _time64


_fullpath , _wfullpath
Статья • 03.04.2023

Создает абсолютный или полный путь для указанного относительного пути.

Синтаксис
C

char *_fullpath(

char *absPath,

const char *relPath,


size_t maxLength

);

wchar_t *_wfullpath(

wchar_t *absPath,

const wchar_t *relPath,

size_t maxLength

);

Параметры
absPath

Указатель на буфер, содержащий абсолютный или полный путь, или значение NULL .

relPath

Относительный путь.

maxLength

Максимальная длина буфера абсолютного пути ( absPath ). Длина указывается в


байтах для _fullpath и в расширенных символах ( wchar_t ) для _wfullpath .

Возвращаемое значение
Каждая из этих функций возвращает указатель на буфер, содержащий абсолютный
путь ( absPath ). Если возникает ошибка (например, если переданное relPath
значение содержит букву диска, которая недопустима или не найдена, или если
длина созданного абсолютного пути ( absPath ) больше maxLength ), функция
возвращает . NULL
Комментарии
Функция _fullpath разворачивает относительный путь из relPath в его полный
или абсолютный путь и сохраняет его в параметре absPath . Если absPath это так
NULL , malloc используется для выделения буфера достаточной длины для хранения
имени пути. Вызывающий объект обязан освободить этот буфер. Имя
относительного пути указывает путь к другому расположению из текущего
расположения (например, текущий рабочий каталог: . ). Абсолютный путь является
расширением относительного пути, которое указывает весь путь, требуемый для
достижения необходимого расположения из корневой папки файловой системы. В
отличие от _makepath этого, _fullpath можно использовать для получения
абсолютного имени пути для относительных путей ( relPath ), которые включают ./
или ../ входят в их имена.

Например, чтобы использовать подпрограммы среды выполнения C, приложение


должно включать файлы заголовков, которые содержат объявления подпрограмм.
Каждая директива файла #include заголовка ссылается на расположение файла
относительно (из рабочего каталога приложения):

#include <stdlib.h>

когда абсолютный путь (реальное расположение в файловой системе) файла может


иметь вид:

\\machine\shareName\msvcSrc\crt\headerFiles\stdlib.h

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Функция _fullpath автоматически требуемым образом обрабатывает аргументы в


виде многобайтовых строк, распознавая многобайтовые последовательности
символов в соответствии с текущей многобайтовой кодовой страницей.
_wfullpath  — это версия функции _fullpath для расширенных символов;

аргументы строки для функции _wfullpath представляют собой строки


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

Если _DEBUG они _CRTDBG_MAP_ALLOC определены и определены, вызовы _fullpath и


_wfullpath заменяются вызовами _fullpath_dbg и _wfullpath_dbg позволяют
выполнять отладку выделения памяти. Дополнительные сведения см. в разделе
_fullpath_dbg. _wfullpath_dbg

Эта функция вызывает обработчик недопустимых параметров, как описано в


проверке параметров, если maxlen значение меньше или равно 0. Если
выполнение может быть продолжено, эта функция задает для errno значение
EINVAL и возвращает NULL .

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE and _MBCS не _MBCS _UNICODE


Обычной определен Определенные Определенные

_tfullpath _fullpath _fullpath _wfullpath

absPath Если буфер имеет значение NULL , _fullpath вызывается malloc для

выделения буфера и пропускает maxLength аргумент. Это ответственность


вызывающего объекта по освобождению этого буфера (с использованием free) в
соответствии с соответствующими параметрами. Если аргумент relPath определяет
диск, текущий каталог этого диска объединяется с путем.

Требования
Компонент Обязательный заголовок

_fullpath <stdlib.h>

_wfullpath <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_fullpath.c

// This program demonstrates how _fullpath

// creates a full path from a partial path.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <direct.h>

void PrintFullPath( char * partialPath )

char full[_MAX_PATH];

if( _fullpath( full, partialPath, _MAX_PATH ) != NULL )

printf( "Full path is: %s\n", full );

else

printf( "Invalid path\n" );

int main( void )

PrintFullPath( "test" );

PrintFullPath( "\\test" );

PrintFullPath( "..\\test" );

Output

Full path is: C:\Documents and Settings\user\My Documents\test

Full path is: C:\test

Full path is: C:\Documents and Settings\user\test

См. также раздел


Обработка файлов

_getcwd, _wgetcwd

_getdcwd, _wgetdcwd

_makepath, _wmakepath

_splitpath, _wsplitpath
_fullpath_dbg , _wfullpath_dbg
Статья • 03.04.2023

_fullpathВерсии , _wfullpath использующие отладочную версию malloc для


выделения памяти.

Синтаксис
C

char *_fullpath_dbg(

char *absPath,

const char *relPath,


size_t maxLength,

int blockType,

const char *filename,

int linenumber

);

wchar_t *_wfullpath_dbg(

wchar_t *absPath,

const wchar_t *relPath,

size_t maxLength,

int blockType,

const char *filename,

int linenumber

);

Параметры
absPath

Указатель на буфер, содержащий абсолютный или полный путь, или значение NULL .

relPath

Относительный путь.

maxLength

Максимальная длина буфера абсолютного пути ( absPath ). Длина указывается в


байтах для _fullpath_dbg и в расширенных символах ( wchar_t ) для _wfullpath_dbg .

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .


filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Каждая функция возвращает указатель на буфер, который содержит абсолютный
путь ( absPath ). Если возникает ошибка (например, если переданное relPath
значение содержит букву диска, которая не является допустимой или не может
быть найдена, или если длина созданного абсолютного имени пути ( absPath )
больше , чем maxLength ), функция возвращает NULL .

Комментарии
_fullpath_dbg Функции и _wfullpath_dbg идентичны _fullpath и _wfullpath за
исключением того, что при _DEBUG определении эти функции используют
отладочную версию malloc , _malloc_dbg для выделения памяти, если NULL
передается в качестве первого параметра. Сведения о функциях отладки
_malloc_dbg см. в разделе _malloc_dbg.

В большинстве случаев не нужно вызывать эти функции явным образом. Вместо


этого можно определить флаг _CRTDBG_MAP_ALLOC . Если определен флаг
_CRTDBG_MAP_ALLOC , вызовы функций _fullpath и _wfullpath повторно
сопоставляются с _fullpath_dbg и _wfullpath_dbg соответственно, а для параметра
blockType задается флаг _NORMAL_BLOCK . Таким образом, вам не нужно вызывать эти
функции явным образом, если вы не хотите пометить блоки кучи как _CLIENT_BLOCK .
Дополнительные сведения см. в разделе Типы блоков в отладочной куче.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные defined

_tfullpath_dbg _fullpath_dbg _fullpath_dbg _wfullpath_dbg


Требования
Компонент Обязательный заголовок

_fullpath_dbg <crtdbg.h>

_wfullpath_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Обработка файлов

_fullpath, _wfullpath

Версии отладки функций выделения кучи


_futime , _futime32 , _futime64
Статья • 03.04.2023

Задает время изменения открытого файла.

Синтаксис
C

int _futime(

int fd,

struct _utimbuf *filetime

);

int _futime32(

int fd,

struct __utimbuf32 *filetime

);

int _futime64(

int fd,

struct __utimbuf64 *filetime

);

Параметры
fd

Дескриптор открытого файла.

filetime

Указатель на структуру, содержащую новую дату изменения.

Возвращаемое значение
Возвращает 0 в случае успеха. При возникновении ошибки вызывается обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение разрешено продолжать, функция возвращает значение -1 и errno
имеет значение EBADF , указывающее недопустимый дескриптор файла или
EINVAL указывающий недопустимый параметр.

Комментарии
Подпрограмма _futime задает дату изменения открытого файла, связанного с fd , а
также время доступа к нему. _futime идентичен _utime, за исключением того, что
его аргумент является дескриптором открытого файла, а не именем файла или
путем к файлу. Структура _utimbuf содержит поля с новой датой изменения и
временем доступа. Оба поля должны содержать допустимые значения. Функции
_utimbuf32 и _utimbuf64 идентичны функции _utimbuf , однако используют 32- и 64-

разрядные типы времени соответственно. Функции _futime и _utimbuf используют


64-разрядный тип времени, и функция _futime по поведению идентична функции
_futime64 . Чтобы применить старое поведение принудительно, определите
_USE_32BIT_TIME_T . В связи с этим функция _futime идентична по поведению

функции _futime32 и задает для структуры _utimbuf использование 32-разрядного


типа времени, что делает ее эквивалентом структуры __utimbuf32 .

Функция _futime64 , которая использует структуру __utimbuf64 , поддерживает


считывание и изменение дат вплоть до 23:59:59 31 декабря 3000 года в формате
UTC. При этом вызов функции _futime32 завершается сбоем, если файл имеет дату
позже 23:59:59 18 января 2038 года в формате UTC. Полночь 1-го января 1970
года — нижняя граница диапазона дат для этих функций.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_futime <sys/utime.h> <errno.h>

_futime32 <sys/utime.h> <errno.h>

_futime64 <sys/utime.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_futime.c

// This program uses _futime to set the

// file-modification time to the current time.

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <io.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/utime.h>

#include <share.h>

int main( void )

int hFile;

// Show file time before and after.

system( "dir crt_futime.c_input" );

_sopen_s( &hFile, "crt_futime.c_input", _O_RDWR, _SH_DENYNO, 0 );

if( _futime( hFile, NULL ) == -1 )

perror( "_futime failed\n" );

else

printf( "File time modified\n" );

_close (hFile);

system( "dir crt_futime.c_input" );

Входные данные: crt_futime.c_input


Input

Arbitrary file contents.

Пример полученных результатов


Output

Volume in drive Z has no label.

Volume Serial Number is 5C68-57C1

Directory of Z:\crt

03/25/2004 10:40 AM 24 crt_futime.c_input

1 File(s) 24 bytes

0 Dir(s) 24,268,476,416 bytes free

Volume in drive Z has no label.

Volume Serial Number is 5C68-57C1


Directory of Z:\crt

03/25/2004 10:41 AM 24 crt_futime.c_input

1 File(s) 24 bytes

0 Dir(s) 24,268,476,416 bytes free

File time modified

См. также раздел


Управление временем
fwide
Статья • 03.04.2023

Не реализовано.

Синтаксис
C

int fwide(

FILE *stream,

int mode;

);

Параметры
stream

Указатель на структуру FILE (игнорируется).

mode

Новая ширина потока: положительное значение для расширенных символов,


отрицательное для байта, ноль, чтобы оставить без изменений. (Это значение
игнорируется.)

Возвращаемое значение
Эта функция в настоящее время просто возвращает mode .

Комментарии
Текущая версия этой функции не соответствует стандарту C.

Требования
Компонент Обязательный заголовок

fwide <wchar.h>

Дополнительные сведения см. в разделе Совместимость.


fwrite
Статья • 03.04.2023

Записывает данные в поток.

Синтаксис
C

size_t fwrite(

const void *buffer,

size_t size,

size_t count,

FILE *stream

);

Параметры
buffer

Указатель на записываемые данные.

size

Размер элемента, в байтах.

count

Максимальное число записываемых элементов.

stream

Указатель на структуру FILE .

Возвращаемое значение
fwrite возвращает количество полных элементов, записываемых функцией,

которое может быть меньше, чем count при возникновении ошибки. Кроме того,
если возникает ошибка, индикатор положения файла не может быть определен.
Если какой-либо stream или buffer является пустым указателем, или если в
режиме Юникода указывается нечетное число байтов, функция вызывает
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, эта функции задает для
errno значение EINVAL и возвращает 0.
Комментарии
Функция fwrite записывает до count элементов (каждый длиной size ) из buffer в
выходной stream . Указатель файла, связанный с stream (если он есть),
увеличивается на количество операций записи в байтах fwrite . Если stream он
открыт в текстовом режиме, каждый веб-канал строки заменяется парой веб-
канала возврата каретки. Замена не влияет на возвращаемое значение.

Если stream открыт в режиме преобразования Юникода (например, если stream


открывается вызовом метода fopen и с помощью параметра режима, который
включает ccs=UNICODE , ccs=UTF-16LE или ccs=UTF-8 , или если режим изменен на
режим преобразования Юникода с помощью _setmode и параметра режима,
который включает _O_WTEXT , _O_U16TEXT или _O_U8TEXT ), buffer интерпретируется
как указатель на массив wchar_t , который содержит данные UTF-16. Попытка
записи нечетного числа байт в этом режиме приводит к возникновению ошибки
проверки параметра.

Так как эта функция блокирует вызывающий поток, он является потокобезопасной.


Сведения о неблокирующей версии см. в описании функции _fwrite_nolock .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

fwrite <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для fread.

См. также раздел


Потоковый ввод-вывод

_setmode

fread

_fwrite_nolock

_write
_fwrite_nolock
Статья • 03.04.2023

Записывает данные в поток без блокирования потока.

Синтаксис
C

size_t _fwrite_nolock(

const void *buffer,

size_t size,

size_t count,

FILE *stream

);

Параметры
buffer

Указатель на данные, которые требуется записать.

size

Размер элемента в байтах.

count

Максимальное число записываемых элементов.

stream

Указатель на структуру FILE .

Возвращаемое значение
Эквивалентно fwrite.

Комментарии
Эта функция представляет собой неблокирующую версию функции fwrite . Он
идентичен fwrite , за исключением того, что он не защищен от вмешательства
другими потоками. Это может быть быстрее, так как это не приводит к
дополнительным издержкам блокировки других потоков. Используйте эту функции
только в потокобезопасных контекстах, например в однопоточных приложениях
или если вызываемая область уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок

_fwrite_nolock <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для fread.

См. также раздел


Потоковый ввод-вывод

fread

_write
gcvt
Статья • 03.04.2023

Имя gcvt функции, зависят от Майкрософт, является устаревшим псевдонимом


_gcvt для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _gcvt или функцию с повышенным


_gcvt_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".
_gcvt
Статья • 03.04.2023

Преобразует значение с плавающей запятой в строку и сохраняет ее в буфер.


Доступна более безопасная версия этой функции; см _gcvt_s.

Синтаксис
C

char *_gcvt(

double value,

int digits,

char *buffer

);

Параметры
value

Преобразуемое значение.

digits

Количество значащих цифр хранятся.

buffer

Место хранения результата.

Возвращаемое значение
_gcvt возвращает указатель на строку разрядов.

Комментарии
Функция _gcvt преобразует значение с плавающей запятой value в строку
символов (включает знак десятичной запятой и при необходимости байт знака) и
сохраняет эту строку в buffer . Длина buffer должна быть достаточной для
хранения преобразованного значения, а также автоматически добавляемого нуль-
символа. Если размер буфера равен digits + 1, функция перезаписывает конец
буфера. Перезапись происходит из-за того, что преобразованная строка включает
десятичную запятую, а также может содержать сведения о знаке и экспоненте.
Функция не учитывает переполнение. Функция _gcvt пытается создать digits
разрядов в десятичном формате. Если не удается, он создает digits цифры в
экспоненциальном формате. Нули в конце могут исключаться из преобразования.

Буфер buffer длиной _CVTBUFSIZE достаточен для любого значения с плавающей


запятой.

Эта функция проверяет свои параметры. В buffer противном NULL случае


вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, эта функция
задает для errno значение EINVAL и возвращает NULL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_gcvt <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_gcvt.c

// compile with: /W3

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

int main( void )

char buffer[_CVTBUFSIZE];

double value = -1234567890.123;

printf( "The following numbers were converted by


_gcvt(value,12,buffer):\n" );

_gcvt( value, 12, buffer ); // C4996

// Note: _gcvt is deprecated; consider using _gcvt_s instead

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

value *= 10;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

value *= 10;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

value *= 10;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

printf( "\n" );

value = -12.34567890123;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

value /= 10;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

value /= 10;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

value /= 10;

_gcvt( value, 12, buffer ); // C4996

printf( "buffer: '%s' (%d chars)\n", buffer, strlen(buffer) );

Output

The following numbers were converted by _gcvt(value,12,buffer):

buffer: '-1234567890.12' (14 chars)

buffer: '-12345678901.2' (14 chars)

buffer: '-123456789012' (13 chars)

buffer: '-1.23456789012e+012' (19 chars)

buffer: '-12.3456789012' (14 chars)

buffer: '-1.23456789012' (14 chars)

buffer: '-0.123456789012' (15 chars)

buffer: '-1.23456789012e-002' (19 chars)

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l

_ecvt

_fcvt
_gcvt_s
Статья • 03.04.2023

Преобразует значение с плавающей запятой в строку. Эта функция является


версией _gcvt с усовершенствованиями безопасности, как описано в функциях
безопасности в CRT.

Синтаксис
C

errno_t _gcvt_s(

char *buffer,

size_t sizeInBytes,

double value,

int digits

);

template <size_t cchStr>

errno_t _gcvt_s(

char (&buffer)[cchStr],

double value,

int digits

); // C++ only

Параметры
buffer

Буфер для сохранения результата преобразования.

sizeInBytes

Размер буфера.

value

Преобразуемое значение.

digits

Количество значащих цифр хранятся.

Возвращаемое значение
Нуль при успешном завершении. Если сбой возникает из-за недопустимого
параметра (см. следующую таблицу для недопустимых значений), обработчик
недопустимых параметров вызывается, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, возвращается код
ошибки. Коды ошибок определяются в файле ERRNO.H. Список этих ошибок см. в
разделе errno, и _doserrno_sys_errlist_sys_nerr.

Условия ошибок

buffer sizeInBytes value digits Возвращает Значение


в buffer

NULL any any any EINVAL Не


изменено.

Не NULL (указывает на нуль any any EINVAL Не


допустимую память) изменено.

Не NULL (указывает на any any >= EINVAL Не


допустимую память) sizeInBytes изменено.

Проблемы с безопасностью

_gcvt_s может создать нарушение доступа, если buffer не указывает на


допустимую память и не является NULL .

Комментарии
Функция _gcvt_s преобразует значение с плавающей запятой value в строку
символов (включает знак десятичной запятой и при необходимости байт знака) и
сохраняет эту строку в buffer . Длина buffer должна быть достаточной для
хранения преобразованного значения, а также автоматически добавляемого нуль-
символа. Буфер длины _CVTBUFSIZE достаточен для любого значения с плавающей
запятой. Если используется размер буфера digits +1, функция не перезаписывает
конец буфера, поэтому не забудьте предоставить достаточный буфер для этой
операции. Функция _gcvt_s пытается создать digits разрядов в десятичном
формате. Если это не удается, он создает digits цифры в экспоненциальном
формате. Нули в конце могут исключаться из преобразования.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".
Отладочная версия этой функции сначала заполняет буфер 0xFE. Чтобы отключить
это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_gcvt_s <stdlib.h> <error.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_gcvt_s.c

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

int main()

char buf[_CVTBUFSIZE];

int decimal;

int sign;

int err;

err = _gcvt_s(buf, _CVTBUFSIZE, 1.2, 5);

if (err != 0)

printf("_gcvt_s failed with error code %d\n", err);

exit(1);

printf("Converted value: %s\n", buf);

Output

Converted value: 1.2

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


atof, _atof_l, _wtof, _wtof_l

_ecvt_s

_fcvt_s

_gcvt
_get_current_locale
Статья • 03.04.2023

Получает объект языкового стандарта, представляющий текущий языковой


стандарт.

Синтаксис
C

_locale_t _get_current_locale(void);

Возвращаемое значение
Объект языкового стандарта, представляющий текущий языковой стандарт.

Комментарии
Функция _get_current_locale получает текущий заданный языковой стандарт для
потока и возвращает объект языкового стандарта, представляющий этот языковой
стандарт.

Предыдущее название данной функции __get_current_locale (с 2 символами


подчеркивания в начале) использовать не рекомендуется.

Требования
Подпрограмма Обязательный заголовок

_get_current_locale <locale.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


setlocale, _wsetlocale

_create_locale, _wcreate_locale

_free_locale
_get_daylight
Статья • 03.04.2023

Получает смещение перехода на зимнее время в часах.

Синтаксис
C

error_t _get_daylight( int* hours );

Параметры
hours

Смещение перехода на зимнее время в часах.

Возвращаемое значение
Нуль в случае успешного выполнения или значение errno при возникновении
ошибки.

Комментарии
Функция _get_daylight получает число часов смещения перехода на зимнее время
в виде целого числа. Если действует переход на зимнее время, смещение по
умолчанию составляет один час (хотя в некоторых регионах может применяться
смещение на два часа).

В противном случае hours NULL вызывается обработчик недопустимых параметров,


как описано в разделе "Проверка параметров". Если выполнение может быть
продолжено, эта функция задает для errno значение EINVAL и возвращает EINVAL .

Эту функцию рекомендуется использовать вместо макроса _daylight или


нерекомендуемой функции __daylight .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок

_get_daylight <time.h>

Дополнительные сведения см. в разделе Совместимость.

См. также раздел


Управление временем

errno, , _doserrno_sys_errlistи_sys_nerr

_get_dstbias

_get_timezone

_get_tzname
_get_doserrno
Статья • 03.04.2023

Возвращает значение ошибки, возвращаемое операционной системой, прежде


чем оно преобразуется в errno значение.

Синтаксис
C

errno_t _get_doserrno(

int * pValue

);

Параметры
pValue

Указатель на целое число, в которое должно быть подставлено текущее значение


глобального макроса _doserrno .

Возвращаемое значение
Если макрос _get_doserrno выполняется успешно, он возвращает значение 0, в
случае сбоя — код ошибки. В pValue противном NULL случае вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, эта функция задает для
errno значение EINVAL и возвращает EINVAL .

Комментарии
Глобальный макрос _doserrno задается равным нулю во время инициализации CRT
(до начала выполнения обработки). Для него задано значение ошибки
операционной системы, возвращаемое вызовом функции на уровне системы,
который возвращает ошибку операционной системы, и он никогда не
сбрасывается до нуля во время выполнения. При написании кода для проверки
значения ошибки, возвращаемого функцией, всегда очищается _doserrno с
помощью _set_doserrno перед вызовом функции. Поскольку другой вызов функции
может перезаписать _doserrno , проверяйте значения, используя _get_doserrno
сразу после вызова функции.

Вместо переносимых кодов ошибок рекомендуется _get_errno _get_doserrno


использовать вместо переносимых кодов ошибок.

Возможные значения _doserrno определяются в <errno.h>.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_get_doserrno <stdlib.h>, <cstdlib> (C++) <errno.h>, <cerrno> (C++)

_get_doserrno является расширением Майкрософт. Дополнительные сведения о


совместимости см. в разделе Compatibility.

См. также раздел


_set_doserrno

errno, , _doserrno_sys_errlistи_sys_nerr
_get_dstbias
Статья • 03.04.2023

Получает смещение перехода на зимнее время в секундах.

Синтаксис
C

error_t _get_dstbias( long* seconds );

Параметры
seconds

Смещение перехода на зимнее время в секундах.

Возвращаемое значение
Нуль в случае успешного выполнения или значение errno при возникновении
ошибки.

Комментарии
Функция _get_dstbias получает число секунд смещения перехода на зимнее время
в виде целого числа. Если действует переход на зимнее время, смещение по
умолчанию составляет 3600 секунд. Это число соответствует одному часу (хотя в
некоторых регионах может применяться смещение на два часа).

В противном seconds случае NULL вызывается обработчик недопустимых


параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, эта функция задает для errno значение EINVAL и
возвращает EINVAL .

Эту функцию рекомендуется использовать вместо макроса _dstbias или


нерекомендуемой функции __dstbias .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_get_dstbias <time.h>

Дополнительные сведения см. в разделе Совместимость.

См. также раздел


Управление временем

errno, _doserrno, _sys_errlistи _sys_nerr

_get_daylight

_get_timezone

_get_tzname
_get_errno
Статья • 03.04.2023

Получает текущее значение глобальной переменной errno.

Синтаксис
C

errno_t _get_errno(

int * pValue

);

Параметры
pValue

Указатель на целое число, в которое должно быть подставлено текущее значение


переменной errno .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае ошибки. В противном
случае pValue NULL вызывается обработчик недопустимых параметров, как описано
в разделе "Проверка параметров". Если выполнение может быть продолжено, эта
функция задает для errno значение EINVAL и возвращает EINVAL .

Комментарии
Возможные значения errno определяются в Errno.h. Кроме того, см errno .
константы.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Пример
C
// crt_get_errno.c

#include <errno.h>

#include <fcntl.h>

#include <io.h>

#include <stdio.h>

#include <sys/stat.h>

int main()

errno_t err;

int pfh;

_sopen_s(&pfh, "nonexistent.file", _O_WRONLY, _SH_DENYNO, _S_IWRITE);

_get_errno(&err);

printf("errno = %d\n", err);

printf("fyi, ENOENT = %d\n", ENOENT);

Output

errno = 2

fyi, ENOENT = 2

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_get_errno <stdlib.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_set_errno

errno, , _doserrno_sys_errlistи_sys_nerr
_get_FMA3_enable , _set_FMA3_enable
Статья • 03.04.2023

Возвращает или задает флаг, указывающий, используются ли трансцендентные


математические функции библиотеки с плавающей запятой инструкции FMA3 в
коде, скомпилированном для платформ X64.

Синтаксис
C

int _set_FMA3_enable(int flag);

int _get_FMA3_enable();

Параметры
flag

Задайте значение 1, чтобы включить реализацию FMA3 трансцендентных


математических функций библиотек с плавающей запятой на платформах X64 или
значение 0 для использования реализаций, которые не используют инструкции
FMA3.

Возвращаемое значение
Значение, отличное от нуля, если включены реализации FMA3 трансцендентных
математических функций библиотек с плавающей запятой. В противном случае —
ноль.

Комментарии
_set_FMA3_enable Используйте функцию, чтобы включить или отключить

использование инструкций FMA3 в трансцендентных математических функциях с


плавающей запятой в библиотеке CRT. Возвращаемое значение отражает
реализацию, используемую после изменения. Если ЦП не поддерживает
инструкции FMA3, эта функция не может включить их в библиотеке, а
возвращаемое значение равно нулю. Используется для _get_FMA3_enable
получения текущего состояния библиотеки. По умолчанию на платформах X64 код
запуска CRT определяет, поддерживает ли ЦП инструкции FMA3 и включает или
отключает реализации FMA3 в библиотеке.

Реализации FMA3 используют различные алгоритмы. Небольшие различия в


результатах вычислений могут наблюдаться при включении или отключении
реализаций FMA3. Различия также могут наблюдаться между компьютерами,
которые выполняют или не поддерживают FMA3. Дополнительные сведения см. в
разделе о проблемах миграции с плавающей запятой.

Требования
Функции _set_FMA3_enable доступны _get_FMA3_enable только в версиях CRT X64.

Подпрограмма Обязательный заголовок

_set_FMA3_enable , _get_FMA3_enable C: <math.h>

C++: <cmath> или <math.h>

Функции _set_FMA3_enable и _get_FMA3_enable функции зависят от корпорации


Майкрософт. Сведения о совместимости см. в разделе Совместимость.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Проблемы при миграции с плавающей запятой
_get_fmode
Статья • 03.04.2023

Получает режим преобразования файла по умолчанию для операций файлового


ввода-вывода.

Синтаксис
C

errno_t _get_fmode(

int * pmode

);

Параметры
pmode

Указатель на целое число, в которое должно быть подставлено значение режима


по умолчанию: _O_TEXT или _O_BINARY .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае ошибки. В противном
случае pmode NULL вызывается обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если выполнение может быть продолжено,
параметр errno устанавливается в значение EINVAL , и функция возвращает
значение EINVAL .

Комментарии
Функция получает значение глобальной переменной _fmode . Эта переменная
определяет режим преобразования файла по умолчанию для потоков операций
низкоуровневого и файлового ввода-вывода, таких как _open , _pipe , fopen и
freopen.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_get_fmode <stdlib.h> <fcntl.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в разделе _set_fmode.

См. также раздел


_fmode

_set_fmode

_setmode

Файловый ввод-вывод в текстовом и двоичном режиме


_get_heap_handle
Статья • 03.04.2023

Возвращает дескриптор кучи, используемый системой времени выполнения C.

Синтаксис
C

intptr_t _get_heap_handle( void );

Возвращаемое значение
Возвращает дескриптор кучи Win32, используемый системой времени выполнения
C.

Комментарии
Используйте эту функцию, если вы хотите вызвать HeapSetInformation и включить
кучу фрагментации с низким уровнем фрагментации в куче CRT.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_get_heap_handle <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Образец
C++

// crt_get_heap_handle.cpp

// compile with: /MT

#include <windows.h>

#include <malloc.h>

#include <stdio.h>

int main(void)

intptr_t hCrtHeap = _get_heap_handle();

ULONG ulEnableLFH = 2;

if (HeapSetInformation((PVOID)hCrtHeap,

HeapCompatibilityInformation,

&ulEnableLFH, sizeof(ulEnableLFH)))

puts("Enabling Low Fragmentation Heap succeeded");

else

puts("Enabling Low Fragmentation Heap failed");

return 0;

См. также раздел


Выделение памяти
_get_invalid_parameter_handler ,
_get_thread_local_invalid_parameter_ha
ndler
Статья • 03.04.2023

Получает функцию, которая вызывается, когда CRT обнаруживает недопустимый


аргумент.

Синтаксис
C

_invalid_parameter_handler _get_invalid_parameter_handler(void);

_invalid_parameter_handler
_get_thread_local_invalid_parameter_handler(void);

Возвращаемое значение
Указатель на установленную в данный момент функцию обработчика
недопустимого параметра или указатель NULL, если такая функция не задана.

Комментарии
Функция _get_invalid_parameter_handler получает установленный на данный
момент глобальный обработчик недопустимого параметра. Если глобальный
обработчик недопустимого параметра не задан, возвращается указатель NULL.
Аналогичным образом получает _get_thread_local_invalid_parameter_handler
текущий обработчик недопустимых параметров в локальном потоке вызываемого
потока или пустой указатель, если обработчик не задан. Сведения о настройке
глобальных и локальных обработчиков недопустимых параметров в потоке см. в
разделе _set_invalid_parameter_handler. _set_thread_local_invalid_parameter_handler

Возвращаемый указатель на функцию обработчика недопустимого параметра


имеет следующий тип:

C
typedef void (__cdecl* _invalid_parameter_handler)(

wchar_t const*,

wchar_t const*,

wchar_t const*,

unsigned int,

uintptr_t

);

Дополнительные сведения о обработчике недопустимых параметров см. в


описании прототипа в _set_invalid_parameter_handler.
_set_thread_local_invalid_parameter_handler

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный
заголовок

_get_invalid_parameter_handler , C: <stdlib.h>

_get_thread_local_invalid_parameter_handler
C++: <cstdlib> или
<stdlib.h>

_get_thread_local_invalid_parameter_handler Эти _get_invalid_parameter_handler

функции зависят от корпорации Майкрософт. Сведения о совместимости см. в


разделе Совместимость.

См. также раздел


_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler

Версии функций CRT повышенной безопасности


_get_osfhandle
Статья • 03.04.2023

Получает дескриптор файла операционной системы, связанный с указанным


дескриптором файла.

Синтаксис
C

intptr_t _get_osfhandle(

int fd

);

Параметры
fd

Дескриптор существующего файла.

Возвращаемое значение
Возвращает дескриптор файла операционной системы, если fd он действителен. В
противном случае вызывается обработчик недопустимых параметров, как описано
в разделе "Проверка параметров". Если выполнение разрешено продолжать,
возвращается INVALID_HANDLE_VALUE значение (–1). Он также задает значение
errno EBADF , указывающее недопустимый дескриптор файла. Чтобы избежать
предупреждения при использовании результата в качестве дескриптора файла
Win32, приведите его к типу HANDLE .

7 Примечание

Если stdin , stdout и stderr не связаны с потоком (например, в приложении


Windows без окна консоли), значения дескриптора файла для этих потоков
возвращаются в _fileno виде специального значения -2. Аналогичным
образом, если в качестве параметра дескриптора файла используется
значение 0, 1 или 2, а не результат вызова _fileno , _get_osfhandle также
возвращается специальное значение -2, если дескриптор файла не связан с
потоком и не задан errno . Однако это не является допустимым значением
дескриптора файла, и последующие вызовы, которые пытаются использовать
его, скорее всего, завершаются ошибкой.

Дополнительные сведения и EBADF другие коды ошибок см. в разделе errno, ,


_doserrnoи _sys_errlist_sys_nerr.

Комментарии
Чтобы закрыть файл, дескриптор которого получает дескриптор
_get_osfhandle операционной системы (OS), вызовите _close дескриптор fd файла.

Никогда не вызывайте CloseHandle возвращаемое значение этой функции. Базовый


дескриптор OS принадлежит дескриптору fd файла и закрывается при _close
вызове fd . Если дескриптор файла принадлежит потоку FILE * , вызов fclose FILE *
этого потока закрывает дескриптор файла и дескриптор базового файла ОС. В этом
случае не вызывайте _close дескриптор файла.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_get_osfhandle <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Обработка файлов

_close

_creat, _wcreat

_dup, _dup2

_open, _wopen

_open_osfhandle
_get_pgmptr
Статья • 03.04.2023

Получает текущее значение глобальной переменной _pgmptr .

Синтаксис
C

errno_t _get_pgmptr(

char **pValue

);

Параметры
pValue

Указатель на строку, которая будет заполнена текущим значением переменной


_pgmptr .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае ошибки. В противном
pValue случае NULL вызывается обработчик недопустимых параметров, как описано
в разделе "Проверка параметров". Если выполнение может быть продолжено, эта
функция задает для errno значение EINVAL и возвращает EINVAL .

Комментарии
Вызов выполняется _get_pgmptr только в том случае, если программа имеет узкую
точку входа, например main() или WinMain(). Глобальная _pgmptr переменная
содержит полный путь к исполняемому файлу, связанному с процессом.
Дополнительные сведения см. в разделе _pgmptr, _wpgmptr.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_get_pgmptr <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_get_wpgmptr
_get_printf_count_output
Статья • 03.04.2023

Указывает, поддерживают ли printfфункции ,_printf_l, wprintf_wprintf_l-family формат


%n.

Синтаксис
C

int _get_printf_count_output();

Возвращаемое значение
Ненулевое значение, если %n поддерживается; 0, если %n не поддерживается.

Комментарии
Если %n параметр не поддерживается (по умолчанию), любой из %n найденных в
строке формата одной из printf функций вызывает обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если %n поддержка
включена (см. см _set_printf_count_output.), то %n ведет себя так, как описано в
синтаксисе спецификации формата: printf и wprintf функции.

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5

округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно


представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Требования
Подпрограмма Обязательный заголовок

_get_printf_count_output <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _set_printf_count_output.

См. также раздел


_set_printf_count_output
_get_purecall_handler ,
_set_purecall_handler
Статья • 03.04.2023

Получает или задает обработчик ошибок для вызова чистой виртуальной функции.

Синтаксис
C++

typedef void (__cdecl* _purecall_handler)(void);

_purecall_handler __cdecl _get_purecall_handler(void);

_purecall_handler __cdecl _set_purecall_handler(

_purecall_handler function

);

Параметры
function

Эту функцию необходимо вызывать при вызове чистой виртуальной функции.


Функция _purecall_handler должна иметь тип возвращаемого значения void.

Возвращаемое значение
Предыдущая функция _purecall_handler . Возвращает nullptr , если не было
предыдущего обработчика.

Комментарии
Функции _get_purecall_handler и _set_purecall_handler предназначены специально
для систем Майкрософт и применяются только к коду C++.

Вызов чистой виртуальной функции является ошибкой, так как она не имеет
реализации. По умолчанию компилятор создает код для вызова функции
обработчика ошибок при вызове чистой виртуальной функции, который завершает
программу. Можно установить собственный обработчик ошибок для вызовов
чистых виртуальных функций, который будет перехватывать их в целях отладки или
ведения отчетности. Чтобы использовать собственный обработчик ошибок,
создайте функцию с сигнатурой _purecall_handler , а затем с помощью
_set_purecall_handler установите ее в качестве текущего обработчика.

Так как для каждого процесса существует только один _purecall_handler , при
вызове _set_purecall_handler он немедленно влияет на все потоки. Последний
вызывающий элемент в любом потоке задает обработчик.

Чтобы восстановить поведение по умолчанию, вызовите функцию


_set_purecall_handler с аргументом nullptr .

Требования
Подпрограмма Обязательный заголовок

_get_purecall_handler , _set_purecall_handler <cstdlib> или <stdlib.h>

Сведения о совместимости см. в разделе Совместимость.

Пример
C++

// _set_purecall_handler.cpp

// compile with: /W1

#include <tchar.h>

#include <stdio.h>

#include <stdlib.h>

class CDerived;

class CBase

public:

CBase(CDerived *derived): m_pDerived(derived) {};

~CBase();

virtual void function(void) = 0;

CDerived * m_pDerived;

};

class CDerived : public CBase

public:

CDerived() : CBase(this) {}; // C4355

virtual void function(void) {};

};

CBase::~CBase()

m_pDerived -> function();

void myPurecallHandler(void)

printf("In _purecall_handler.");

exit(0);

int _tmain(int argc, _TCHAR* argv[])

_set_purecall_handler(myPurecallHandler);

CDerived myDerived;

Output

In _purecall_handler.

См. также раздел


Обработка ошибок

_purecall
_get_terminate
Статья • 03.04.2023

Возвращает подпрограмму завершения, которая будет вызвана функцией


terminate .

Синтаксис
C

terminate_function _get_terminate( void );

Возвращаемое значение
Возвращает указатель на функцию, зарегистрированную .set_terminate Если
функция не задана, возвращаемое значение может использоваться для
восстановления поведения по умолчанию; это значение может быть NULL .

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_get_terminate <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Процедуры обработки исключений

abort

set_unexpected

terminate

unexpected
_get_timezone
Статья • 08.06.2023

Извлекает разницу в секундах между временем в формате UTC и местным


временем.

Синтаксис
C

error_t _get_timezone(

long* seconds

);

Параметры
seconds

Разница в секундах между временем в формате UTC и местным временем.

Возвращаемое значение
Нуль в случае успешного выполнения или значение errno при возникновении
ошибки.

Комментарии
Функция _get_timezone извлекает целое число, представляющее разницу в
секундах между временем UTC и местным временем. Значение по умолчанию —
28800 секунд (тихоокеанское время, на 8 часов отстающее от UTC). Если вы не
хотите использовать значение по умолчанию, сначала вызовите _tzset, чтобы
инициализировать часовой пояс.

Если seconds имеет значение NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, эта функция задает для errno значение EINVAL и возвращает
EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма Обязательный заголовок

_get_timezone <time.h>

Дополнительные сведения см. в разделе Совместимость.

См. также раздел


Управление временем

errno, _doserrno, _sys_errlistи _sys_nerr

_get_daylight

_get_dstbias

_get_tzname
_get_tzname
Статья • 03.04.2023

Извлекает символьные строковые представления имени часового пояса или имени


зоны летнего времени (DST).

Синтаксис
C

errno_t _get_tzname(

size_t* pReturnValue,

char* timeZoneName,

size_t sizeInBytes,

int index

);

Параметры
pReturnValue

Длина строки, включающая timeZoneName NULL признак конца.

timeZoneName

Адрес строки символов, представляющей название часового пояса или название


часового пояса с переходом летнее время (DST), в зависимости от значения index .

sizeInBytes

Размер строки символов timeZoneName в байтах.

index

Одно index из двух имен часовых поясов, которые требуется получить.

index Содержимое timeZoneName Значение timeZoneName по


умолчанию

0 Название часового пояса "PST"

1 Название часового пояса с переходом на "PDT"


летнее время

> 1 или errno имеет значение EINVAL не изменено


<0
Если во время выполнения явно не обновляется, "PST" возвращается для
стандартного часового пояса и "PDT" для летнего часового пояса. Дополнительные
сведения см. в примечаниях.

Строка часового пояса не гарантируется одинаковой между выпусками ОС.


Официальные имена часовых поясов могут изменяться.

Возвращаемое значение
Ноль в случае успешного выполнения; в противном случае — значение типа errno .

timeZoneName Если значение равно NULL sizeInBytes нулю или меньше нуля (но не

равно нулю), вызывается обработчик недопустимых параметров, как описано в


разделе "Проверка параметров". Если выполнение может быть продолжено, эта
функция задает для errno значение EINVAL и возвращает EINVAL .

Условия ошибок

pReturnValue timeZoneName sizeInBytes index Возвращаемое Содержимое


значение timeZoneName

Длина названия NULL 0 0 или 0 не изменено


часового пояса 1

Длина названия any >0 0 или 0 Название


часового пояса 1 часового
пояса

не изменено NULL >0 any EINVAL не изменено

не изменено any нуль any EINVAL не изменено

не изменено any >0 >1 EINVAL не изменено

Комментарии
Функция _get_tzname извлекает символьное строковое представление текущего
имени часового пояса или имя стандартного часового пояса (DST) в адрес
timeZoneName в зависимости от index значения, а также размер строки в

pReturnValue . Если timeZoneName значение равно sizeInBytes NULL нулю, размер


строки в байтах, необходимый для хранения указанного часового пояса и
конца NULL , возвращается в pReturnValue .
Значения index должны иметь значение 0 для стандартного часового пояса или 1
для летнего часового пояса; любые другие значения имеют неопределенные
результаты.

По умолчанию "PST" возвращается для стандартного часового пояса и "PDT" для


летнего часового пояса. Истинное имя часового пояса обновляется при первом
обновлении функции, требующей сведений о часовом поясе, например strftime, ,
ftime, ftime_s, mktimelocaltimeи других. Если функция, которая не требует сведений
о часовом поясе, не вызывается до вызова _get_tzname , значения по умолчанию
возвращаются, если вы не впервые явно обновите их с помощью одной из
упомянутых функций или вызовом tzset. Кроме того, если TZ задана переменная
среды, она имеет приоритет над именем часового пояса, сообщаемым
операционной системой. Даже в этом случае перед вызовом необходимо вызвать
_get_tzname одну из функций, упомянутых выше, или будет возвращено значение

часового пояса по умолчанию. Дополнительные сведения о переменной TZ среды


и CRT см. в разделе _tzset.

2 Предупреждение

Строка часового пояса не гарантируется одинаковой между выпусками ОС.


Официальные имена часовых поясов могут изменяться.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Пример
В этом примере вызывается _get_tzname получение требуемого размера буфера
для отображения текущего имени стандартного часового пояса Daylight,
выделение буфера этого размера, повторные вызовы _get_tzname для загрузки
имени в буфер и его печать в консоль.

Он также вызывает _tzset() , чтобы ОС обновляла сведения о часовом поясе


перед вызовом _get_tzname() . В противном случае используются значения по
умолчанию.

// crt_get_tzname.c

// Compile by using: cl /W4 crt_get_tzname.c

#include <stdio.h>

#include <time.h>

#include <malloc.h>

enum TZindex {

STD,

DST

};

int main()

size_t tznameSize = 0;

char * tznameBuffer = NULL;

_tzset(); // Update the time zone information

// Get the size of buffer required to hold DST time zone name

if (_get_tzname(&tznameSize, NULL, 0, DST))

return 1; // Return an error value if it failed

// Allocate a buffer for the name

if (NULL == (tznameBuffer = (char *)(malloc(tznameSize))))

return 2; // Return an error value if it failed

// Load the name in the buffer

if (_get_tzname(&tznameSize, tznameBuffer, tznameSize, DST))

return 3; // Return an error value if it failed

printf_s("The current Daylight standard time zone name is %s.\n",


tznameBuffer);

return 0;

Выходные данные
Output

The current Daylight standard time zone name is Pacific Daylight Time.

Требования
Подпрограмма Обязательный заголовок

_get_tzname <time.h>
Дополнительные сведения см. в разделе Совместимость.

См. также раздел


Управление временем

errno, , _doserrno_sys_errlistи_sys_nerr

_get_daylight

_get_dstbias

_get_timezone
_get_unexpected
Статья • 03.04.2023

Возвращает подпрограмму завершения, которая будет вызвана функцией


unexpected .

Синтаксис
C

unexpected_function _get_unexpected( void );

Возвращаемое значение
Возвращает указатель на функцию, зарегистрированную .set_unexpected Если
функция не задана, возвращаемое значение может использоваться для
восстановления поведения по умолчанию; это значение может быть NULL .

Требования
Подпрограмма Обязательный заголовок

_get_unexpected <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Процедуры обработки исключений

abort

set_terminate

terminate

unexpected
_get_wpgmptr
Статья • 03.04.2023

Получает текущее значение глобальной переменной _wpgmptr .

Синтаксис
C

errno_t _get_wpgmptr(

wchar_t **pValue

);

Параметры
pValue

Указатель на строку, которая будет заполнена текущим значением переменной


_wpgmptr .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае ошибки. В противном
случае pValue NULL вызывается обработчик недопустимых параметров, как описано
в разделе "Проверка параметров". Если выполнение может быть продолжено, эта
функция задает для errno значение EINVAL и возвращает EINVAL .

Комментарии
Вызов выполняется _get_wpgmptr только в том случае, если программа имеет
широкую точку входа, например wmain() или wWinMain(). Глобальная переменная
_wpgmptr содержит полный путь к исполняемому файлу, связанному с процессом, в

виде строки двухбайтовых знаков. Дополнительные сведения см. в разделе


_pgmptr. _wpgmptr

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_get_wpgmptr <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_get_pgmptr
getc , getwc
Статья • 03.04.2023

Считывает символ из потока.

Синтаксис
C

int getc(

FILE *stream

);

wint_t getwc(

FILE *stream

);

Параметры
stream

Входной поток.

Возвращаемое значение
Возвращает считанный символ. Чтобы указать на ошибку чтения или конец файла,
функция getc возвращает EOF , а getwc возвращает WEOF . Для функции getc
следует использовать ferror или feof для проверки наличия ошибки или
достижения конца файла. Если stream это NULL так, getc и getwc вызовите
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение разрешено продолжать, эти функции возвращают
EOF (или WEOF для getwc ) и задают значение errno EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая подпрограмма считывает один символ из файла в текущей позиции и
увеличивает связанный указатель файла (если он определен), чтобы он указывал на
следующий символ. Файл связан с stream .
Эти функции блокируют вызывающий поток, поэтому они потокобезопасны.
Сведения о версии, отличной от блокировки, см. в разделе _getc_nolock.
_getwc_nolock

Ниже приводятся примечания для конкретных подпрограмм.

Подпрограмма Комментарии

getc То же, что и функция fgetc , однако реализована как функция и как
макрос.

getwc Версия getc для расширенных символов. Считывает многобайтовый или


расширенный символ согласно тому, открыт ли stream в текстовом или
двоичном режиме.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_gettc getc getc getwc

Требования
Подпрограмма Обязательный заголовок

getc <stdio.h>

getwc <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getc.c

// Use getc to read a line from a file.

#include <stdio.h>

int main()

char buffer[81];

int i, ch;

FILE* fp;

// Read a single line from the file "crt_getc.txt".

fopen_s(&fp, "crt_getc.txt", "r");

if (!fp)

printf("Failed to open file crt_getc.txt.\n");

exit(1);

for (i = 0; (i < 80) && ((ch = getc(fp)) != EOF)

&& (ch != '\n'); i++)

buffer[i] = (char) ch;

// Terminate string with a null character

buffer[i] = '\0';

printf( "Input was: %s\n", buffer);

fclose(fp);

Входные данные: crt_getc.txt


Input

Line one.

Line two.

Вывод
Output

Input was: Line one.

См. также
Потоковый ввод-вывод

fgetc, fgetwc

_getch, _getwch
putc, putwc

ungetc, ungetwc
_getc_nolock , _getwc_nolock
Статья • 03.04.2023

Считывает символ из потока.

Синтаксис
C

int _getc_nolock(

FILE *stream

);

wint_t _getwc_nolock(

FILE *stream

);

Параметры
stream

Входной поток.

Возвращаемое значение
getwcСм.getc

Комментарии
Эти функции идентичны getc и getwc за исключением того, что они не блокируют
вызывающий поток. Они могут быть быстрее, так как они не несут накладных
расходов на блокировку других потоков. Используйте эти функции только в
потокобезопасных контекстах, например в однопоточных приложениях или если
вызываемая область уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста


Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_gettc_nolock getc_nolock getc_nolock getwc_nolock

Требования
Подпрограмма Обязательный заголовок

getc_nolock <stdio.h>

getwc_nolock <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getc_nolock.c

// Use getc to read a line from a file.

#include <stdio.h>

int main()

char buffer[81];

int i, ch;

FILE* fp;

// Read a single line from the file "crt_getc_nolock.txt".

fopen_s(&fp, "crt_getc_nolock.txt", "r");

if (!fp)

printf("Failed to open file crt_getc_nolock.txt.\n");

exit(1);

for (i = 0; (i < 80) && ((ch = getc(fp)) != EOF)

&& (ch != '\n'); i++)

buffer[i] = (char) ch;

// Terminate string with a null character

buffer[i] = '\0';

printf( "Input was: %s\n", buffer);

fclose(fp);

Входные данные: crt_getc_nolock.txt


Input

Line the first.

Line the second.

Вывод
Output

Input was: Line the first.

См. также
Потоковый ввод-вывод

fgetc, fgetwc

_getch, _getwch
putc, putwc

ungetc, ungetwc
getch
Статья • 03.04.2023

Имя getch функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _getch функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _getch . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_getch , _getwch
Статья • 10.03.2023

Получает символ из консоли без отображения.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _getch( void );

wint_t _getwch( void );

Возвращаемое значение
Возвращает считанный символ. Ошибка не возвращается.

Комментарии
Функции _getch и _getwch считывают один символ из консоли без повтора
символа. Для чтения функциональной клавиши или клавиши со стрелками каждая
функция должна вызываться дважды. Первый вызов возвращает 0 или 0xE0 .
Второй вызов возвращает код сканирования ключа.

Эти функции блокируют вызывающий поток и поэтому являются потокобезопасны.


Сведения о версиях без блокировки см. в разделе _getch_nolock, _getwch_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста


Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_gettch _getch _getch _getwch

Требования
Подпрограмма Обязательный заголовок

_getch <conio.h>

_getwch <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getch.c

// compile with: /c

// This program reads characters from

// the keyboard until it receives a 'Y' or 'y'.

#include <conio.h>

#include <ctype.h>

int main( void )

int ch;

_cputs( "Type 'Y' when finished typing keys: " );

do

ch = _getch();

ch = toupper( ch );

} while( ch != 'Y' );

_putch( ch );

_putch( '\r' ); // Carriage return

_putch( '\n' ); // Line feed

Input

abcdefy

Output

Type 'Y' when finished typing keys: Y

См. также раздел


Ввод-вывод на консоль и порт

_getche, _getwche

_cgets, _cgetws

getc, getwc

_ungetch, _ungetwch, _ungetch_nolock, _ungetwch_nolock


_getch_nolock , _getwch_nolock
Статья • 03.04.2023

Получает символ из консоли без отображения, не блокируя поток.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _getch_nolock( void );

wint_t _getwch_nolock( void );

Возвращаемое значение
Возвращает считанный символ. Ошибка не возвращается.

Комментарии
Функции _getch_nolock и _getwch_nolock идентичны функциям _getch и _getchw за
исключением того, что не защищены от помех со стороны других потоков. Они
могут быть быстрее, так как они не несут накладных расходов на блокировку
других потоков. Используйте эти функции только в потокобезопасных контекстах,
например в однопоточных приложениях или если вызываемая область уже
обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста


Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_gettch_nolock _getch_nolock _getch_nolock _getwch_nolock

Требования
Подпрограмма Обязательный заголовок

_getch_nolock <conio.h>

_getwch_nolock <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getch_nolock.c

// compile with: /c

// This program reads characters from

// the keyboard until it receives a 'Y' or 'y'.

#include <conio.h>

#include <ctype.h>

int main( void )

int ch;

_cputs( "Type 'Y' when finished typing keys: " );

do

ch = _getch_nolock();

ch = toupper( ch );

} while( ch != 'Y' );

_putch_nolock( ch );

_putch_nolock( '\r' ); // Carriage return

_putch_nolock( '\n' ); // Line feed

Input

abcdefy

Output

Type 'Y' when finished typing keys: Y

См. также раздел


Ввод-вывод на консоль и порт

_getche, _getwche

_cgets, _cgetws

getc, getwc

_ungetch, _ungetwch, _ungetch_nolock, _ungetwch_nolock


getchar , getwchar
Статья • 03.04.2023

Считывает символ из стандартного входного потока.

Синтаксис
C

int getchar();

wint_t getwchar();

Возвращаемое значение
Возвращает считанный символ. Эти функции ожидают ввода и не возвращаются,
пока не будут доступны входные данные.

Чтобы указать на ошибку чтения или конец файла, функция getchar возвращает
EOF , а getwchar возвращает WEOF . Для функции getchar следует использовать

ferror или feof для проверки наличия ошибки или достижения конца файла.

Комментарии
Каждая подпрограмма считывает один символ из stdin и увеличивает связанный
указатель файла, чтобы он указывал на следующий символ. getchar то же самое,
что _fgetcharи функция, но реализована как функция и макрос.

Эти функции также блокируют вызывающий поток и являются потокобезопасными.


Сведения о версии, отличной от блокировки, см. в разделе_getchar_nolock .
_getwchar_nolock

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные
TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_gettchar getchar getchar getwchar

Требования
Подпрограмма Обязательный заголовок

getchar <stdio.h>

getwchar <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потоков, stdin stdout связанные с консолью, и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C могут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_getchar.c

// Use getchar to read a line from stdin.

#include <stdio.h>

int main()

char buffer[81];

int i, ch;

for (i = 0; (i < 80) && ((ch = getchar()) != EOF)

&& (ch != '\n'); i++)

buffer[i] = (char) ch;

// Terminate string with a null character

buffer[i] = '\0';

printf( "Input was: %s\n", buffer);

Output
This textInput was: This text

См. также раздел


Потоковый ввод-вывод

getc, getwc

fgetc, fgetwc

_getch, _getwch
putc, putwc

ungetc, ungetwc
_getchar_nolock , _getwchar_nolock
Статья • 03.04.2023

Считывает символ из стандартного входного потока.

Синтаксис
C

int _getchar_nolock( void );

wint_t _getwchar_nolock( void );

Возвращаемое значение
getwcharСм.getchar

Комментарии
_getchar_nolock они идентичны getchar и _getwchar_nolock getwchar за
исключением того, что они не защищены от помех другими потоками. Они могут
быть быстрее, так как они не несут накладных расходов на блокировку других
потоков. Используйте эти функции только в потокобезопасных контекстах,
например в однопоточных приложениях или если вызываемая область уже
обрабатывает изоляцию потоков.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_gettchar_nolock _getchar_nolock _getchar_nolock _getwchar_nolock

Требования
Подпрограмма Обязательный заголовок

_getchar_nolock <stdio.h>
Подпрограмма Обязательный заголовок

_getwchar_nolock <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью, stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_getchar_nolock.c

// Use _getchar_nolock to read a line from stdin.

#include <stdio.h>

int main()

char buffer[81];

int i, ch;

for (i = 0; (i < 80) && ((ch = _getchar_nolock()) != EOF)

&& (ch != '\n'); i++)

buffer[i] = (char) ch;

// Terminate string with a null character

buffer[i] = '\0';

printf( "Input was: %s\n", buffer);

Output

This textInput was: This text

См. также раздел


Потоковый ввод-вывод

getc, getwc

fgetc, fgetwc

_getch, _getwch
putc, putwc

ungetc, ungetwc
getche
Статья • 03.04.2023

Имя getche функции, зависят от Майкрософт, является устаревшим псевдонимом


_getche для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _getche . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_getche , _getwche
Статья • 03.04.2023

Получает символ из консоли с отображением.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _getche( void );

wint_t _getwche( void );

Возвращаемое значение
Возвращает считанный символ. Ошибка не возвращается.

Комментарии
Функции _getche и _getwche считывают отдельный символ из консоли с
отображением, то есть символ выводится в консоли. Эти функции нельзя
использовать для считывания сочетания CTRL+C. При _getche чтении _getwche
клавиши функции или клавиши со стрелкой функция должна вызываться дважды;
первый вызов возвращает значение 0 или 0xE0, а второй вызов возвращает
фактический код ключа.

Эти функции блокируют вызывающий поток, поэтому они потокобезопасны.


Сведения о версиях без блокировки см. в разделе _getche_nolock, _getwche_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.
Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_gettche _getche _getche _getwche

Требования
Подпрограмма Обязательный заголовок

_getche <conio.h>

_getwche <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getche.c

// compile with: /c

// This program reads characters from

// the keyboard until it receives a 'Y' or 'y'.

#include <conio.h>

#include <ctype.h>

int main( void )

int ch;

_cputs( "Type 'Y' when finished typing keys: " );

do

ch = _getche();

ch = toupper( ch );

} while( ch != 'Y' );

_putch( ch );

_putch( '\r' ); // Carriage return

_putch( '\n' ); // Line feed

Input
abcdefy

Output

Type 'Y' when finished typing keys: abcdefyY

См. также раздел


Ввод-вывод на консоль и порт

_cgets, _cgetws

getc, getwc

_ungetch, _ungetwch, _ungetch_nolock, _ungetwch_nolock


_getche_nolock , _getwche_nolock
Статья • 03.04.2023

Получает символ из консоли с отображением, не блокируя поток.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _getche_nolock( void );

wint_t _getwche_nolock( void );

Возвращаемое значение
Возвращает считанный символ. Ошибка не возвращается.

Комментарии
Функции _getche_nolock и _getwche_nolock идентичны функциям _getche и
_getwche за исключением того, что не защищены от помех со стороны других
потоков. Они могут быть быстрее, так как они не влечет за собой затраты на
блокировку других потоков. Используйте эти функции только в потокобезопасных
контекстах, например в однопоточных приложениях или если вызываемая область
уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_gettche_nolock _getche_nolock _getch_nolock _getwche_nolock

Требования
Подпрограмма Обязательный заголовок

_getche_nolock <conio.h>

_getwche_nolock <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getche_nolock.c

// compile with: /c

// This program reads characters from

// the keyboard until it receives a 'Y' or 'y'.

#include <conio.h>

#include <ctype.h>

int main( void )

int ch;

_cputs( "Type 'Y' when finished typing keys: " );

do

ch = _getche_nolock();

ch = toupper( ch );

} while( ch != 'Y' );

_putch_nolock( ch );

_putch_nolock( '\r' ); // Carriage return

_putch_nolock( '\n' ); // Line feed

Input

abcdefy

Output

Type 'Y' when finished typing keys: abcdefyY

См. также раздел


Ввод-вывод на консоль и порт

_cgets, _cgetws

getc, getwc

_ungetch, _ungetwch, _ungetch_nolock, _ungetwch_nolock


getcwd
Статья • 03.04.2023

Имя getcwd функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом _getcwd для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _getcwd . Или вы можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделах Отключение предупреждений и Имена функций POSIX.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_getcwd , _wgetcwd
Статья • 03.04.2023

Возвращает текущий рабочий каталог.

Синтаксис
C

char *_getcwd(

char *buffer,

int maxlen

);

wchar_t *_wgetcwd(

wchar_t *buffer,

int maxlen

);

Параметры
buffer

Место хранения пути.

maxlen

Максимальная длина пути в символах: char для _getcwd и wchar_t для _wgetcwd .

Возвращаемое значение
Возвращает указатель на buffer . Возвращаемое NULL значение указывает на
ошибку и errno имеет значение ENOMEM , указывающее, что недостаточно памяти
для выделения maxlen байтов (при указании аргумента NULL в качестве buffer ) или
ERANGE в значение , указывающее, что путь длиннее maxlen символов. Если maxlen
значение меньше нуля или равно нулю, эта функция вызывает обработчик
недопустимых параметров, как описано в разделе "Проверка параметров".

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Функция _getcwd получает полный путь текущего рабочего каталога для диска по
умолчанию и сохраняет его в параметре buffer . Целочисленный аргумент maxlen
указывает максимальную длину пути. Ошибка возникает, если длина пути (включая
завершающий нуль-символ) превышает значение maxlen . Аргумент buffer может
иметь значение NULL . С помощью malloc автоматически выделяется буфер
минимального размера maxlen (больше только при необходимости) для
сохранения пути. Позже этот буфер можно освободить путем вызова free и
передачи в него возвращаемого значения _getcwd (указателя на выделенный
буфер).

_getcwd возвращает строку, представляющую путь к текущему рабочему каталогу.

Если текущий рабочий каталог является корневым, строка заканчивается обратной


косой чертой ( \ ). Если текущий рабочий каталог отличается от корневого, строка
заканчивается именем каталога, а не обратной косой чертой.

_wgetcwd — это версия с расширенными символами для _getcwd ; аргумент buffer и


возвращаемое значение _wgetcwd являются строками с расширенными символами.
Поведение _wgetcwd и _getcwd идентично в противном случае.

Когда _DEBUG и _CRTDBG_MAP_ALLOC когда они определены, вызовы _getcwd и


_wgetcwd заменяются вызовами _getcwd_dbg и _wgetcwd_dbg позволяют выполнять

отладку выделения памяти. Дополнительные сведения см. в разделе _getcwd_dbg.


_wgetcwd_dbg

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tgetcwd _getcwd _getcwd _wgetcwd

Требования
Подпрограмма Обязательный заголовок

_getcwd <direct.h>

_wgetcwd <direct.h> или <wchar.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getcwd.c

// Compile with: cl /W4 crt_getcwd.c

// This program places the name of the current directory in the

// buffer array, then displays the name of the current directory

// on the screen. Passing NULL as the buffer forces getcwd to allocate

// memory for the path, which allows the code to support file paths

// longer than _MAX_PATH, which are supported by NTFS.

#include <direct.h> // _getcwd

#include <stdlib.h> // free, perror

#include <stdio.h> // printf

#include <string.h> // strlen

int main( void )

char* buffer;

// Get the current working directory:

if ( (buffer = _getcwd( NULL, 0 )) == NULL )

perror( "_getcwd error" );

else

printf( "%s \nLength: %zu\n", buffer, strlen(buffer) );

free(buffer);

Output

C:\Code

См. также раздел


Управление каталогами

_chdir, _wchdir

_mkdir, _wmkdir

_rmdir, _wrmdir
_getcwd_dbg , _wgetcwd_dbg
Статья • 03.04.2023

Отладочные версии _getcwdфункций , _wgetcwd (доступны только во время


отладки).

Синтаксис
C

char *_getcwd_dbg(

char *buffer,

int maxlen,

int blockType,

const char *filename,

int linenumber

);

wchar_t *_wgetcwd_dbg(

wchar_t *buffer,

int maxlen,

int blockType,

const char *filename,

int linenumber

);

Параметры
buffer

Место хранения пути.

maxlen

Максимальная длина пути в символах: char для _getcwd_dbg и wchar_t для


_wgetcwd_dbg .

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Возвращает указатель на buffer . Возвращаемое NULL значение указывает на
ошибку и errno имеет значение ENOMEM , указывающее, что недостаточно памяти
для выделения maxlen байтов (если NULL аргумент указан как buffer ), или
ERANGE значение , указывающее, что путь длиннее maxlen символов.

Дополнительные сведения см. в разделах errno, _doserrno, _sys_errlistи _sys_nerr.

Комментарии
_getcwd_dbg Функции и _wgetcwd_dbg идентичны _getcwd функциям и _wgetcwd , за
исключением того, что при _DEBUG определении они используют отладочную
версию malloc и для _malloc_dbg выделения памяти, если NULL передается в
качестве первого параметра. Для получения дополнительной информации см.
_malloc_dbg.

В большинстве случаев не нужно вызывать эти функции явным образом. Вместо


этого можно определить флаг _CRTDBG_MAP_ALLOC . Если определен флаг
_CRTDBG_MAP_ALLOC , вызовы функций _getcwd и _wgetcwd повторно сопоставляются с
_getcwd_dbg и _wgetcwd_dbg соответственно, а для параметра blockType задается

флаг _NORMAL_BLOCK . Таким образом, вам не нужно вызывать эти функции явным
образом, если вы не хотите пометить блоки кучи как _CLIENT_BLOCK .
Дополнительные сведения см. в разделе Типы блоков в отладочной куче.

Сопоставление подпрограмм с
универсальным текстом
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные defined

_tgetcwd_dbg _getcwd_dbg _getcwd_dbg _wgetcwd_dbg

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_getcwd_dbg <crtdbg.h>

_wgetcwd_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_getcwd, _wgetcwd

Управление каталогами

Версии отладки функций выделения кучи


_getdcwd , _wgetdcwd
Статья • 03.04.2023

Получает полный путь текущей рабочей папки на указанном диске.

Синтаксис
C

char *_getdcwd(

int drive,

char *buffer,

int maxlen

);

wchar_t *_wgetdcwd(

int drive,

wchar_t *buffer,

int maxlen

);

Параметры
drive

Неотрицательное целое число, которое определяет диск (0 — диск по умолчанию,


1 — A, 2 — B и т. д.).

Если указанный диск недоступен, вызывается обработчик недопустимых


параметров. Он также вызывается, если не удается определить тип диска
(например, съемный, фиксированный, компакт-диск, ОЗУ или сетевой диск).
Дополнительные сведения см. в разделе "Проверка параметров".

buffer

Расположение хранилища для пути или NULL .

Если NULL задано, эта функция выделяет буфер по крайней мере maxlen размера с
помощью malloc , а возвращаемое значение _getdcwd является указателем на
выделенный буфер. Буфер может быть освобожден с помощью вызова функции
free и передачи ему указателя.

maxlen

Отличное от нуля положительное целое число, определяющее максимальную


длину пути, в символах: char для функции _getdcwd и wchar_t для функции
_wgetdcwd .

Если maxlen значение меньше нуля или равно нулю, вызывается обработчик
недопустимых параметров. Дополнительные сведения см. в разделе "Проверка
параметров".

Возвращаемое значение
Указатель на строку, которая представляет полный путь текущей рабочей папки на
указанном диске, или значение NULL , что указывает на ошибку.

Если buffer задано значение "как NULL " и недостаточно памяти для выделения
maxlen символов, возникает ошибка и errno задано значение ENOMEM . Если длина

пути, включая завершающий символ NULL, превышается, возникает maxlen ошибка


и errno имеет значение ERANGE . Дополнительные сведения об этих кодах ошибок
см. в разделе errno, _doserrnoи _sys_errlist_sys_nerr.

Комментарии
Функция _getdcwd получает полный путь текущей рабочей папки на указанном
диске и сохраняет его в параметре buffer . Если текущей рабочей папкой является
корневой каталог, строка заканчивается обратной косой чертой (\). Если текущая
рабочая папка находится в каталоге, отличном от корневого, строка заканчивается
именем каталога, а не обратной косой чертой.

_wgetdcwd — это версия функции _getdcwd для расширенных символов, ее параметр

buffer и возвращаемое значение представляют собой строки расширенных


символов. В противном случае поведение _wgetdcwd и _getdcwd идентично.

Эта функция является потокобезопасной, несмотря на то, что она зависит от


GetFullPathName того, от чего сама по себе не является потокобезопасной. Однако

вы можете нарушить безопасность потоков, если многопоточное приложение


вызывает как эту функцию, так и GetFullPathName.

Версия этой функции, которая имеет _nolock суффикс, ведет себя идентично этой
функции, за исключением того, что она не является потокобезопасной и не
защищена от вмешательства другими потоками. Дополнительные сведения см. в
разделе _getdcwd_nolock. _wgetdcwd_nolock
Когда _DEBUG и _CRTDBG_MAP_ALLOC определяются, вызовы _getdcwd и _wgetdcwd
заменяются вызовами _getdcwd_dbg и _wgetdcwd_dbg , чтобы можно было
отлаживать выделение памяти. Дополнительные сведения см. в
разделе_getdcwd_dbg_wgetdcwd_dbg .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tgetdcwd _getdcwd _getdcwd _wgetdcwd

Требования
Подпрограмма Обязательный заголовок

_getdcwd <direct.h>

_wgetdcwd <direct.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в разделе _getdrive.

См. также раздел


Управление каталогами

_chdir, _wchdir

_getcwd, _wgetcwd

_getdrive

_mkdir, _wmkdir

_rmdir, _wrmdir
_getdcwd_dbg , _wgetdcwd_dbg
Статья • 03.04.2023

Отладочные версии _getdcwdфункций ( _wgetdcwd доступны только во время


отладки).

Синтаксис
C

char *_getdcwd_dbg(

int drive,

char *buffer,

int maxlen,

int blockType,

const char *filename,

int linenumber

);

wchar_t *_wgetdcwd_dbg(

int drive,

wchar_t *buffer,

int maxlen,

int blockType,

const char *filename,

int linenumber

);

Параметры
drive

Имя диска.

buffer

Место хранения пути.

maxlen

Максимальная длина пути в символах: char для _getdcwd_dbg и wchar_t для


_wgetdcwd_dbg .

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .


filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Возвращает указатель на buffer . Возвращаемое NULL значение указывает на
ошибку и errno имеет значение ENOMEM , указывающее, что недостаточно памяти
для выделения maxlen байтов (если NULL аргумент указан как buffer ), или
ERANGE значение , указывающее, что путь длиннее maxlen символов.
Дополнительные сведения см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функции _getdcwd_dbg и _wgetdcwd_dbg идентичны _getdcwd и _wgetdcwd за
исключением того, что если определен флаг _DEBUG , эти функции используют
отладочную версию функций malloc и _malloc_dbg для выделения памяти, если
NULL передается как параметр buffer . Для получения дополнительной

информации см. _malloc_dbg.

В большинстве случаев не нужно вызывать эти функции явным образом. Вместо


этого можно определить флаг _CRTDBG_MAP_ALLOC . Если определен флаг
_CRTDBG_MAP_ALLOC , вызовы функций _getdcwd и _wgetdcwd повторно сопоставляются
с _getdcwd_dbg и _wgetdcwd_dbg соответственно, а для параметра blockType задается
флаг _NORMAL_BLOCK . Таким образом, вам не нужно вызывать эти функции явным
образом, если вы не хотите пометить блоки кучи как _CLIENT_BLOCK .
Дополнительные сведения см. в разделе Типы блоков в отладочной куче.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные defined

_tgetdcwd_dbg _getdcwd_dbg _getdcwd_dbg _wgetdcwd_dbg


Требования
Подпрограмма Обязательный заголовок

_getdcwd_dbg <crtdbg.h>

_wgetdcwd_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_getdcwd, _wgetdcwd

Управление каталогами

Версии отладки функций выделения кучи


_getdcwd_nolock , _wgetdcwd_nolock
Статья • 03.04.2023

Получает полный путь текущей рабочей папки на указанном диске.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *_getdcwd_nolock(

int drive,

char *buffer,

int maxlen

);

wchar_t *_wgetdcwd_nolock(

int drive,

wchar_t *buffer,

int maxlen

);

Параметры
drive

Дисковый накопитель.

buffer

Место хранения пути.

maxlen

Максимальная длина пути в символах: char для _getdcwd_nolock и wchar_t для


_wgetdcwd_nolock .

Возвращаемое значение
См. a0/_wgetdcwd>_getdcwd.

Комментарии
_getdcwd_nolock и _wgetdcwd_nolock идентичны _getdcwd _wgetdcwd и соответственно,

за исключением того, что они не защищены от помех другими потоками. Они


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

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tgetdcwd_nolock _getdcwd_nolock _getdcwd_nolock _wgetdcwd_nolock

Требования
Подпрограмма Обязательный заголовок

_getdcwd_nolock <direct.h>

_wgetdcwd_nolock <direct.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Управление каталогами

_chdir, _wchdir

_getcwd, _wgetcwd

_getdrive

_mkdir, _wmkdir

_rmdir, _wrmdir
_getdiskfree
Статья • 03.04.2023

Получите сведения о диске, например об общем объеме кластеров, доступных


кластерах, секторах на кластер и байтах на сектор.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned _getdiskfree(

unsigned drive,

struct _diskfree_t * driveinfo

);

Параметры
drive

Диск, для которого требуются сведения.

driveinfo

Структура _diskfree_t , которая будет заполнена сведениями о диске.

Возвращаемое значение
Если вызов функции заканчивается удачно, возвращается нулевое значение. Если
функция завершается с ошибкой, возвращается значение кода ошибки. Значение
параметра errno задается для всех ошибок, возвращаемых операционной
системой. Дополнительные сведения об ошибках, указанных в errno errno
константах.

Комментарии
Структура _diskfree_t определена в файле Direct.h.

struct _diskfree_t {

unsigned total_clusters; // The total number of clusters, both used


and available, on the disk.

unsigned avail_clusters; // The number of unused clusters on the


disk.

unsigned sectors_per_cluster; // The number of sectors in each cluster.

unsigned bytes_per_sector; // The size of each sector in bytes.

};

Эта функция проверяет свои параметры. driveinfo Если указатель или NULL drive
указывает недопустимый диск, эта функция вызывает обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, функция возвращает EINVAL и устанавливает для
параметра errno значение EINVAL . Допустимый диапазон дисков: от 0 до 26.
Значение drive , равное 0, означает текущий диск; таким образом, числа
сопоставляются с буквами английского алфавита, при этом 1 указывает на диск А,
3 — на диск C и т. д.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_getdiskfree <direct.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getdiskfree.c

// compile with: /c

#include <windows.h>

#include <direct.h>

#include <stdio.h>

int main(int argc, char* argv[])

ULONG uDriveMask = _getdrives();

for (unsigned uDrive = 1; uDrive <= 26; ++uDrive)

if (uDriveMask & 1)

struct _diskfree_t df = { 0 };

unsigned uErr = _getdiskfree(uDrive, &df);

printf("\nDrive: %c\n", uDrive + 'A' - 1);

if (uErr == 0)

printf("\tTotal clusters: %11u\n", df.total_clusters);

printf("\tAvailable clusters: %11u\n", df.avail_clusters);

printf("\tSectors per cluster: %11u\n",


df.sectors_per_cluster);

printf("\tBytes per sector: %11u\n",


df.bytes_per_sector);

else

WCHAR errMsg[80];
unsigned uLen = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
NULL,

uErr, 0, errMsg, sizeof(errMsg), NULL);

printf("%S\n", errMsg);

uDriveMask >>= 1;

Output

Drive: C

Total clusters: 249754111

Available clusters: 160184686

Sectors per cluster: 8

Bytes per sector: 512

См. также раздел


Управление каталогами
_getdrive
Статья • 03.04.2023

Получает текущий диск.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _getdrive( void );

Возвращаемое значение
Возвращает текущий (используемый по умолчанию) диск (1=A, 2=B и т. д).
Возвращаемое значение равно нулю означает, что текущий путь не начинается с
имени диска буквы, например UNC-пути. Или это означает, что сбой выделения
внутреннего буфера. Если внутреннее выделение завершается ошибкой, errno
устанавливается значение ENOMEM.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_getdrive <direct.h>
Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getdrive.c

// compile with: /c

// Illustrates drive functions including:

// _getdrive _chdrive _getdcwd

//

#include <stdio.h>

#include <direct.h>

#include <stdlib.h>

#include <ctype.h>

int main( void )

int ch, drive, curdrive;

static char path[_MAX_PATH];

// Save current drive.

curdrive = _getdrive();

printf( "Available drives are:\n" );

// If we can switch to the drive, it exists.

for( drive = 1; drive <= 26; drive++ )

if( !_chdrive( drive ) )

printf( "%c:", drive + 'A' - 1 );

if( _getdcwd( drive, path, _MAX_PATH ) != NULL )

printf( " (Current directory is %s)", path );

putchar( '\n' );

// Restore original drive.

_chdrive( curdrive );

Output

Available drives are:

A: (Current directory is A:\)

C: (Current directory is C:\)

E: (Current directory is E:\testdir\bin)

F: (Current directory is F:\)

G: (Current directory is G:\)

См. также раздел


Управление каталогами

_chdrive

_getcwd, _wgetcwd

_getdcwd, _wgetdcwd
_getdrives
Статья • 03.04.2023

Возвращает битовую маску, которая представляет доступные в данный момент


диски.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned long _getdrives( void );

Возвращаемое значение
Если функция завершается успешно, возвращенное значение является битовой
маской, которая представляет доступные в данный момент диски. Битовое
положение 0 (наименьший бит) представляет диск A. Аналогичным образом
битовое положение 1 представляет диск B, битовое положение 2 представляет
диск C и т. д. Если функция выполняется неудачно, возвращается нулевое значение.
Чтобы получить расширенные сведения об ошибке, вызовите функцию
GetLastError .

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_getdrives <direct.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getdrives.c

// This program retrieves and lists out

// all the logical drives that are

// currently mounted on the machine.

#include <windows.h>

#include <direct.h>

#include <stdio.h>

#include <tchar.h>

TCHAR g_szDrvMsg[] = _T("A:\n");

int main(int argc, char* argv[]) {

ULONG uDriveMask = _getdrives();

if (uDriveMask == 0)
{

printf( "_getdrives() failed with failure code: %d\n",

GetLastError());

else

printf("The following logical drives are being used:\n");

while (uDriveMask) {

if (uDriveMask & 1)

printf(g_szDrvMsg);

++g_szDrvMsg[0];

uDriveMask >>= 1;

Output

The following logical drives are being used:

A:

C:

D:

E:

См. также раздел


Управление каталогами
getenv , _wgetenv
Статья • 03.04.2023

Получает значение из текущей среды. Доступны более безопасные версии этих


функций; См. разделgetenv_s , _wgetenv_s.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *getenv(

const char *varname

);

wchar_t *_wgetenv(

const wchar_t *varname

);

Параметры
varname

Имя переменной среды.

Возвращаемое значение
Возвращает указатель на запись таблицы среды, содержащую varname . Изменять
значение переменной среды с помощью возвращенного указателя небезопасно.
Чтобы изменить значение переменной среды, используйте функцию _putenv.
Возвращаемое значение равно , NULL если varname не найдено в таблице среды.

Комментарии
Функция getenv выполняет поиск в списке переменных среды для varname . getenv
не учитывает регистр в операционной системе Windows. Функции getenv и _putenv
для доступа к среде используют копию среды, указанную в глобальной
переменной _environ . Функция getenv работает только в структурах данных,
доступных в библиотеке времени выполнения, а не в "сегменте" среды, созданном
для процесса операционной системой. Таким образом, программы, использующие
envp аргумент для main или wmain , могут получать недопустимые сведения.

Если varname имеет значение NULL , эта функция вызывает обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
выполнение может быть продолжено, эта функция задает для errno значение
EINVAL и возвращает NULL .

_wgetenv — это версия с расширенными символами для getenv ; аргумент и


возвращаемое значение _wgetenv являются строками с расширенными символами.
Глобальная переменная _wenviron — это версия _environ с расширенными
символами.

В программе с многобайтовой кодировкой (например, в программе с


однобайтовой кодировкой ASCII) переменная _wenviron инициализируется
значением NULL , поскольку среда состоит из строк многобайтовой кодировки.
Затем если при первом вызове функции _wputenv или _wgetenv среда
(многобайтовой кодировки) уже существует, создается соответствующая среда для
поддержки расширенных строк и на нее устанавливается указатель _wenviron .

Аналогично в программе Юникода ( _wmain ) переменная _environ


инициализируется значением NULL , поскольку среда состоит из расширенных
строк. Затем, если при первом вызове функции _putenv или getenv среда
(Юникода) уже существует, создается соответствующая среда для поддержки
многобайтовых строк, на которую указывает _environ .

Если в программе одновременно существуют две копии среды (MBCS и Юникод),


система времени выполнения должна mainвыполнять обе копии, что приводит к
замедлению выполнения. Например, при вызове функции _putenv также
автоматически производится вызов функции _wputenv , чтобы строки в двух средах
совпадали.

U Внимание!

В редких случаях, когда система времени выполнения использует mainкак


версию Юникода, так и многобайтовую версию среды, эти две версии среды
могут не соответствовать точно. Это происходит потому, что хотя любая
уникальная расширенная строка сопоставляется уникальной строке Юникода,
сопоставление уникальной строки Юникода со строкой многобайтовой
кодировки не обязательно будет уникальными. Дополнительные сведения см.
в разделе_environ , _wenviron.

7 Примечание

Семейства функций _putenv и _getenv не являются потокобезопасными.


Функция _getenv может вернуть указатель строки, в то время как функция
_putenv изменяет строку, вызывая случайные сбои. Убедитесь, что вызовы этих
функций синхронизированы.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tgetenv getenv getenv _wgetenv

Для проверки или изменения значения переменной среды TZ используйте


функции getenv , _putenv и _tzset , как требуется. Дополнительные сведения о
TZ см _tzset . в разделах и _daylight, timezoneи _tzname.

Требования
Подпрограмма Обязательный заголовок

getenv <stdlib.h>

_wgetenv <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_getenv.c

// compile with: /W3

// This program uses getenv to retrieve

// the LIB environment variable and then uses

// _putenv to change it to a new value.

#include <stdlib.h>

#include <stdio.h>

int main( void )

char *libvar;

// Get the value of the LIB environment variable.

libvar = getenv( "LIB" ); // C4996

// Note: getenv is deprecated; consider using getenv_s instead

if( libvar != NULL )


printf( "Original LIB variable is: %s\n", libvar );

// Attempt to change path. Note that this only affects the environment

// variable of the current process. The command processor's

// environment is not changed.

_putenv( "LIB=c:\\mylib;c:\\yourlib" ); // C4996

// Note: _putenv is deprecated; consider using putenv_s instead

// Get new value.

libvar = getenv( "LIB" ); // C4996

if( libvar != NULL )


printf( "New LIB variable is: %s\n", libvar );

Output

Original LIB variable is: C:\progra~1\devstu~1\vc\lib

New LIB variable is: c:\mylib;c:\yourlib

См. также раздел


Управление процессами и средой

_putenv, _wputenv

Константы среды
getenv_s , _wgetenv_s
Статья • 03.04.2023

Получает значение из текущей среды. Эти версии getenvимеют _wgetenv


улучшения безопасности, как описано в разделе Функции безопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t getenv_s(

size_t *pReturnValue,

char* buffer,

size_t numberOfElements,

const char *varname

);

errno_t _wgetenv_s(

size_t *pReturnValue,

wchar_t *buffer,

size_t numberOfElements,

const wchar_t *varname

);

template <size_t size>

errno_t getenv_s(

size_t *pReturnValue,

char (&buffer)[size],

const char *varname

); // C++ only

template <size_t size>

errno_t _wgetenv_s(

size_t *pReturnValue,

wchar_t (&buffer)[size],

const wchar_t *varname

); // C++ only

Параметры
pReturnValue

Требуемый размер буфера или 0, если переменная не найдена.

buffer

Буфер для хранения значения переменной среды.

numberOfElements

Размер buffer .

varname

Имя переменной среды.

Возвращаемое значение
Ноль при успехе; код ошибки при неудаче.

Условия ошибок

pReturnValue buffer numberOfElements varname Возвращаемое значение

NULL any any any EINVAL

any NULL >0 any EINVAL

any any any NULL EINVAL

Любое из этих условий ошибки вызывает обработчик недопустимых параметров,


как описано в разделе Проверка параметров. Если выполнение может быть
продолжено, функции задают для errno значение EINVAL и возвращают EINVAL .

Кроме того, если буфер слишком мал, эти функции возвращают ERANGE . Они не
вызывают обработчик недопустимых параметров. Они записывают необходимый
размер буфера в pReturnValue , поэтому программы могут вызвать функцию снова с
большим буфером.

Комментарии
Функция getenv_s выполняет поиск в списке переменных среды для varname .
getenv_s не учитывает регистр в операционной системе Windows. getenv_s и

_putenv_s используют копию среды, указанную глобальной переменной _environ ,


для получения среды. getenv_s работает только в структурах данных, доступных в
библиотеке времени выполнения, а не в "сегменте" среды, созданном для
процесса операционной системой. Таким образом, программы, использующие
envp аргумент для main или wmain , могут получить недопустимую информацию.

_wgetenv_s — это версия с расширенными символами для getenv_s ; аргумент и

возвращаемое значение _wgetenv_s являются строками с расширенными


символами. Глобальная переменная _wenviron — это версия _environ с
расширенными символами.

В программе с многобайтовой кодировкой (например, в программе с


однобайтовой кодировкой ASCII) переменная _wenviron инициализируется
значением NULL , поскольку среда состоит из строк многобайтовой кодировки.
Затем, если при первом вызове функции _wputenv или _wgetenv_s среда
(многобайтовой кодировки) уже существует, создается соответствующая среда для
поддержки расширенных строк, и на нее устанавливается указатель _wenviron .

Аналогично в программе Юникода ( _wmain ) переменная _environ


инициализируется значением NULL , поскольку среда состоит из расширенных
строк. Затем, если при первом вызове функции _putenv или getenv_s среда
(Юникода) уже существует, создается соответствующая среда для поддержки
многобайтовых строк, на которую указывает _environ .

Если в программе одновременно существуют две копии среды (MBCS и Юникод),


выполнение может занять больше времени, так как система времени выполнения
должна mainвыполнять обе копии. Например, при вызове функции _putenv также
автоматически производится вызов функции _wputenv , чтобы строки в двух средах
совпадали друг с другом.

U Внимание!

В редких случаях, когда система времени выполнения использует mainкак


версию Юникода, так и многобайтовую версию среды, эти две версии среды
могут не соответствовать точно. Это происходит потому, что хотя любая
уникальная строка с многобайтовыми символами сопоставляется уникальной
строке Юникода, сопоставление уникальной строки Юникода со строкой
многобайтовой кодировки не обязательно будет уникальными.
Дополнительные сведения см. в разделе_environ , _wenviron.

7 Примечание
Семейства функций _putenv_s и _getenv_s не являются потокобезопасными.
_getenv_s может вернуть указатель строки, в то время как _putenv_s изменяет
строку, что может вызвать случайные сбои. Убедитесь, что вызовы этих
функций синхронизированы.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устранена
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tgetenv_s getenv_s getenv_s _wgetenv_s

Для проверки или изменения значения переменной среды TZ используйте


getenv_s , _putenv и _tzset по мере необходимости. Дополнительные сведения о

TZ см. в разделах _tzset и _daylight, _dstbias, _timezoneи _tzname.

Требования
Подпрограмма Обязательный заголовок

getenv_s <stdlib.h>

_wgetenv_s <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getenv_s.c

// This program uses getenv_s to retrieve

// the LIB environment variable and then uses

// _putenv to change it to a new value.

#include <stdlib.h>

#include <stdio.h>

int main( void )

char* libvar;

size_t requiredSize;

getenv_s( &requiredSize, NULL, 0, "LIB");

if (requiredSize == 0)

printf("LIB doesn't exist!\n");

exit(1);

libvar = (char*) malloc(requiredSize * sizeof(char));

if (!libvar)

printf("Failed to allocate memory!\n");

exit(1);

// Get the value of the LIB environment variable.

getenv_s( &requiredSize, libvar, requiredSize, "LIB" );

printf( "Original LIB variable is: %s\n", libvar );

// Attempt to change path. Note that this only affects

// the environment variable of the current process. The command


// processor's environment is not changed.

_putenv_s( "LIB", "c:\\mylib;c:\\yourlib" );

getenv_s( &requiredSize, NULL, 0, "LIB");

libvar = (char*) realloc(libvar, requiredSize * sizeof(char));

if (!libvar)

printf("Failed to allocate memory!\n");

exit(1);

// Get the new value of the LIB environment variable.

getenv_s( &requiredSize, libvar, requiredSize, "LIB" );

printf( "New LIB variable is: %s\n", libvar );

free(libvar);

Output
Original LIB variable is:
c:\vctools\lib;c:\vctools\atlmfc\lib;c:\vctools\PlatformSDK\lib;c:\vctools\V
isual Studio SDKs\DIA Sdk\lib;c:\vctools\Visual Studio SDKs\BSC Sdk\lib

New LIB variable is: c:\mylib;c:\yourlib

См. также раздел


Управление процессами и средой

Константы среды

_putenv, _wputenv

_dupenv_s, _wdupenv_s
_getmaxstdio
Статья • 03.04.2023

Возвращает количество одновременно открытых файлов, допустимое на уровне


потокового ввода-вывода.

Синтаксис
C

int _getmaxstdio( void );

Возвращаемое значение
Возвращает число, представляющее количество одновременно открытых файлов,
которое в данный момент разрешено на уровне stdio .

Комментарии
Используется _setmaxstdio для настройки количества одновременно открытых
файлов, разрешенных на stdio уровне.

Требования
Подпрограмма Обязательный заголовок

_getmaxstdio <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_setmaxstdio.c

// The program retrieves the maximum number

// of open files and prints the results

// to the console.

#include <stdio.h>

int main()

printf( "%d\n", _getmaxstdio());

_setmaxstdio(2048);

printf( "%d\n", _getmaxstdio());

Output

512

2048

См. также раздел


Потоковый ввод-вывод
_getmbcp
Статья • 03.04.2023

Извлекает текущую кодовую страницу.

Синтаксис
C

int _getmbcp( void );

Возвращаемое значение
Возвращает текущую многобайтовую кодовую страницу. Возвращаемое значение 0
означает, что используется однобайтовая кодовая страница.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_getmbcp <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_setmbcp
getpid
Статья • 03.04.2023

Имя getpid функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом _getpid для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _getpid . Или вы можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделах Отключение предупреждения и Имена функций POSIX.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_getpid
Статья • 03.04.2023

Получает идентификатор процесса.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _getpid( void );

Возвращаемое значение
Возвращает идентификатор процесса, полученный из системы. Ошибка не
возвращается.

Комментарии
Функция _getpid получает идентификатор процесса из системы. Идентификатор
процесса однозначно идентифицирует вызывающий процесс.

Требования
Подпрограмма Обязательный заголовок

_getpid <process.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getpid.c

// This program uses _getpid to obtain

// the process ID and then prints the ID.

#include <stdio.h>

#include <process.h>

int main( void )

// If run from command line, shows different ID for

// command line than for operating system shell.

printf( "Process id: %d\n", _getpid() );

Output

Process id: 3584

См. также раздел


Управление процессами и средой

_mktemp, _wmktemp
gets_s , _getws_s
Статья • 03.04.2023

Получает строку из потока stdin . Эти версии getsимеют _getws улучшения


безопасности, как описано в разделе Функции безопасности в CRT.

Синтаксис
C

char *gets_s(

char *buffer,

size_t sizeInCharacters

);

wchar_t *_getws_s(

wchar_t *buffer,

size_t sizeInCharacters

);

C++

template <size_t size>

char *gets_s( char (&buffer)[size] ); // C++ only

template <size_t size>

wchar_t *_getws_s( wchar_t (&buffer)[size] ); // C++ only

Параметры
buffer

Место хранения входной строки.

sizeInCharacters

Размер буфера.

Возвращаемое значение
Возвращает значение buffer в случае успешного выполнения. Указатель NULL
указывает на ошибку или конец файла. Используйте ferror или feof , чтобы
определить, какой из них произошел.
Комментарии
Функция gets_s считывает строку из стандартного потока ввода stdin и сохраняет
ее в буфере buffer . Строка состоит из всех символов до и включая первый символ
новой строки (' \n '). gets_s затем заменяет символ новой строки на пустой символ
(' \0 '), прежде чем возвращать строку. Напротив, функция fgets_s сохраняет
символ новой строки.

Если первый считываемый символ является символом конца файла, в начале


сохраняется пустой buffer символ и NULL возвращается.

_getws_s — это версия функции gets_s для расширенных символов; ее аргумент и


возвращаемое значение являются строками расширенных символов.

Если buffer значение меньше NULL или sizeInCharacters равно нулю или если
буфер слишком мал для хранения входной строки и признака конца null, эти
функции вызывают обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если выполнение может быть продолжено, эти функции
возвращают NULL и устанавливают параметр errno в значение ERANGE .

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_getts_s gets_s gets_s _getws_s

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

gets_s <stdio.h>

_getws_s <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_gets_s.c

// This program retrieves a string from the stdin and

// prints the same string to the console.

#include <stdio.h>

int main( void )

char line[21]; // room for 20 chars + '\0'

gets_s( line, 20 );

printf( "The line entered was: %s\n", line );

Input

Hello there!

Output

The line entered was: Hello there!

См. также раздел


Потоковый ввод-вывод

gets, _getws

fgets, fgetws

fputs, fputws

puts, _putws
getw
Статья • 03.04.2023

Имя getw функции, зависят от Майкрософт, является устаревшим псевдонимом


_getw для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _getw . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_getw
Статья • 03.04.2023

Получает значение типа integer из потока.

Синтаксис
C

int _getw(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Возвращаемое значение
Функция _getw возвращает считанное целочисленное значение. Возвращаемое
значение EOF указывает на ошибку или конец файла. Тем не менее, так как EOF
также является допустимым целочисленным значением, можно использовать feof
или ferror для проверки наличия ошибки или достижения конца файла. В
противном stream случае NULL вызывается обработчик недопустимых параметров,
как описано в разделе "Проверка параметров". Если выполнение может быть
продолжено, параметр errno устанавливается в значение EINVAL , и функция
возвращает значение EOF .

Комментарии
Функция _getw считывает следующее двоичное значение типа int из файла,
связанного с stream ним, и увеличивает связанный указатель файла (если он
существует), чтобы указать на следующий непрочитанные символы. _getw не
предполагает специального выравнивания элементов в потоке. При
использовании функции _getw могут возникнуть проблемы с переносом,
связанные с размером типа int и порядком байтов в типе int в разных системах.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_getw <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_getw.c

// This program uses _getw to read a word

// from a stream, then performs an error check.

#include <stdio.h>

#include <stdlib.h>

int main( void )

FILE *stream;

int i;

if( fopen_s( &stream, "crt_getw.txt", "rb" ) )

printf( "Couldn't open file\n" );

else

// Read a word from the stream:

i = _getw( stream );

// If there is an error...

if( ferror( stream ) )

printf( "_getw failed\n" );

clearerr_s( stream );

else

printf( "First data word in file: 0x%.4x\n", i );

fclose( stream );

Входные данные: crt_getw.txt


Input

Line one.

Line two.

Вывод
Output

First data word in file: 0x656e694c

См. также
Потоковый ввод-вывод

_putw
gmtime , _gmtime32 , _gmtime64
Статья • 03.04.2023

time_t Преобразует значение времени в структуру tm . Доступны более безопасные

версии этих функций; see gmtime_s, , _gmtime64_s_gmtime32_s.

Синтаксис
C

struct tm *gmtime( const time_t *sourceTime );


struct tm *_gmtime32( const __time32_t *sourceTime );

struct tm *_gmtime64( const __time64_t *sourceTime );

Параметры
sourceTime

Указатель на хранимое время. Время представляется в виде секунд, истекших после


полуночи (00:00:00) 1-го января 1970 года, время в формате UTC.

Возвращаемое значение
Указатель на структуру типа tm. Поля возвращаемой структуры содержат
вычисленное значение аргумента sourceTime в формате UTC, а не по местному
времени. Каждое из полей структуры имеет тип int , как описано далее:

Поле Описание

tm_sec Секунды после минуты (0 – 59).

tm_min Минуты после часа (0 – 59).

tm_hour Часы с полуночи (от 0 до 23).

tm_mday День месяца (от 1 до 31).

tm_mon Месяц (0 – 11; Январь = 0).

tm_year Год (текущий год минус 1900).

tm_wday День недели (0 – 6; Воскресенье = 0).


Поле Описание

tm_yday День года (0 – 365; 1 января = 0).

tm_isdst Всегда 0 для gmtime .

32- и 64-разрядные версии функций gmtime , mktime, mkgmtime и localtime для


преобразования используют одну общую для каждого потока структуру tm .
Каждый вызов одной из этих функций уничтожает результат любого предыдущего
вызова. Если sourceTime представляет дату перед полночью 1-го января 1970 года,
функция gmtime возвращает значение NULL . Ошибка не возвращается.

_gmtime64 , который использует структуру __time64_t , позволяет выражать даты до


23:59:59, 31 декабря 3000 г. в формате UTC. _gmtime32 представляет только даты до
23:59:59 18 января 2038 г. в формате UTC. Полночь 1-ого января 1970 года —
нижняя граница диапазона дат для обеих функций.

gmtime  — это подставляемая функция, эквивалентная функции _gmtime64 ; функция

time_t эквивалентна функции __time64_t , если не определена директива


_USE_32BIT_TIME_T . Если необходимо, чтобы компилятор принудительно

интерпретировал структуру time_t как старую 32-разрядную структуру time_t ,


можно определить директиву _USE_32BIT_TIME_T , но это приводит к тому, что
функция gmtime подставляется в код как функция _gmtime32 , а структура time_t
определяется как __time32_t . Мы не рекомендуем использовать
_USE_32BIT_TIME_T ее, так как она не разрешена на 64-разрядных платформах. В

любом случае приложение может завершиться сбоем после 18 января 2038 г.

Эти функции проверяют свои параметры. Если sourceTime это NULL указатель или
sourceTime значение отрицательное, эти функции вызывают обработчик

недопустимых параметров, как описано в разделе "Проверка параметров". Если


выполнение может быть продолжено, эти функции возвращают NULL и
устанавливают параметр errno в значение EINVAL .

Комментарии
Функция _gmtime32 разбивает sourceTime значение и сохраняет его в статической
выделенной структуре типа tm , определенной в TIME.H . Значение параметра
sourceTime обычно получается из вызова функции time.

7 Примечание
В большинстве случаев целевая среда пытается определить, действует ли
летнее время. Библиотека времени выполнения C принимает правила США
для реализации проверки на летнее время (DST).

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок Обязательный заголовок
C C++

gmtime , _gmtime32 , _gmtime64 <time.h> <ctime> или <time.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_gmtime.c

// compile with: /W3

// This program uses _gmtime64 to convert a long-

// integer representation of coordinated universal time

// to a structure named newtime, then uses asctime to

// convert this structure to an output string.

#include <time.h>

#include <stdio.h>

int main(void)

struct tm *newtime;

__int64 ltime;

char buff[80];

_time64( &ltime );

// Obtain coordinated universal time:

newtime = _gmtime64( &ltime ); // C4996

// Note: _gmtime64 is deprecated; consider using _gmtime64_s

asctime_s( buff, sizeof(buff), newtime );

printf( "Coordinated universal time is %s\n", buff );


}

Output
Coordinated universal time is Tue Feb 12 23:11:31 2002

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_ftime, _ftime32, _ftime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime, _localtime32, _localtime64

_mkgmtime, _mkgmtime32, _mkgmtime64

mktime, _mktime32, _mktime64

time, _time32, _time64


gmtime_s , _gmtime32_s , _gmtime64_s
Статья • 03.04.2023

Преобразует значение времени в структуру tm . Эти функции являются версиями , с


улучшениями _gmtime32безопасности, _gmtime64 как описано в функциях
безопасности в CRT.

Синтаксис
C

errno_t gmtime_s(

struct tm* tmDest,

const __time_t* sourceTime

);

errno_t _gmtime32_s(

struct tm* tmDest,

const __time32_t* sourceTime

);

errno_t _gmtime64_s(

struct tm* tmDest,

const __time64_t* sourceTime

);

Параметры
tmDest

Указатель на структуру tm. Поля возвращаемой структуры содержат вычисленное


значение аргумента timer в формате UTC, а не по местному времени.

sourceTime

Указатель на сохраненное время. Время представляется в виде секунд, истекших


после полуночи (00:00:00) 1-го января 1970 года, время в формате UTC.

Возвращаемое значение
Нуль при успешном завершении. Возвращаемое значение — это код ошибки, если
произошел сбой. Коды ошибок определены в ; список этих ошибок см. в
Errno.h разделе errno.

Условия ошибок
tmDest sourceTime Возвращает Значение в tmDest

NULL any EINVAL Не изменено.

Не NULL (указывает на допустимую NULL EINVAL Во всех полях заданы


память) значения –1.

Не NULL <0 EINVAL Во всех полях заданы


значения –1.

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


описано в разделе "Проверка параметров". Если выполнение может быть
продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение EINVAL .

Комментарии
Функция _gmtime32_s разбивает sourceTime значение и сохраняет его в структуре
типа tm , определенной в Time.h . Адрес структуры передается в параметре tmDest .
Значение sourceTime часто получается из вызова time функции.

7 Примечание

Целевая среда должна попытаться определить, действует ли летнее время.


Библиотека времени выполнения C принимает правила США для реализации
вычисления летнего времени.

Каждое из полей структуры имеет тип int , как показано в следующей таблице.

Поле Описание

tm_sec Секунды после минуты (от 0 до 59).

tm_min Минуты после часа (0 – 59).

tm_hour Часы с полуночи (от 0 до 23).

tm_mday День месяца (от 1 до 31).

tm_mon Месяц (0 – 11; Январь = 0).

tm_year Год (текущий год минус 1900).

tm_wday День недели (0 – 6; Воскресенье = 0).


Поле Описание

tm_yday День года (0 – 365; 1 января = 0).

tm_isdst Всегда 0 для gmtime_s .

Функция _gmtime64_s , которая использует структуру __time64_t , поддерживает даты


до 23:59:59 31 декабря 3000 года в формате UTC; при этом функция gmtime32_s
представляет даты только до 23:59:59 18 января 2038 года в формате UTC. Полночь
1-го января 1970 года — нижняя граница диапазона дат для обеих функций.

gmtime_s — встраиваемая функция, которая принимает значение _gmtime64_s , и

time_t эквивалентна __time64_t . Если необходимо, чтобы компилятор


принудительно интерпретировал time_t как старое 32-разрядное значение time_t ,
можно определить _USE_32BIT_TIME_T . _USE_32BIT_TIME_T gmtime_s вызывает
встраивать как _gmtime32_s . Не рекомендуется _USE_32BIT_TIME_T , так как
приложение может завершиться ошибкой после 18 января 2038 г., и так как оно не
разрешено на 64-разрядных платформах.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный Обязательный заголовок
заголовок C C++

gmtime_s , _gmtime32_s , <time.h> <ctime> или <time.h>


_gmtime64_s

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_gmtime64_s.c

// This program uses _gmtime64_s to convert a 64-bit

// integer representation of coordinated universal time

// to a structure named newtime, then uses asctime_s to

// convert this structure to an output string.

#include <time.h>

#include <stdio.h>

int main( void )

struct tm newtime;

__int64 ltime;

char buf[26];

errno_t err;

_time64( &ltime );

// Obtain coordinated universal time:

err = _gmtime64_s( &newtime, &ltime );

if (err)

printf("Invalid Argument to _gmtime64_s.");

// Convert to an ASCII representation

err = asctime_s(buf, 26, &newtime);

if (err)

printf("Invalid Argument to asctime_s.");

printf( "Coordinated universal time is %s\n",

buf );

Output

Coordinated universal time is Fri Apr 25 20:12:33 2003

См. также раздел


Управление временем

asctime_s, _wasctime_s

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

localtime_s, _localtime32_s, _localtime64_s

_mkgmtime, _mkgmtime32, _mkgmtime64

mktime, _mktime32, _mktime64

time, _time32, _time64


_heapchk
Статья • 03.04.2023

Выполняет проверки согласованности в куче.

Синтаксис
C

int _heapchk( void );

Возвращаемое значение
Функция _heapchk возвращает одну из следующих целочисленных констант
манифеста, определенных в файле Malloc.h.

Возвращаемое значение Условие

_HEAPBADBEGIN Исходные сведения о заголовке недопустимы или не найдены.

_HEAPBADNODE Обнаружен недопустимый узел или куча повреждена.

_HEAPBADPTR Недопустимый указатель на кучу.

_HEAPEMPTY Куча не инициализирована.

_HEAPOK Вероятно, куча согласована.

Кроме того, при возникновении ошибки функция _heapchk устанавливает для


параметра errno значение ENOSYS .

Комментарии
Функция _heapchk используется при отладке проблем с кучей, обеспечивая
проверку минимальной согласованности кучи. Если операционная система не
поддерживает _heapchk (например, Windows 98), функция возвращает и задает
_HEAPOK значение errno ENOSYS .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_heapchk <malloc.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_heapchk.c

// This program checks the heap for

// consistency and prints an appropriate message.

#include <malloc.h>

#include <stdio.h>

int main( void )

int heapstatus;

char *buffer;

// Allocate and deallocate some memory

if( (buffer = (char *)malloc( 100 )) != NULL )

free( buffer );

// Check heap status

heapstatus = _heapchk();

switch( heapstatus )
{

case _HEAPOK:

printf(" OK - heap is fine\n" );

break;

case _HEAPEMPTY:

printf(" OK - heap is empty\n" );

break;

case _HEAPBADBEGIN:

printf( "ERROR - bad start of heap\n" );

break;

case _HEAPBADNODE:

printf( "ERROR - bad node in heap\n" );

break;

Output
OK - heap is fine

См. также раздел


Выделение памяти

_heapadd

_heapmin

_heapset

_heapwalk
_heapmin
Статья • 03.04.2023

Освобождает неиспользуемую память кучи для операционной системы.

Синтаксис
C

int _heapmin( void );

Возвращаемое значение
В случае успешного выполнения _heapmin возвращает 0; в противном случае
функция возвращает –1 и задает для errno значение ENOSYS .

Дополнительные сведения об этом и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция _heapmin устанавливает минимальный размер кучи, высвобождая
неиспользуемую память для операционной системы. Если операционная система
не поддерживает _heapmin (например, Windows 98), функция возвращает значение
-1 и задает значение errno ENOSYS .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_heapmin <malloc.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Выделение памяти

free

_heapadd

_heapchk
_heapset

_heapwalk

malloc
_heapwalk
Статья • 03.04.2023

Выполняет обход кучи и возвращает сведения о следующей записи.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows, за исключением отладочных сборок. Дополнительные
сведения: Функции CRT, которые не поддерживаются в приложениях
универсальной платформы Windows.

Синтаксис
C

int _heapwalk( _HEAPINFO *entryinfo );

Параметры
entryinfo

Буфер, который будет содержать данные кучи.

Возвращаемое значение
Функция _heapwalk возвращает одну из следующих целочисленных констант
манифеста, определенных в файле Malloc.h.

Возвращаемое Значение
значение

_HEAPBADBEGIN Начальные сведения о заголовке недопустимы или не найдены.

_HEAPBADNODE Куча повреждена или обнаружен плохой узел.

_HEAPBADPTR Поле _pentry _HEAPINFO структуры не содержит допустимый указатель на


кучу или entryinfo является пустым указателем.

_HEAPEND Успешно достигнут конец кучи.


Возвращаемое Значение
значение

_HEAPEMPTY Куча еще не инициализирована.

_HEAPOK Пока без ошибок; entryinfo обновляется информацией о следующей


записи кучи.

Кроме того, при возникновении ошибки функция _heapwalk устанавливает для


параметра errno значение ENOSYS .

Комментарии
Функция _heapwalk помогает при отладке в программах проблем, связанных с
кучей. Функция выполняет обход кучи, проходя по одной записи при каждом
вызове, и возвращает указатель на структуру типа _HEAPINFO , содержащую
сведения о следующей записи кучи. Тип _HEAPINFO , определенный в файле Malloc.h,
содержит следующие элементы.

Поле Значение

int *_pentry Указатель записи кучи.

size_t _size Размер записи кучи.

int _useflag Флаг, указывающий, используется ли запись кучи.

Вызов функции _heapwalk , возвращающий _HEAPOK , сохраняет размер записи в


поле _size и устанавливает в поле _useflag значение _FREEENTRY или _USEDENTRY
(обе константы определены в файле Malloc.h). Для доступа к этой информации о
первой записи в куче следует передать в функцию _heapwalk указатель на
структуру _HEAPINFO , в которой член _pentry имеет значение NULL . Если
операционная система не поддерживается _heapwalk , функция возвращает
_HEAPEND и задает значение errno ENOSYS .

Эта функция проверяет свои параметры. Если entryinfo это пустой указатель,
вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, параметр
errno устанавливается в значение EINVAL , и функция возвращает значение

_HEAPBADPTR .
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_heapwalk <malloc.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_heapwalk.c

// This program "walks" the heap, starting

// at the beginning (_pentry = NULL). It prints out each

// heap entry's use, location, and size. It also prints

// out information about the overall state of the heap as

// soon as _heapwalk returns a value other than _HEAPOK

// or if the loop has iterated 100 times.

#include <stdio.h>

#include <malloc.h>

void heapdump(void);

int main(void)

char *buffer;

heapdump();

if((buffer = (char *)malloc(59)) != NULL)

heapdump();

free(buffer);

heapdump();

void heapdump(void)

_HEAPINFO hinfo;

int heapstatus;

int numLoops;

hinfo._pentry = NULL;

numLoops = 0;

while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK &&

numLoops < 100)

printf("%8s block at %Fp of size %4.4X\n",

(hinfo._useflag == _USEDENTRY ? "USED" : "FREE"),

hinfo._pentry, hinfo._size);

numLoops++;

switch(heapstatus)

case _HEAPEMPTY:

printf("OK - empty heap\n");

break;

case _HEAPEND:

printf("OK - end of heap\n");

break;

case _HEAPBADPTR:

printf("ERROR - bad pointer to heap\n");

break;

case _HEAPBADBEGIN:

printf("ERROR - bad start of heap\n");

break;

case _HEAPBADNODE:

printf("ERROR - bad node in heap\n");

break;

Output

USED block at 00310650 of size 0100

USED block at 00310758 of size 0800

USED block at 00310F60 of size 0080

FREE block at 00310FF0 of size 0398

USED block at 00311390 of size 000D

USED block at 003113A8 of size 00B4

USED block at 00311468 of size 0034

USED block at 003114A8 of size 0039

...

USED block at 00312228 of size 0010

USED block at 00312240 of size 1000

FREE block at 00313250 of size 1DB0

OK - end of heap

См. также раздел


Выделение памяти

_heapadd

_heapchk
_heapmin

_heapset
hypot , hypotf , hypotl , _hypot , _hypotf ,
_hypotl
Статья • 03.04.2023

Вычисляет гипотенузу.

Синтаксис
C

double hypot(

double x,

double y

);

float hypotf(

float x,

float y

);

long double hypotl(

long double x,

long double y

);

double _hypot(

double x,

double y

);

float _hypotf(

float x,

float y

);

long double _hypotl(

long double x,

long double y

);

#define hypotf(X, Y) // Requires C11 or higher

Параметры
x, y

Значения с плавающей запятой.

Возвращаемое значение
В случае успешного выполнения hypot возвращает длину гипотенузы. При
переполнении hypot возвращает INF (бесконечность), а параметру errno
присваивается значение ERANGE . Изменить способ обработки ошибок можно с
помощью _matherr .

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функции hypot вычисляют длину гипотенузы правого треугольника, учитывая
длину двух сторон x и y (другими словами, квадратный корень x 2 + y 2).

Для совместимости с более ранними стандартами используются версии функций с


символом подчеркивания в начале. Их поведение идентично поведению версий,
которые не имеют таких символов. В новом коде рекомендуется использовать
версии без символов подчеркивания.

При использовании <макроса tgmath.h> hypot() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

hypot , hypotf , hypotl , _hypot , _hypotf , _hypotl <math.h>

hypot Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_hypot.c

// This program prints the hypotenuse of a right triangle.

#include <math.h>

#include <stdio.h>

int main( void )

double x = 3.0, y = 4.0;

printf( "If a right triangle has sides %2.1f and %2.1f, "

"its hypotenuse is %2.1f\n", x, y, _hypot( x, y ) );

Output

If a right triangle has sides 3.0 and 4.0, its hypotenuse is 5.0

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_cabs

_matherr
ilogb , ilogbf , ilogbl
Статья • 03.04.2023

Возвращает целое число, представляющее несмещенный порядок по основанию 2


для заданного значения.

Синтаксис
C

int ilogb(

double x

);

int ilogb(

float x

); //C++ only

int ilogb(

long double x

); //C++ only

int ilogbf(

float x

);

int ilogbl(

long double x

);

#define ilogbl(X) // Requires C11 or higher

Параметры
x

Указанное значение.

Возвращаемое значение
В случае успешного выполнения эти функции возвращают экспоненту x base-2 в
виде signed int значения.

В противном случае функции возвращают одно из следующих значений,


определенных в <math.h>:
Входные данные Результат

±0 FP_ILOGB0

± INF, ± NAN, IND FP_ILOGBNAN

Сообщения об ошибках указываются, как указано в ._matherr

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции ilogb ,
принимающие и возвращающие типы float и long double . В программе C, если вы
не используете <макрос tgmath.h> для вызова этой функции, ilogb всегда
принимает и возвращает значение double .

При использовании <макроса tgmath.h> ilogb() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

Вызов этой функции аналогичен вызову эквивалентной функции logb с


последующим приведением возвращаемого значения к типу int .

Требования
Подпрограмма Заголовок C Заголовок C++

ilogb , ilogbf , ilogbl <math.h> <cmath>

ilogb Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

frexp

logb, logbf, logbl, _logb, _logbf


imaxabs
Статья • 03.04.2023

Вычисляет абсолютное значение целого числа любого размера.

Синтаксис
C

intmax_t imaxabs(

intmax_t n

);

Параметры
n

Целое значение.

Возвращаемое значение
Функция imaxabs возвращает абсолютное значение аргумента. Ошибка не
возвращается.

7 Примечание

Так как диапазон отрицательных целых чисел, которые могут быть


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

Требования
Подпрограмма Обязательный заголовок

imaxabs <inttypes.h>
Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_imaxabs.c

// Build using: cl /W3 /Tc crt_imaxabs.c

// This example calls imaxabs to compute an

// absolute value, then displays the results.

#include <stdio.h>

#include <stdlib.h>

#include <inttypes.h>

int main(int argc, char *argv[])

intmax_t x = LLONG_MIN + 2;

printf("The absolute value of %lld is %lld\n", x, imaxabs(x));

Output

The absolute value of -9223372036854775806 is 9223372036854775806

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


abs, labs, llabs, _abs64

_cabs

fabs, fabsf, fabsl


imaxdiv
Статья • 03.04.2023

Вычисляет частное и остаток от деления двух целочисленных значений любого


размера в рамках одной операции.

Синтаксис
C

imaxdiv_t imaxdiv(

intmax_t numer,

intmax_t denom

);

Параметры
numer

Числитель.

denom

Знаменатель.

Возвращаемое значение
imaxdiv , вызываемая с аргументами типа intmax_t, возвращает структуру типа

imaxdiv_t , которая включает в себя цитент и оставшуюся часть.

Комментарии
Функция imaxdiv производит деление numer на denom , вычисляя таким образом
частное и остаток. Структура imaxdiv_t содержит цитент, intmax_t quot а
оставшуюся часть intmax_t rem . Знак цитаты совпадает со знаком математического
кворента. Его абсолютное значение является крупнейшим целым числом, которое
меньше абсолютного значения математического кворента. Если знаменатель
равен 0, выполнение программы прекратится и появится сообщение об ошибке.

Требования
Подпрограмма Обязательный заголовок

imaxdiv <inttypes.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_imaxdiv.c

// Build using: cl /W3 /Tc crt_imaxdiv.c

// This example takes two integers as command-line

// arguments and calls imaxdiv to divide the first

// argument by the second, then displays the results.

#include <stdio.h>

#include <stdlib.h>

#include <inttypes.h>

int main(int argc, char *argv[])

intmax_t x,y;

imaxdiv_t div_result;

x = atoll(argv[1]);

y = atoll(argv[2]);

printf("The call to imaxdiv(%lld, %lld)\n", x, y);

div_result = imaxdiv(x, y);

printf("results in a quotient of %lld, and a remainder of %lld\n\n",

div_result.quot, div_result.rem);

При построении и последующем вызове с параметрами командной строки


9460730470000000 8766 код генерирует следующие выходные данные:

Output

The call to imaxdiv(9460730470000000, 8766)

results in a quotient of 1079252848505, and a remainder of 5170

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
div

ldiv, lldiv
_initterm , _initterm_e
Статья • 03.04.2023

Внутренние методы, которые выполняют обход таблицы указателей функций и


инициализируют их.

Первый указатель представляет собой начальное расположение в таблице, а


второй указатель — конечное расположение.

Синтаксис
C

void __cdecl _initterm(

PVFV *,

PVFV *

);

int __cdecl _initterm_e(

PVFV *,

PVFV *

);

Возвращаемое значение
Ненулевой код ошибки, если инициализация завершается неудачей и генерирует
ошибку; 0 при отсутствии ошибок.

Комментарии
Эти методы вызываются только внутри системы во время инициализации
программы C++. Не вызывайте эти методы в программе.

Когда эти методы производят обход таблицы записей функций, они пропускают
записи NULL и продолжают выполнение.

См. также раздел


Алфавитный указатель функций
_invalid_parameter ,
_invalid_parameter_noinfo ,
_invalid_parameter_noinfo_noreturn ,
_invoke_watson
Статья • 03.04.2023

Эти функции используются библиотекой времени выполнения C для обработки


недопустимых параметров, передаваемых в функции библиотеки CRT. Эти функции
также могут использоваться в коде для поддержки определенных по умолчанию
или настраиваемых механизмов обработки недопустимых параметров.

Синтаксис
C

extern "C" void __cdecl

_invalid_parameter(

wchar_t const* const expression,

wchar_t const* const function_name,

wchar_t const* const file_name,

unsigned int const line_number,

uintptr_t const reserved);

extern "C" void __cdecl

_invalid_parameter_noinfo(void);

extern "C" __declspec(noreturn) void __cdecl

_invalid_parameter_noinfo_noreturn(void);

extern "C" __declspec(noreturn) void __cdecl

_invoke_watson(

wchar_t const* const expression,

wchar_t const* const function_name,

wchar_t const* const file_name,

unsigned int const line_number,

uintptr_t const reserved);

Параметры
expression

Строка, представляющая недопустимое выражение параметра исходного кода.


function_name

Имя функции, которая вызвала обработчик.

file_name

Файл исходного кода, в котором был вызван обработчик.

line_number

Номер строки в исходном коде, где был вызван обработчик.

reserved

Не используется.

Возвращаемое значение
Эти функции не возвращают значение. Функции _invalid_parameter_noinfo_noreturn
и _invoke_watson функции не возвращаются вызывающей стороны, а в некоторых
случаях _invalid_parameter и _invalid_parameter_noinfo не могут возвращаться
вызывающей.

Комментарии
Если функциям библиотеки времени выполнения C передаются недопустимые
параметры, они вызывают обработчик недопустимого параметра. Он
представляет собой функцию, в которой программист задает выполнение
определенных действий. Например, обработчик может сообщить о проблеме
пользователю, записать данные в журнал, установить прерывание в отладчике,
завершить работу программы или не выполнять никаких действий. Если
программист не указал никакую функцию, по умолчанию вызывается обработчик
_invoke_watson .

Если в коде отладки обнаруживается недопустимый параметр, функции


библиотеки CRT по умолчанию вызывают функцию _invalid_parameter с
подробными параметрами. В обычном коде вызывается функция
_invalid_parameter_noinfo , которая, в свою очередь, вызывает функцию
_invalid_parameter с пустыми параметрами. Если функции библиотеки CRT, не

осуществляющей отладку, требуется завершить работу программы, вызывается


функция _invalid_parameter_noinfo_noreturn , которая вызывает функцию
_invalid_parameter с пустыми параметрами, после чего вызывается функция

_invoke_watson для принудительного завершения программы.


Функция _invalid_parameter проверяет наличие обработчика недопустимого
параметра, определенного пользователем, и в случае обнаружения вызывает его.
Например, если определяемый пользователем обработчик потока был задан
вызовом set_thread_local_invalid_parameter_handler в текущем потоке, он
вызывается, функция возвращается. В противном случае, если определяемый
пользователем глобальный обработчик недопустимых параметров был задан
вызовом set_invalid_parameter_handler, вызывается, функция возвращается. В
противном случае вызывается обработчик по умолчанию _invoke_watson . По
умолчанию _invoke_watson завершает работу программы. Определенные
пользователем обработчики могут завершать работу программы или выполнять
возврат. В тех случаях, когда восстановление работоспособности программы не
гарантировано, рекомендуется завершать ее.

При вызове обработчика _invoke_watson по умолчанию, если обработчик


поддерживает __fastfail операцию, он вызывается с помощью параметра
FAST_FAIL_INVALID_ARG и завершается процессом. В противном случае возникает

исключение с быстрым прекращением, которое может быть перехвачено с


помощью связанного отладчика. Если процесс разрешен, он завершается вызовом
функции Windows TerminateProcess с помощью состояния
STATUS_INVALID_CRUNTIME_PARAMETER кода исключения .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Компонент Обязательный
заголовок

_invalid_parameter , _invalid_parameter_noinfo , <corecrt.h>


_invalid_parameter_noinfo_noreturn , _invoke_watson

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

_get_invalid_parameter_handler, _get_thread_local_invalid_parameter_handler

_set_invalid_parameter_handler, _set_thread_local_invalid_parameter_handler

Проверка параметров
isalnum , iswalnum , _isalnum_l ,
_iswalnum_l
Статья • 03.04.2023

Определяет, представляет ли целое число алфавитно-цифровой символ.

Синтаксис
C

int isalnum( int c );

int iswalnum( wint_t c );

int _isalnum_l( int c, _locale_t locale );

int _iswalnum_l( wint_t c, _locale_t locale );

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление алфавитно-цифрового символа. isalnum возвращает
ненулевое значение, если isalpha одно или isdigit ненулевое значение для c , то
есть, если c находится в диапазонах A - Z, a - z или 0 - 9. Функция iswalnum
возвращает ненулевое значение, если не равна нулю функция iswalpha или
iswdigit для c . Каждая из этих подпрограмм возвращает значение 0, если c

условие теста не удовлетворяет.

Версии этих функций с суффиксом _l используют переданный параметр языкового


стандарта вместо текущего языкового стандарта. Для получения дополнительной
информации см. Locale.

Поведение isalnum и _isalnum_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istalnum isalnum _ismbcalnum iswalnum

_istalnum_l _isalnum_l _ismbcalnum_l _iswalnum_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

isalnum <ctype.h>

iswalnum <ctype.h> или <wchar.h>

_isalnum_l <ctype.h>

_iswalnum_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isalpha , iswalpha , _isalpha_l ,
_iswalpha_l
Статья • 03.04.2023

Определяет, представляет ли целое число алфавитный символ.

Синтаксис
C

int isalpha(

int c

);

int iswalpha(

wint_t c

);

int _isalpha_l(

int c,

_locale_t locale

);

int _iswalpha_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Языковой стандарт, используемый вместо текущего.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление алфавитного символа. isalpha возвращает ненулевое
значение, если c находится в диапазонах A - Z или a - z. Функция iswalpha
возвращает ненулевое значение только для расширенных символов, для которых
iswupper или iswlower не равно нулю. К ним относятся любые расширенные
символы, принадлежащие определяемым реализацией наборам, для которых
iswcntrl , iswdigit , iswpunct или iswspace не равны нулю. Каждая из этих

подпрограмм возвращает значение 0, если c условие теста не удовлетворяет.

Версии этих функций с суффиксом _l используют переданный параметр языкового


стандарта вместо текущего языкового стандарта. Для получения дополнительной
информации см. Locale.

Поведение isalpha и _isalpha_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istalpha isalpha _ismbcalpha iswalpha

_istalpha_l _isalpha_l _ismbcalpha_l _iswalpha_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

isalpha <ctype.h>

iswalpha <ctype.h> или <wchar.h>

_isalpha_l <ctype.h>

_iswalpha_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isascii , __isascii , iswascii
Статья • 03.04.2023

Определяет, является ли определенный символ символом ASCII.

Синтаксис
C

int __isascii(

int c

);

int iswascii(

wint_t c

);

#define isascii __isascii

Параметры
c

Проверяемое целое число.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление символа ASCII. __isascii возвращает ненулевое
значение, если c является символом ASCII (в диапазоне 0x00 — 0x7F). iswascii
возвращает ненулевое значение, если c является представлением символа ASCII в
виде расширенного символа. Каждая из этих подпрограмм возвращает значение 0,
если c условие теста не удовлетворяет.

Комментарии
Оба __isascii и iswascii реализуются как макросы, если не определен макрос
_CTYPE_DISABLE_MACROS препроцессора.

Для обратной совместимости реализуется как макрос только в том случае, isascii
если __STDC__ он не определен или не определен как 0; в противном случае он не
определен.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить эту область, см. сведения о глобальном состоянии в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_istascii __isascii __isascii iswascii

Требования
Подпрограмма Обязательный заголовок

isascii , __isascii C: <ctype.h>

C++: <cctype> или <ctype.h>

iswascii C: <wctype.h>, <ctype.h> или <wchar.h>

C++: <cwctype>, <cctype>, <wctype.h>, <ctype.h> или <wchar.h>

Функции isascii и iswascii функции __isascii зависят от корпорации Майкрософт.


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isatty
Статья • 03.04.2023

Имя isatty функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _isatty для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _isatty . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_isatty
Статья • 03.04.2023

Определяет, связан ли дескриптор файла с устройством символьного ввода-


вывода.

Синтаксис
C

int _isatty( int fd );

Параметры
fd

Дескриптор файла, ссылающийся на проверяемое устройство.

Возвращаемое значение
Функция _isatty возвращает ненулевое значение, если дескриптор связан с
устройством символьного ввода-вывода. В противном случае функция _isatty
возвращает 0.

Комментарии
Функция _isatty определяет, связан ли дескриптор fd с устройством символьного
ввода-вывода (терминал, консоль, принтер или последовательный порт).

Эта функция проверяет параметр fd . Если fd указатель на недопустимый файл,


вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, функция
возвращает 0 и устанавливает errno в значение EBADF .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_isatty <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_isatty.c

/* This program checks to see whether

* stdout has been redirected to a file.

*/

#include <stdio.h>

#include <io.h>

int main( void )

if( _isatty( _fileno( stdout ) ) )

printf( "stdout has not been redirected to a file\n" );

else

printf( "stdout has been redirected to a file\n");

Пример полученных результатов


Output

stdout has not been redirected to a file

См. также раздел


Обработка файлов
isblank , iswblank , _isblank_l ,
_iswblank_l
Статья • 03.04.2023

Определяет, представляет ли целое число пустой символ.

Синтаксис
C

int isblank(

int c

);

int iswblank(

wint_t c

);

int _isblank_l(

int c,

_locale_t locale

);

int _iswblank_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если c является
конкретным представлением пробела, символа горизонтальной табуляции или
одного из символов языкового набора, которые используются для разделения слов
в строке текста. Функция isblank возвращает ненулевое значение, если c является
символом пробела (0x20) или горизонтальной табуляции (0x09). Результат условия
теста для isblank функций зависит от LC_CTYPE параметра категории языкового
стандарта. Дополнительные сведения см. в разделе setlocale. _wsetlocale Версии
этих функций, у которых _l нет суффикса, используют текущий языковой стандарт
для поведения, зависящее от языкового стандарта. Версии, _l имеющие суффикс,
идентичны, за исключением того, что они используют переданный языковой
стандарт. Для получения дополнительной информации см. Locale.

Функция iswblank возвращает ненулевое значение, если c представляет собой


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

Поведение isblank и _isblank_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istblank isblank _ismbcblank iswblank

_istblank_l _isblank_l _ismbcblank_l _iswblank_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

isblank <ctype.h>

iswblank <ctype.h> или <wchar.h>

_isblank_l <ctype.h>

_iswblank_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Классификация символов

Локаль

is, isw подпрограммы


iscntrl , iswcntrl , _iscntrl_l ,
_iswcntrl_l
Статья • 03.04.2023

Определяет, представляет ли целое число управляющий символ.

Синтаксис
C

int iscntrl(

int c

);

int iswcntrl(

wint_t c

);

int _iscntrl_l(

int c,

_locale_t locale

);

int _iswcntrl_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление управляющего символа. iscntrl возвращает ненулевое
значение, если c это элемент управления (0x00 — 0x1F или 0x7F). Функция iswcntrl
возвращает ненулевое значение, если c является расширенным управляющим
символом. Каждая из этих подпрограмм возвращает значение 0, если c не
удовлетворяет условию теста.
Версии этих функций с суффиксом _l используют переданный параметр языкового
стандарта вместо текущего языкового стандарта. Для получения дополнительной
информации см. Locale.

Поведение iscntrl и _iscntrl_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istcntrl iscntrl iscntrl iswcntrl

_istcntrl_l _iscntrl_l _iscntrl_l _iswcntrl_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

iscntrl <ctype.h>

iswcntrl <ctype.h> или <wchar.h>

_iscntrl_l <ctype.h>

_iswcntrl_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


_isctype , iswctype , _isctype_l ,
_iswctype_l
Статья • 03.04.2023

Проверяет c свойство, указанное ctype аргументом desc . Для каждого


допустимого desc значения существует эквивалентная подпрограмма
классификации расширенных символов.

Синтаксис
C

int _isctype(

int c,

_ctype_t desc

);

int _isctype_l(

int c,

_ctype_t desc,

_locale_t locale

);

int iswctype(

wint_t c,

wctype_t desc

);

int _iswctype_l(

wint_t c,

wctype_t desc,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

desc

Свойство для проверки. Свойство обычно извлекается с помощью ctype или


wctype.

locale

Языковой стандарт, используемый для любых зависящих от языкового стандарта


проверок.
Возвращаемое значение
_isctype и iswctype возвращает ненулевое значение, если c свойство указано в

текущем языковом desc стандарте. В противном случае они возвращают значение


0. Версии этих функций с суффиксом _l идентичны, за исключением того, что для
поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

Поведение _isctype и _isctype_l не определено, если c не EOF или в диапазоне


от 0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

Недоступно _isctype Недоступно _iswctype

Недоступно _isctype_l Недоступно _iswctype_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_isctype <ctype.h>

iswctype <ctype.h> или <wchar.h>

_isctype_l <ctype.h>

_iswctype_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


iscsym , iscsymf , __iscsym , __iswcsym ,
__iscsymf , __iswcsymf , _iscsym_l ,
_iswcsym_l , _iscsymf_l , _iswcsymf_l
Статья • 03.04.2023

Определяет, представляет ли целое число символ, который может использоваться


в идентификаторе.

Синтаксис
C

int __iscsym(

int c

);

int __iswcsym(

wint_t c

);

int __iscsymf(

int c

);

int __iswcsymf(

wint_t c

);

int _iscsym_l(

int c,

_locale_t locale

);

int _iswcsym_l(

wint_t c,

_locale_t locale

);

int _iscsymf_l(

int c,

_locale_t locale

);

int _iswcsymf_l(

wint_t c,

_locale_t locale

);

#define iscsym __iscsym

#define iscsymf __iscsymf

Параметры
c

Проверяемое целое число. Для версии этой функции, не предназначенной для


расширенных символов, значение c должно находиться в диапазоне 0–255.

locale

Используемый языковой стандарт.

Возвращаемое значение
Функции __iscsym и __iswcsym возвращают ненулевое значение, если c
представляет собой букву, цифру или знак подчеркивания. Функции __iscsymf и
__iswcsymf возвращают ненулевое значение, если c представляет собой букву или
знак подчеркивания. Каждая из этих подпрограмм возвращает значение 0, если c
не удовлетворяет условию теста. Версии этих функций с суффиксом _l идентичны,
за исключением того, что они используют locale переданный вместо текущего
языкового стандарта для поведения, зависящее от языкового стандарта. Для
получения дополнительной информации см. Locale.

Комментарии
Эти подпрограммы реализуются в виде макросов за исключением случаев, когда
определен макрос препроцессора _CTYPE_DISABLE_MACROS. При использовании
версий этих подпрограмм, реализованных в виде макроса, аргументы могут
вычисляться несколько раз. При использовании выражений со списками
аргументов следует соблюдать осторожность.

Для обратной совместимости и iscsymf определяются как макросы только в том


случае, iscsym если __STDC__ они не определены или не определены как 0; в
противном случае они не определены.

Требования
Подпрограмма Обязательный
заголовок

iscsym , iscsymf , __iscsym , __iswcsym , __iscsymf , __iswcsymf , _iscsym_l , C: <ctype.h>

_iswcsym_l , _iscsymf_l , _iswcsymf_l


C++: <cctype или
<ctype.h>>
, iscsym ,
iscsymf __iswcsymf __iswcsym __iscsym _iscsym_l _iswcsym_l __iscsymf _iscsymf_l и
_iswcsymf_l подпрограммы относятся к корпорации Майкрософт. Дополнительные

сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isdigit , iswdigit , _isdigit_l ,
_iswdigit_l
Статья • 03.04.2023

Определяет, представляет ли целое число символ десятичной цифры.

Синтаксис
C

int isdigit(

int c

);

int iswdigit(

wint_t c

);

int _isdigit_l(

int c,

_locale_t locale

);

int _iswdigit_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление символа десятичной цифры. isdigit возвращает
ненулевое значение, если c это десятичная цифра (0 – 9). Функция iswdigit
возвращает ненулевое значение, если c представляет собой расширенный символ,
соответствующий символу десятичной цифры. Каждая из этих подпрограмм
возвращает значение 0, если c не удовлетворяет условию теста.
Версии этих функций с суффиксом _l используют переданный параметр языкового
стандарта вместо текущего языкового стандарта для поведения, зависящего от
языкового стандарта. Для получения дополнительной информации см. Locale.

Поведение isdigit и _isdigit_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istdigit isdigit _ismbcdigit iswdigit

_istdigit_l _isdigit_l _ismbcdigit_l _iswdigit_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

isdigit <ctype.h>

iswdigit <ctype.h> или <wchar.h>

_isdigit_l <ctype.h>

_iswdigit_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isfinite , _finite , _finitef
Статья • 03.04.2023

Определяет, является ли значение с плавающей запятой конечным.

Синтаксис
C

int isfinite(

/* floating-point */ x

); /* C-only macro */

template <class FloatingType>

inline bool isfinite(

FloatingType x

) throw(); /* C++-only template function */

int _finite(

double x

);

int _finitef(

float x

); /* x64 and ARM/ARM64 only */

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
Макрос isfinite и _finite _finitef функции возвращают ненулевое значение,
если x является нормальным или субнормальным конечным значением. Они
возвращают значение 0, если аргумент является бесконечным или naN. Встроенная
функция isfinite шаблона C++ работает так же, но возвращает true или false .

Комментарии
isfinite — это макрос при компиляции как C и встроенная функция шаблона при

компиляции как C++. Функции _finite и _finitef функции зависят от корпорации


Майкрософт. Функция _finitef доступна только в случае компиляции для
платформ x86, ARM или ARM64.

Требования
Компонент Обязательный заголовок Обязательный заголовок (C++)
(C)

_finite <float.h> или <math.h> <float.h>, <math.h>, <cfloat> или


<cmath>

isfinite , <math.h> <math.h> или <cmath>


_finitef

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
fpclassify

_fpclass, _fpclassf

isinf

isnan, _isnan, _isnanf

isnormal
isgraph , iswgraph , _isgraph_l ,
_iswgraph_l
Статья • 03.04.2023

Определяет, представляет ли целое число графический символ.

Синтаксис
C

int isgraph(

int c

);

int iswgraph(

wint_t c

);

int _isgraph_l(

int c,

_locale_t locale

);

int _iswgraph_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление печатного символа (кроме пробела). Функция isgraph
возвращает ненулевое значение, если c представляет собой печатный символ,
отличный от пробела. Функция iswgraph возвращает ненулевое значение, если c
представляет собой расширенный печатный символ, отличный от расширенного
символа пробела. Каждая из этих подпрограмм возвращает значение 0, если c
условие теста не удовлетворяет.
Версии этих функций с суффиксом _l используют переданный параметр языкового
стандарта вместо текущего языкового стандарта для поведения, зависящего от
языкового стандарта. Для получения дополнительной информации см. Locale.

Поведение isgraph и _isgraph_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istgraph isgraph _ismbcgraph iswgraph

_istgraph_l _isgraph_l _ismbcgraph_l _iswgraph_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

isgraph <ctype.h>

iswgraph <ctype.h> или <wchar.h>

_isgraph_l <ctype.h>

_iswgraph_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isgreater , isgreaterequal , isless ,
islessequal , islessgreater , isunordered
Статья • 03.04.2023

Определяет связь упорядочения между двумя значениями с плавающей запятой.

Синтаксис
C

int isgreater(

/* floating-point */ x,

/* floating-point */ y

); /* C-only macro */

int isgreaterequal(

/* floating-point */ x,

/* floating-point */ y

); /* C-only macro */

int isless(

/* floating-point */ x,

/* floating-point */ y

); /* C-only macro */

int islessequal(

/* floating-point */ x,

/* floating-point */ y

); /* C-only macro */

int islessgreater(

/* floating-point */ x,

/* floating-point */ y

); /* C-only macro */

int isunordered(

/* floating-point */ x,

/* floating-point */ y

); /* C-only macro */

C++

template <class FloatingType1, class FloatingType2>

inline bool isgreater(

FloatingType1 x,

FloatingType2 y

) throw(); /* C++-only template function */

template <class FloatingType1, class FloatingType2>

inline bool isgreaterequal(

FloatingType1 x,

FloatingType2 y

) throw(); /* C++-only template function */

template <class FloatingType1, class FloatingType2>

inline bool isless(

FloatingType1 x,

FloatingType2 y

) throw(); /* C++-only template function */

template <class FloatingType1, class FloatingType2>

inline bool islessequal(

FloatingType1 x,

FloatingType2 y

) throw(); /* C++-only template function */

template <class FloatingType1, class FloatingType2>

inline bool islessgreater(

FloatingType1 x,

FloatingType2 y

) throw(); /* C++-only template function */

template <class FloatingType1, class FloatingType2>

inline bool isunordered(

FloatingType1 x,

FloatingType2 y

) throw(); /* C++-only template function */

Параметры
x, y

Сравниваемые значения с плавающей запятой.

Возвращаемое значение
Во всех сравнениях бесконечности одного знака сравниваются как равные.
Отрицательная бесконечность меньше, чем любое конечное значение или
положительная бесконечность. Положительная бесконечность больше, чем любое
конечное значение или отрицательная бесконечность. Нули равны независимо от
знака. Значения NaN не меньше, равны или больше, чем любое значение, включая
другое значение NaN.

Если ни один из аргументов не является naN, макросы


isgreater isgreaterequal упорядочения , isless и islessequal возвращает
ненулевое значение, если указанное отношение упорядочения между x и y имеет
значение true. Эти макросы возвращают значение 0, если либо оба аргумента
являются naN, либо если отношение упорядочения имеет значение false. Формы
функции ведут себя одинаково, но возвращают true или false .

Макрос islessgreater возвращает ненулевое значение, если и то x и другое, и y


не naN, а x также меньше или больше y . Он возвращает значение 0, если одно
или оба аргумента являются naN, или если значения равны. Форма функции ведет
себя так же, но возвращает true или false .

Макрос isunordered возвращает ненулевое значение, y если x одно из них или оба
являются naN. В противном случае возвращается значение 0. Форма функции ведет
себя так же, но возвращает true или false .

Комментарии
Эти операции сравнения реализуются как макросы при компиляции как C, а также
как встроенные функции шаблона при компиляции как C++.

Требования
Компонент Обязательный Обязательный заголовок
заголовок (C) (C++)

isgreater , isgreaterequal , <math.h> <math.h> или <cmath>


isless ,

islessequal , islessgreater ,
isunordered

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
isfinite, _finite, _finitef

isinf

isnan, _isnan, _isnanf

_fpclass, _fpclassf
isinf
Статья • 03.04.2023

Определяет, является ли значение с плавающей запятой бесконечностью.

Синтаксис
C

int isinf(

/* floating-point */ x

); /* C-only macro */

template <class FloatingType>

inline bool isinf(

FloatingType x

) throw(); /* C++-only template function */

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
isinf возвращает ненулевое значение ( true в коде C++), если аргумент x
является положительным или отрицательным бесконечностью. isinf возвращает
значение 0 ( false в коде C++), если аргумент является конечным или NAN.
Обычные и субнормальные значения с плавающей запятой считаются конечными.

Комментарии
isinf — это макрос при компиляции как C и встроенная функция шаблона при

компиляции как C++.

Требования
Компонент Обязательный заголовок (C) Обязательный заголовок (C++)
Компонент Обязательный заголовок (C) Обязательный заголовок (C++)

isinf <math.h> <math.h> или <cmath>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
fpclassify

_fpclass, _fpclassf

isfinite, _finite, _finitef

isnan, _isnan, _isnanf

isnormal
isleadbyte , _isleadbyte_l
Статья • 03.04.2023

Определяет, является ли символ начальным байтом многобайтового символа.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int isleadbyte( int c );

int _isleadbyte_l( int c );

Параметры
c

Проверяемое целое число.

Возвращаемое значение
isleadbyte возвращает ненулевое значение, если аргумент удовлетворяет условию

теста. В противном случае возвращается значение 0. В языковом стандарте "C" и в


языковых стандартах однобайтовой кодировки (SBCS) isleadbyte всегда
возвращает значение 0.

Комментарии
Макрос isleadbyte возвращает ненулевое значение, если его аргумент является
первым байтом многобайтового символа. isleadbyte создает значимый результат
для любого целочисленного аргумента от -1 () до UCHAR_MAX ( EOF 0xFF),
включительно.
Ожидаемый тип аргумента isleadbyte — int . Если передается символ со знаком,
компилятор может преобразовать его в целое число по расширению знака,
создавая непредсказуемые результаты.

Версия этой функции с суффиксом _l идентична, однако для поведения,


определяемого языковым стандартом, вместо текущего языкового стандарта в ней
используется переданный языковой стандарт.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istleadbyte Всегда возвращает _isleadbyte Всегда возвращает


значение false значение false

Требования
Подпрограмма Обязательный заголовок

isleadbyte <ctype.h>

_isleadbyte_l <ctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

Локаль

_ismbb Процедуры
islower , iswlower , _islower_l ,
_iswlower_l
Статья • 03.04.2023

Определяет, представляет ли целое число символ в нижнем регистре.

Синтаксис
C

int islower(

int c

);

int iswlower(

wint_t c

);

int islower_l(

int c,

_locale_t locale

);

int _iswlower_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление символа в нижнем регистре. islower возвращает
ненулевое значение, если c это символ нижнего регистра (a – z). Функция iswlower
возвращает ненулевое значение только в том случае, если c является
расширенным символом, соответствующим букве в нижнем регистре, или если c
принадлежит определяемому реализацией набору расширенных символов, для
которых iswcntrl , iswdigit , iswpunct или iswspace не равны нулю. Каждая из этих
подпрограмм возвращает значение 0, если c не удовлетворяет условию теста.

Версии этих функций с суффиксом _l используют переданный параметр языкового


стандарта вместо текущего языкового стандарта для поведения, зависящего от
языкового стандарта. Для получения дополнительной информации см. Locale.

Поведение islower и _islower_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istlower islower _ismbclower iswlower

_istlower_l _islower _l _ismbclower_l _liswlower_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

islower <ctype.h>

iswlower <ctype.h> или <wchar.h>

_islower_l <ctype.h>

_swlower_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


_ismbbalnum , _ismbbalnum_l
Статья • 03.04.2023

Определяет, является ли указанный многобайтовый символ буквой или цифрой.

Синтаксис
C

int _ismbbalnum(

unsigned int c

);

int _ismbbalnum_l(

unsigned int c

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbalnum возвращает ненулевое значение, если выражение:

isalnum(c) || _ismbbkalnum(c)

ненулевое значение для c или 0, если выражение равно нулю.

Версия этой функции с суффиксом _l идентична, однако для поведения,


определяемого языковым стандартом, вместо текущего языкового стандарта в ней
используется переданный языковой стандарт.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок

_ismbbalnum <mbctype.h>

_ismbbalnum_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbalpha , _ismbbalpha_l
Статья • 03.04.2023

Определяет, является ли указанный многобайтовой символ альфа-символом.

Синтаксис
C

int _ismbbalpha(

unsigned int c

);

int _ismbbalpha_l(

unsigned int c

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbalpha возвращает ненулевое значение, если выражение:

isalpha(c) || _ismbbkalnum(c)

ненулевое значение для c или 0, если выражение равно нулю. Функция _ismbbalpha
использует текущий языковой стандарт для любых параметров символов,
зависящих от языкового стандарта. Функция _ismbbalpha_l идентична за
исключением того, что использует переданный языковой стандарт.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок

_ismbbalpha <mbctype.h>

_ismbbalpha_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbblank , _ismbbblank_l
Статья • 03.04.2023

Определяет, является ли указанный многобайтовый символ пустым символом.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbbblank(

unsigned int c

);

int _ismbbblank_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Функция _ismbbblank возвращает ненулевое значение, если c представляет пробел
(0x20), символ горизонтальной табуляции (0x09) или знак языкового стандарта,
используемый для разделения слов в строке текста, для которого isspace имеет
значение true. В противном случае возвращается 0. Функция _ismbbblank использует
текущий языковой стандарт для любого поведения, зависящего от языкового
стандарта. Функция _ismbbblank_l идентична за исключением того, что использует
переданный языковой стандарт. Для получения дополнительной информации см.
Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbbblank <mbctype.h>

_ismbbblank_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbgraph , _ismbbgraph_l
Статья • 03.04.2023

Определяет, является ли определенный многобайтовый символ графическим


символом.

Синтаксис
C

int _ismbbgraph (

unsigned int c

);

int _ismbbgraph_l (

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает ненулевое значение, если выражение:

isctype(c, ( _PUNCT | _UPPER | _LOWER | _DIGIT )) || _ismbbkprint(c)

ненулевое значение для c , или 0, если оно равно нулю. Функция _ismbbgraph
использует текущий языковой стандарт для любого поведения, зависящего от
языкового стандарта. Функция _ismbbgraph_l идентична за исключением того, что
использует переданный языковой стандарт. Для получения дополнительной
информации см. Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbbgraph <mbctype.h>

_ismbbgraph_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbkalnum , _ismbbkalnum_l
Статья • 03.04.2023

Определяет, является ли определенный многобайтовый символ текстовым


символом, не входящим в набор ASCII.

Синтаксис
C

int _ismbbkalnum(

unsigned int c

);

int _ismbbkalnum_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbkalnum возвращает ненулевое значение, если целое число c является

символом текста, отличного от символа препинания, отличного от символа


препинания. В противном случае возвращается значение 0. Функция _ismbbkalnum
использует текущий языковой стандарт для получения сведений о символах,
зависящих от языкового стандарта. Функция _ismbbkalnum_l идентична функции
_ismbbkalnum за тем исключением, что принимает в качестве параметра языковой

стандарт. Для получения дополнительной информации см. Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbbkalnum <mbctype.h>

_ismbbkalnum_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbkana , _ismbbkana_l
Статья • 03.04.2023

Проверяет на наличие символа катакана; относится к кодовой странице 932.

Синтаксис
C

int _ismbbkana(

unsigned int c

);

int _ismbbkana_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbkana возвращает ненулевое значение, если целое число c является
символом катаканы. В противном случае возвращается значение 0.
Функция _ismbbkana использует текущий языковой стандарт для получения
сведений о символах, зависящих от языкового стандарта. Функция _ismbbkana_l
идентична, за исключением того, что она использует переданный объект
языкового стандарта. Для получения дополнительной информации см. Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок

_ismbbkana <mbctype.h>

_ismbbkana_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbkprint , _ismbbkprint_l
Статья • 03.04.2023

Определяет, является ли определенный многобайтовый символ знаком


препинания.

Синтаксис
C

int _ismbbkprint(

unsigned int c

);

int _ismbbkprint_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbkprint возвращает ненулевое значение, если целое число c является

текстовым или символом препинания, отличного от ASCII. В противном случае


возвращается значение 0. Например, только для кодовой страницы 932,
_ismbbkprint проверяет на принадлежность к алфавитно-цифровым или

пунктуационным символам катаканы (диапазон: 0xA1–0xDF). Функция _ismbbkprint


использует текущий языковой стандарт для параметров символов, зависящих от
языкового стандарта. Функция _ismbbkprint_l идентична за исключением того, что
использует переданный языковой стандарт. Для получения дополнительной
информации см. Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbbkprint <mbctype.h>

_ismbbkprint_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbkpunct , _ismbbkpunct_l
Статья • 03.04.2023

Проверяет, является ли многобайтовый символ знаком препинания.

Синтаксис
C

int _ismbbkpunct(

unsigned int c

);

int _ismbbkpunct_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbkpunct возвращает ненулевое значение, если целое число c представляет
собой символ знака препинания, не входящий в набор ASCII. В противном случае
возвращается значение 0. Например, только для кодовой страницы 932,
_ismbbkpunct проверяет на принадлежность к пунктуационным символам катаканы.
Функция _ismbbkpunct использует текущий языковой стандарт для любых
параметров символов, зависящих от языкового стандарта. Функция _ismbbkpunct_l
идентична, за исключением того, что используется переданный языковой стандарт.
Для получения дополнительной информации см. Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbbkpunct <mbctype.h>

_ismbbkpunct_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbblead , _ismbblead_l
Статья • 03.04.2023

Проверяет символ, чтобы определить, является ли он ведущим байтом


многобайтового символа.

Синтаксис
C

int _ismbblead(

unsigned int c

);

int _ismbblead_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает ненулевое значение, если целочисленное значение c является
первым байтом многобайтового символа.

Комментарии
Многобайтовые символы состоят из старшего байта, за которым следует конечный
байт. Старшие байты относятся к определенному диапазону данной кодировки.
Например, только на кодовой странице 932 в диапазоне от 0x81 — 0x9F и 0xE0 —
0xFC.

Функция _ismbblead использует текущий языковой стандарт для поведения,


зависящего от языкового стандарта. Функция _ismbblead_l идентична за
исключением того, что использует переданный языковой стандарт. Для получения
дополнительной информации см. Locale.

Если языковой стандарт — UTF-8 и _ismbblead _ismbblead_l всегда возвращает


значение 0 (false), является ли c байтом свинца или нет.

_ismbblead и _ismbblead_l являются конкретными корпорацией Майкрософт, а не

частью стандартной библиотеки C. Мы не рекомендуем использовать их, где


требуется переносимый код. Для совместимости c уровня "Стандартный"
используйте mbrlen вместо него.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE Определенные


Tchar.h определены Определенные

_istlead Всегда возвращает _ismbblead Всегда возвращает


значение false значение false

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_ismbblead <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

_ismbblead_l <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

* Для констант манифестов, используемых в условиях проверки.

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры

mbrlen
_ismbbprint , _ismbbprint_l
Статья • 03.04.2023

Определяет, является ли указанный многобайтовой символ печатным символом.

Синтаксис
C

int _ismbbprint(

unsigned int c

);

int _ismbbprint_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbprint возвращает ненулевое значение, если выражение:

isprint(c) || _ismbbkprint(c)

ненулевое значение для c , или 0, если это не так. Функция _ismbbprint использует
текущий языковой стандарт для любого поведения, зависящего от языкового
стандарта. Функция _ismbbprint_l идентична за исключением того, что использует
переданный языковой стандарт. Для получения дополнительной информации см.
Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbbprint <mbctype.h>

_ismbbprint_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbpunct , _ismbbpunct_l
Статья • 03.04.2023

Определяет, является ли определенный символ знаком препинания.

Синтаксис
C

int _ismbbpunct(

unsigned int c

);

int _ismbbpunct_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbpunct возвращает ненулевое значение, если целое число c представляет
собой символ знака препинания, не входящий в набор ASCII. Функция _ismbbpunct
использует текущий языковой стандарт для любых параметров символов,
зависящих от языкового стандарта. Функция _ismbbpunct_l идентична, за
исключением того, что используется переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок

_ismbbpunct <mbctype.h>

_ismbbpunct_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbbtrail , _ismbbtrail_l
Статья • 03.04.2023

Определяет, является ли байт конечным байтом многобайтового символа.

Синтаксис
C

int _ismbbtrail(

unsigned int c

);

int _ismbbtrail_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Целое число, которое требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbbtrail возвращает ненулевое значение, если целочисленное значение c
является вторым байтом многобайтового символа. Например, только для кодовой
страницы 932, допустимые диапазоны: 0x40–0x7E и 0x80–0xFC.

Комментарии
Функция _ismbbtrail использует текущий языковой стандарт для поведения,
зависящего от языкового стандарта. Функция _ismbbtrail_l идентична за
исключением того, что использует переданный языковой стандарт. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_ismbbtrail <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

_ismbbtrail_l <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

* Для констант манифестов, используемых в условиях проверки.

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов

_ismbb Процедуры
_ismbcalnum , _ismbcalnum_l ,
_ismbcalpha , _ismbcalpha_l ,
_ismbcdigit , _ismbcdigit_l
Статья • 03.04.2023

Проверяет, является ли многобайтовый символ буквенно-цифровым, буквенным


или цифровым.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbcalnum

unsigned int c

);

int _ismbcalnum_l

unsigned int c,

_locale_t locale

);

int _ismbcalpha

unsigned int c

);

int _ismbcalpha_l

unsigned int c,

_locale_t locale

);

int _ismbcdigit

unsigned int c

);

int _ismbcdigit_l

unsigned int c,

_locale_t locale

);

Параметры
c

Символ, который требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если символ
удовлетворяет условию теста. В противном случае они возвращают значение 0.
Если c <= 255 и имеется соответствующая _ismbb подпрограмма (например,
_ismbcalnum соответствует _ismbbalnum ), результатом является возвращаемое

значение соответствующей _ismbb подпрограммы.

Комментарии
Каждая из этих подпрограмм проверяет определенный многобайтовый символ на
соответствие заданному условию.

Версии этих функций с суффиксом _l идентичны, за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

Подпрограмма Условие Пример кодовой страницы 932


теста

_ismbcalnum , Буквенно- Возвращает отличное от нуля значение только в том случае,


_ismbcalnum_l цифровой если c  — однобайтовое представление английской буквы в
коде ASCII: см. примеры для _ismbcdigit и _ismbcalpha .

_ismbcalpha , По Возвращает ненулевое, только если c однобайтовое


_ismbcalpha_l алфавиту представление буквы ASCII на английском языке: 0x41<==
< c 0x5A или 0x61<= c <=0x7A; или буква катаканы:
0xA6<= c <=0xDF.
Подпрограмма Условие Пример кодовой страницы 932
теста

_ismbcdigit , Цифровой Возвращает ненулевое значение, только если c


_ismbcdigit_l однобайтовое представление цифры ASCII: 0x30<= c <=0x39.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbcalnum , _ismbcalnum_l <mbstring.h>

_ismbcalpha , _ismbcalpha_l <mbstring.h>

_ismbcdigit , _ismbcdigit_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

_ismbc Процедуры

is, isw подпрограммы

_ismbb Процедуры
_ismbcgraph , _ismbcgraph_l ,
_ismbcprint , _ismbcprint_l ,
_ismbcpunct , _ismbcpunct_l ,
_ismbcblank , _ismbcblank_l ,
_ismbcspace , _ismbcspace_l
Статья • 03.04.2023

Определяет, является ли символ графическим, отображаемым символом, знаком


препинания или пробелом.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbcgraph(

unsigned int c

);

int _ismbcgraph_l(

unsigned int c,

_locale_t locale

);

int _ismbcprint(

unsigned int c

);

int _ismbcprint_l(

unsigned int c,

_locale_t locale

);

int _ismbcpunct(

unsigned int c

);

int _ismbcpunct_l(

unsigned int c,

_locale_t locale

);

int _ismbcblank(

unsigned int c

);

int _ismbcblank_l(

unsigned int c,

_locale_t locale

);

int _ismbcspace(

unsigned int c

);

int _ismbcspace_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Символ, который требуется определить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если символ
удовлетворяет условию теста. В противном случае они возвращают значение 0.
Если c <= 255 и имеется соответствующая _ismbb подпрограмма (например,
_ismbcalnum соответствует _ismbbalnum ), результатом будет возвращаемое значение

соответствующей _ismbb подпрограммы.

Версии этих функций с суффиксом _l идентичны за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

Комментарии
Каждая из этих функций проверяет определенный многобайтовый символ на
соответствие заданному условию.

Подпрограмма Условие теста Пример кодовой страницы 932


Подпрограмма Условие теста Пример кодовой страницы 932

_ismbcgraph GRAPHIC Возвращает ненулевое значение только в том случае,


если c является однобайтовым представлением
любого печатного символа ASCII или катакана, кроме
пробела.

_ismbcprint Печатные Возвращает ненулевое значение только в том случае,


символы если c является однобайтовым представлением
любого печатного символа ASCII или катакана, включая
пробел.

_ismbcpunct Пунктуация Возвращает ненулевое значение только в том случае,


если c является однобайтовым представлением
любого знака препинания ASCII или катаканы.

_ismbcblank Пробелы или Возвращает ненулевое значение только в том случае,


символы если c является символом пробела или
горизонтальной горизонтальной табуляции: c =0x20 или c =0x09
табуляции соответственно.

_ismbcspace Пробел Возвращает ненулевое значение, если и только если c


является символом пробела: c =0x20 или
0x09<= c <=0x0D.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbcgraph <mbstring.h>

_ismbcgraph_l <mbstring.h>

_ismbcprint <mbstring.h>

_ismbcprint_l <mbstring.h>

_ismbcpunct <mbstring.h>

_ismbcpunct_l <mbstring.h>

_ismbcblank <mbstring.h>

_ismbcblank_l <mbstring.h>
Подпрограмма Обязательный заголовок

_ismbcspace <mbstring.h>

_ismbcspace_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Классификация символов

Локаль

Интерпретация последовательностей многобайтовых символов

_ismbc Процедуры

is, isw подпрограммы

_ismbb Процедуры
_ismbchira , _ismbchira_l , _ismbckata ,
_ismbckata_l
Статья • 03.04.2023

Функции, относящиеся к кодовой странице 932

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbchira(

unsigned int c

);

int _ismbchira_l(

unsigned int c,

_locale_t locale

);

int _ismbckata(

unsigned int c

);

int _ismbckata_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Символ, который требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если символ
удовлетворяет условию теста. В противном случае они возвращают значение 0.
Если c <= 255 и имеется соответствующая _ismbb подпрограмма (например,
_ismbcalnum соответствует _ismbbalnum ), результатом является возвращаемое
значение соответствующей _ismbb подпрограммы.

Комментарии
Каждая из этих функций проверяет определенный многобайтовый символ на
соответствие заданному условию.

Версии этих функций с суффиксом _l идентичны, за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

Подпрограмма Условие теста (только для кодовой страницы 932)

_ismbchira Double-byte Hiragana: 0x829F<= c <=0x82F1.

_ismbchira_l Double-byte Hiragana: 0x829F<= c <=0x82F1.

_ismbckata Двухбайтовый катакана: 0x8340<= c <=0x8396.

_ismbckata_l Двухбайтовый катакана: 0x8340<= c <=0x8396.

Конечная кодовая страница 932

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbchira <mbstring.h>

_ismbchira_l <mbstring.h>

_ismbckata <mbstring.h>

_ismbckata_l <mbstring.h>
Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

_ismbc Процедуры

is, isw подпрограммы

Локаль

Интерпретация последовательностей многобайтовых символов


_ismbcl0 , _ismbcl0_l , _ismbcl1 ,
_ismbcl1_l , _ismbcl2 , _ismbcl2_l
Статья • 03.04.2023

Функции, относящиеся к кодовой странице 932, использующие текущий языковой


стандарт или заданную категорию состояния преобразования LC_CTYPE.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbcl0(

unsigned int c

);

int _ismbcl0_l(

unsigned int c,

_locale_t locale

);

int _ismbcl1(

unsigned int c

);

int _ismbcl1_l(

unsigned int c ,

_locale_t locale

);

int _ismbcl2(

unsigned int c

);

int _ismbcl2_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Символ, который требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если символ
удовлетворяет условию теста. В противном случае они возвращают значение 0.
Если c <= 255 и имеется соответствующая _ismbb подпрограмма (например,
_ismbcalnum соответствует _ismbbalnum ), результатом является возвращаемое
значение соответствующей _ismbb подпрограммы.

Комментарии
Каждая из этих функций проверяет определенный многобайтовый символ на
соответствие заданному условию.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

Подпрограмма Условие теста (только для кодовой страницы 932)

_ismbcl0 JIS non-Kanji: 0x8140<= c <=0x889E.

_ismbcl0_l JIS non-Kanji: 0x8140<= c <=0x889E.

_ismbcl1 УРОВЕНЬ JIS-1: 0x889F<= c <=0x9872.

_ismbcl1_l УРОВЕНЬ JIS-1: 0x889F<= c <=0x9872.

_ismbcl2 JIS level-2: 0x989F<= c <=0xEAA4.

_ismbcl2_l JIS level-2: 0x989F<= c <=0xEAA4.

Функции проверяют, соответствует ли указанное значение c условиям теста,


описанным выше, но не проверяйте, что c это допустимый многобайтовый
символ. Если младший байт находится в диапазонах 0x00–0x3F, 0x7F или 0xFD–0xFF,
эти функции возвращают ненулевое значение, указывающее, что символ
удовлетворяет условию теста. Используется _ismbbtrail для проверки того,
определен ли многобайтовый символ.

Конечная кодовая страница 932

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_ismbcl0 <mbstring.h>

_ismbcl0_l <mbstring.h>

_ismbcl1 <mbstring.h>

_ismbcl1_l <mbstring.h>

_ismbcl2 <mbstring.h>

_ismbcl2_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

_ismbc Процедуры

is, isw подпрограммы


_ismbclegal , _ismbclegal_l ,
_ismbcsymbol , _ismbcsymbol_l
Статья • 03.04.2023

Проверяет, является ли многобайтовый допустимым символьным знаком.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbclegal(

unsigned int c

);

int _ismbclegal_l(

unsigned int c,

_locale_t locale

);

int _ismbcsymbol(

unsigned int c

);

int _ismbcsymbol_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Символ, который требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если символ
удовлетворяет условию теста. В противном случае они возвращают значение 0.
Если c <= 255 и имеется соответствующая _ismbb подпрограмма (например,
_ismbcalnum соответствует _ismbbalnum ), результатом является возвращаемое
значение соответствующей _ismbb подпрограммы.

Комментарии
Каждая из этих функций проверяет определенный многобайтовый символ на
соответствие заданному условию.

Версии этих функций с суффиксом _l идентичны, за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

Подпрограмма Условие теста Пример кодовой страницы 932

_ismbclegal Допустимый Возвращает ненулевое значение только в том случае,


многобайтовый если первый байт c находится в диапазонах 0x81–0x9F
символ или 0xE0–0xFC, а второй — в диапазонах 0x40–0x7E или
0x80–FC.

_ismbcsymbol Многобайтовый Возвращает ненулевое значение, если и только если


символ 0x8141<= c <=0x81AC.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE Определенные


Tchar.h определены Определенные

_istlegal Всегда возвращает _ismbclegal Всегда возвращает


значение false значение false.

_istlegal_l Всегда возвращает _ismbclegal_l Всегда возвращает


значение false значение false.

Требования
Подпрограмма Обязательный заголовок

_ismbclegal , _ismbclegal_l <mbstring.h>

_ismbcsymbol , _ismbcsymbol_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

_ismbc Процедуры

is, isw подпрограммы

_ismbb Процедуры
_ismbclower , _ismbclower_l ,
_ismbcupper , _ismbcupper_l
Статья • 03.04.2023

Проверяет, имеет ли многобайтовый символ нижний или верхний регистр.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbclower(

unsigned int c

);

int _ismbclower_l(

unsigned int c,

_locale_t locale

);

int _ismbcupper(

unsigned int c

);

int _ismbcupper_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Символ, который требуется проверить.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает ненулевое значение, если символ
удовлетворяет условию теста. В противном случае они возвращают значение 0.
Если c <= 255 и имеется соответствующая _ismbb подпрограмма (например,
_ismbcalnum соответствует _ismbbalnum ), результатом является возвращаемое
значение соответствующей _ismbb подпрограммы.

Комментарии
Каждая из этих функций проверяет определенный многобайтовый символ на
соответствие заданному условию.

Версии этих функций с суффиксом _l идентичны, за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

Подпрограмма Условие Пример кодовой страницы 932


теста

_ismbclower Строчные Возвращает ненулевое значение, только если c


буквы однобайтовое представление строчной буквы ASCII в
нижнем регистре: 0x61<= c <=0x7A.

_ismbclower_l Строчные Возвращает ненулевое значение, только если c


буквы однобайтовое представление строчной буквы ASCII в
нижнем регистре: 0x61<= c <=0x7A.

_ismbcupper Прописные Возвращает ненулевое значение, только если c


буквы однобайтовое представление буквы в верхнем регистре
ASCII: 0x41<= c <=0x5A.

_ismbcupper_l Прописные Возвращает ненулевое значение, только если c


буквы однобайтовое представление буквы в верхнем регистре
ASCII: 0x41<= c <=0x5A.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_ismbclower <mbstring.h>

_ismbclower_l <mbstring.h>

_ismbcupper <mbstring.h>

_ismbcupper_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

_ismbc Процедуры

Локаль

Интерпретация последовательностей многобайтовых символов

is, isw подпрограммы

_ismbb Процедуры
_ismbslead , _ismbstrail , _ismbslead_l ,
_ismbstrail_l
Статья • 03.04.2023

Выполняет контекстно-зависимые тесты для старших и младших байтов


многобайтовой символьной строки и определяет, указывает ли указатель данной
подстроки старший или младший байт.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ismbslead(

const unsigned char *str,

const unsigned char *current

);

int _ismbstrail(

const unsigned char *str,

const unsigned char *current

);

int _ismbslead_l(

const unsigned char *str,

const unsigned char *current,

_locale_t locale

);

int _ismbstrail_l(

const unsigned char *str,

const unsigned char *current,

_locale_t locale

);

Параметры
str

Указатель на начало строки или на предыдущий известный старший байт.


current

Указатель на позицию в строке, которую нужно протестировать.

locale

Используемый языковой стандарт.

Возвращаемое значение
_ismbslead возвращает значение -1, если символ является ведущим байтом и
_ismbstrail возвращает значение -1, если символ является байтом следа. Если

входные строки являются допустимыми, но не являются байтами свинца или следа,


эти функции возвращают ноль. Если один из аргументов имеет значение NULL ,
вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если продолжение выполнения разрешено, эти функции
возвращают NULL и устанавливают для errno значение EINVAL .

Комментарии
_ismbslead и _ismbstrail выполняются медленнее, чем версии _ismbblead и
_ismbbtrail , так как учитывает контекст строки.

Версии этих функций с суффиксом _l идентичны за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_ismbslead <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

_ismbstrail <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

_ismbslead_l <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

_ismbstrail_l <mbctype.h> или <mbstring.h> <ctype.h>,* <limits.h>, <stdlib.h>

* Для констант манифестов, используемых в условиях проверки.


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

_ismbc Процедуры

is, isw подпрограммы

_ismbb Процедуры
isnan , _isnan , _isnanf
Статья • 03.04.2023

Проверяет, является ли значение с плавающей запятой naN ("Не число").

Синтаксис
C

int isnan(

/* floating-point */ x

); /* C-only macro */

int _isnan(

double x

);

int _isnanf(

float x

); /* x64 only */

template <class T>

bool isnan(

T x

) throw(); /* C++ only */

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
В C макрос и _isnan _isnanf функции возвращают ненулевое значение, isnan если
аргумент x является naN; в противном случае они возвращают значение 0.

В C++ isnan функция шаблона возвращает true значение, если аргумент x


является naN; в противном случае возвращается false .

Комментарии
Так как значение NaN не сравнивается как равное самому себе или любому
другому значению NaN, чтобы определить его, необходимо использовать одну из
этих функций или макросов. Значение NaN создается, если результат операции с
плавающей запятой не может быть представлен в формате с плавающей запятой
IEEE-754 для указанного типа. Сведения о том, как представляется naN для
выходных данных, см. в разделе printf.

При компиляции как C++ isnan макрос не определен, и isnan вместо этого
определяется функция шаблона. Он ведет себя так же, как макрос, но возвращает
значение типа bool вместо целого числа.

_isnanf Эти _isnan функции зависят от корпорации Майкрософт. Функция _isnanf

доступна только при компиляции для x64.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

isnan , _isnanf <math.h> <math.h> или <cmath>

_isnan <float.h> <float.h> или <cfloat>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
fpclassify

_fpclass, _fpclassf

isfinite, _finite, _finitef

isinf

isnormal
isnormal
Статья • 03.04.2023

Определяет, является ли значение с плавающей запятой нормальным.

Синтаксис
C

int isnormal(

/* floating-point */ x

); /* C-only macro */

template <class FloatingType>

inline bool isnormal(

FloatingType x

) throw(); /* C++-only function template */

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
isnormal возвращает ненулевое значение ( true в коде C++), если аргумент x не
равен нулю, субнормальному, бесконечному или naN. isnormal В противном
случае возвращает значение 0 ( false в коде C++).

Комментарии
isnormal — это макрос, скомпилированный как C, и встроенный шаблон функции
при компиляции как C++.

Требования
Компонент Обязательный заголовок (C) Обязательный заголовок (C++)

isnormal <math.h> <math.h> или <cmath>


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
isfinite, _finite, _finitef

isinf

isnan, _isnan, _isnanf

_fpclass, _fpclassf
ispunct , iswpunct , _ispunct_l ,
_iswpunct_l
Статья • 03.04.2023

Определяет, представляет ли целое число знак препинания.

Синтаксис
C

int ispunct(

int c

);

int iswpunct(

wint_t c

);

int _ispunct_l(

int c,

_locale_t locale

);

int _iswpunct_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление знака препинания. ispunct возвращает ненулевое
значение для любого печатного символа, который не является пробелом или
символом, для которого isalnum не является ненулевой. iswpunct возвращает
ненулевое значение для любого печатного широкого символа, который не
является символом ширины пробела или расширенным символом, для которого
iswalnum ненулевое значение. Каждая из этих подпрограмм возвращает значение

0, если c не удовлетворяет условию теста.

Результат условия теста для ispunct функции зависит от LC_CTYPE параметра


категории языкового стандарта. Дополнительные сведения см. в разделе setlocale.
_wsetlocale Версии этих функций, у которых _l нет суффикса, используют текущий
языковой стандарт для поведения, зависящее от языкового стандарта. Версии, _l
имеющие суффикс, идентичны, за исключением того, что они используют
переданный языковой стандарт. Для получения дополнительной информации см.
Locale.

Поведение ispunct и _ispunct_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istpunct ispunct _ismbcpunct iswpunct

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

ispunct <ctype.h>

iswpunct <ctype.h> или <wchar.h>

_ispunct_l <ctype.h>

_iswpunct_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Классификация символов

Локаль

is, isw подпрограммы


isprint , iswprint , _isprint_l ,
_iswprint_l
Статья • 03.04.2023

Определяет, представляет ли целое число печатный символ.

Синтаксис
C

int isprint(

int c

);

int iswprint(

wint_t c

);

int _isprint_l(

int c,

_locale_t locale

);

int _iswprint_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление печатного символа. isprint возвращает ненулевое
значение, если c является печатным символом (0x20 — 0x7E), включая символ
пробела. iswprint возвращает ненулевое значение, если c является печатаемым
расширенным символом, включая символ пробела. Каждая из этих подпрограмм
возвращает 0, если c не соответствует условию теста.
Результат условия теста для этих функций зависит LC_CTYPE от параметра категории
языкового стандарта. Дополнительные сведения см. в разделеsetlocale . _wsetlocale
Версии этих функций без _l суффикса используют текущий языковой стандарт для
любого поведения, зависящее от языкового стандарта; версии, имеющие суффикс
_l , идентичны, за исключением того, что они используют переданный языковой

стандарт. Для получения дополнительной информации см. Locale.

Поведение isprint и _isprint_l не определено, если c не является EOF или


находится в диапазоне от 0 до 0xFF включительно. Если используется отладочная
библиотека CRT и c не является одним из этих значений, функции вызывают
утверждение.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istprint isprint _ismbcprint iswprint

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

isprint <ctype.h>

iswprint <ctype.h> или <wchar.h>

_isprint_l <ctype.h>

_iswprint_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isspace , iswspace , _isspace_l ,
_iswspace_l
Статья • 03.04.2023

Определяет, представляет ли целое число символ пробела.

Синтаксис
C

int isspace(

int c

);

int iswspace(

wint_t c

);

int _isspace_l(

int c,

_locale_t locale

);

int _iswspace_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление символа пробела. isspace возвращает ненулевое
значение, если c является символом пробела (0x09 — 0x0D или 0x20). Результат
условия теста для isspace функции зависит LC_CTYPE от параметра категории
языкового стандарта. Дополнительные сведения см. в разделеsetlocale , _wsetlocale.
Версии этих функций, у которых нет суффикса _l , используют текущий языковой
стандарт для любого поведения, зависящее от языкового стандарта. Версии с
суффиксом _l идентичны, за исключением того, что они используют переданный
языковой стандарт. Для получения дополнительной информации см. Locale.

Функция iswspace возвращает ненулевое значение, если c представляет собой


расширенный символ, соответствующий стандартному расширенному пробелу.

Поведение isspace и _isspace_l не определено, если c не является EOF или


находится в диапазоне от 0 до 0xFF включительно. Если используется отладочная
библиотека CRT и c не является одним из этих значений, функции вызывают
утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istspace isspace _ismbcspace iswspace

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

isspace <ctype.h>

iswspace <ctype.h> или <wchar.h>

_isspace_l <ctype.h>

_iswspace_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isupper , _isupper_l , iswupper ,
_iswupper_l
Статья • 03.04.2023

Определяет, представляет ли целое число символ в верхнем регистре.

Синтаксис
C

int isupper(

int c

);

int _isupper_l (

int c,

_locale_t locale

);

int iswupper(

wint_t c

);

int _iwsupper_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление буквы в верхнем регистре. isupper возвращает
ненулевое значение, если c является символом верхнего регистра (A – Z). Функция
iswupper возвращает ненулевое значение только в том случае, если c является

расширенным символом, соответствующим букве в верхнем регистре, или если c


принадлежит определяемому реализацией набору расширенных символов, для
которых iswcntrl , iswdigit , iswpunct или iswspace не равны нулю. Каждая из этих
подпрограмм возвращает значение 0, если c условие теста не удовлетворяет.

Версии этих функций с суффиксом _l используют переданный параметр языкового


стандарта вместо текущего языкового стандарта для поведения, зависящего от
языкового стандарта. Для получения дополнительной информации см. Locale.

Поведение isupper и _isupper_l не определено, если c не EOF или в диапазоне от


0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS Определенные _UNICODE


TCHAR.H определены Определенные

_istupper isupper _ismbcupper iswupper

_istupper_l _isupper_l _ismbclower, _ismbclower_l, _iswupper_l


_ismbcupper, _ismbcupper_l

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

isupper <ctype.h>

_isupper_l <ctype.h>

iswupper <ctype.h> или <wchar.h>

_iswupper_l <ctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


isxdigit , iswxdigit , _isxdigit_l ,
_iswxdigit_l
Статья • 03.04.2023

Определяет, представляет ли целое число шестнадцатеричный символ.

Синтаксис
C

int isxdigit(

int c

);

int iswxdigit(

wint_t c

);

int _isxdigit_l(

int c,

_locale_t locale

);

int _iswxdigit_l(

wint_t c,

_locale_t locale

);

Параметры
c

Проверяемое целое число.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает отличное от нуля значение, если c  —
конкретное представление шестнадцатеричного символа. isxdigit возвращает
ненулевое значение, если c является шестнадцатеричной цифрой (A - F, a - f или 0
– 9). Функция iswxdigit возвращает ненулевое значение, если c представляет
собой расширенный символ, соответствующий шестнадцатеричному символу.
Каждая из этих подпрограмм возвращает значение 0, если c условие теста не
удовлетворяет.

Для языкового стандарта iswxdigit C функция не поддерживает


шестнадцатеричные шестнадцатеричные символы Юникода.

Версии этих функций с суффиксом _l используют переданный параметр языкового


стандарта вместо текущего языкового стандарта для поведения, зависящего от
языкового стандарта. Для получения дополнительной информации см. Locale.

Поведение isxdigit и _isxdigit_l не определено, если c не EOF или в диапазоне


от 0 до 0xFF включительно. Если используется отладочная библиотека CRT и c не
является одним из этих значений, функции вызывают утверждение.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_istxdigit isxdigit isxdigit iswxdigit

Комментарии
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

isxdigit <ctype.h>

iswxdigit <ctype.h> или <wchar.h>

_isxdigit_l <ctype.h>

_iswxdigit_l <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация символов

Локаль

is, isw подпрограммы


itoa , _itoa , ltoa , _ltoa , ultoa ,
_ultoa , _i64toa , _ui64toa , _itow ,
_ltow , _ultow , _i64tow , _ui64tow
Статья • 03.04.2023

Преобразует целое число в строку. Доступны более безопасные версии этих


функций, см. раздел_itoa_s " _itow_s Функции".

Синтаксис
C

char * _itoa( int value, char *buffer, int radix );

char * _ltoa( long value, char *buffer, int radix );

char * _ultoa( unsigned long value, char *buffer, int radix );

char * _i64toa( long long value, char *buffer, int radix );

char * _ui64toa( unsigned long long value, char *buffer, int radix );

wchar_t * _itow( int value, wchar_t *buffer, int radix );

wchar_t * _ltow( long value, wchar_t *buffer, int radix );

wchar_t * _ultow( unsigned long value, wchar_t *buffer, int radix );

wchar_t * _i64tow( long long value, wchar_t *buffer, int radix );

wchar_t * _ui64tow( unsigned long long value, wchar_t *buffer, int radix );

// These POSIX versions of the functions have deprecated names:

char * itoa( int value, char *buffer, int radix );

char * ltoa( long value, char *buffer, int radix );

char * ultoa( unsigned long value, char *buffer, int radix );

// The following template functions are C++ only:

template <size_t size>

char *_itoa( int value, char (&buffer)[size], int radix );

template <size_t size>

char *_itoa( long value, char (&buffer)[size], int radix );

template <size_t size>

char *_itoa( unsigned long value, char (&buffer)[size], int radix );

template <size_t size>

char *_i64toa( long long value, char (&buffer)[size], int radix );

template <size_t size>

char * _ui64toa( unsigned long long value, char (&buffer)[size], int radix
);

template <size_t size>

wchar_t * _itow( int value, wchar_t (&buffer)[size], int radix );

template <size_t size>

wchar_t * _ltow( long value, wchar_t (&buffer)[size], int radix );

template <size_t size>

wchar_t * _ultow( unsigned long value, wchar_t (&buffer)[size], int radix );

template <size_t size>

wchar_t * _i64tow( long long value, wchar_t (&buffer)[size], int radix );

template <size_t size>

wchar_t * _ui64tow( unsigned long long value, wchar_t (&buffer)[size],

int radix );

Параметры
value

Число, которое требуется преобразовать.

buffer

Буфер, содержащий результат преобразования.

radix

База, используемая для преобразования value , которая должна находиться в


диапазоне от 2 до 36.

size

Длина буфера в единицах символьного типа. Этот параметр выводится из


аргумента buffer в C++.

Возвращаемое значение
Каждая из этих функций возвращает указатель на buffer . Ошибка не возвращается.

Комментарии
Функции _itoa , , _ltoa и _i64toa _ui64toa _ultoa функции преобразуют цифры
заданного value аргумента в строку символов, завершающейся значением NULL, и
сохраняют результат (до 33 символов для _itoa , _ltoa и, а также _ultoa 65 для
_i64toa и _ui64toa ) в buffer . Если radix значение равно 10 и value

отрицательное, первым символом сохраненной строки является знак минуса (-).


Функции _itow , , и _i64tow _ultow _ui64tow _ltow функции являются расширенными
версиями символов _itoa , , _ltoa , _ultoa _i64toa и _ui64toa соответственно.

) Важно!

Эти функции могут записывать данные за конец буфера, который слишком


мал. Чтобы предотвратить переполнение буфера, убедитесь, что достаточно
большой, чтобы buffer содержать преобразованные цифры, а также
конечный пустой символ и знак. Неправильное использование этих функций
может привести к серьезным проблемам безопасности в коде.

Из-за потенциальных проблем с безопасностью по умолчанию эти функции


вызывают предупреждение об устаревании C4996: эта функция или переменная
могут быть небезопасными. Вместо этого рассмотрите возможность
использования safe_function . Чтобы отключить нерекомендуемую функцию,
используйте _CRT_SECURE_NO_WARNINGS . Рекомендуется изменить исходный код,
чтобы он использовался safe_function в сообщении с предупреждением. Более
безопасные функции не записывают больше символов, чем указанный размер
буфера. Дополнительные сведения см. в разделе _itoa_s" _itow_s Функции".

Чтобы использовать эти функции без предупреждения об устаревании, определите


_CRT_SECURE_NO_WARNINGS макрос препроцессора перед включением заголовков CRT.

Его можно определить, добавив /D_CRT_SECURE_NO_WARNINGS параметр компилятора


в cl команду. В противном случае определите макрос в исходных файлах. Если вы
используете предварительно скомпилированные заголовки, определите макрос в
верхней части файла включения pch.h предкомпилированного заголовка ( stdafx.h
в Visual Studio 2017 и более ранних версиях). Чтобы определить макрос в исходном
коде, используйте директиву #define перед включением любого заголовка CRT, как
показано в следующем примере:

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdlib.h>

В C++эти функции имеют перегрузки шаблонов, которые вызывают их более


безопасные аналоги. Дополнительные сведения см. в разделе "Безопасные
перегрузки шаблонов".

По умолчанию глобальное состояние этих функций ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Имена itoa ltoa POSIX и ultoa существуют в качестве псевдонимов для
_itoa функций и _ultoa функций _ltoa . Имена POSIX являются устаревшими, так
как они не соответствуют соглашениям о именах глобальных функций,
относящихся к реализации, iso C. По умолчанию эти функции вызывают
предупреждение об устаревании C4996: имя POSIX для этого элемента устарело.
Вместо этого используйте соответствующее имя ISO C и C++. new_name Мы
рекомендуем изменить исходный код, чтобы использовать более безопасные
версии этих функций, _itoa_s _ltoa_s или _ultoa_s . Дополнительные сведения см. в
разделе _itoa_s" _itow_s Функции".

Для переносимости исходного кода вы можете сохранить имена POSIX в коде.


Чтобы использовать эти функции без предупреждения об устаревании, определите
_CRT_NONSTDC_NO_WARNINGS макросы и _CRT_SECURE_NO_WARNINGS макросы
препроцессора перед включением заголовков CRT. Их можно определить, добавив
/D_CRT_SECURE_NO_WARNINGS параметры компилятора в /D_CRT_NONSTDC_NO_WARNINGS cl
команду. В противном случае определите макросы в исходных файлах. Если вы
используете предварительно скомпилированные заголовки, определите макросы в
верхней части предварительно скомпилированного файла включаемого заголовка.
Чтобы определить макросы в исходном коде, используйте #define директивы
перед включением любого заголовка CRT, как показано в следующем примере:

#define _CRT_NONSTDC_NO_WARNINGS 1

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdlib.h>

Максимальное число макросов преобразования


Для создания безопасных буферов для преобразований CRT включает некоторые
удобные макросы. Эти макросы определяют размер буфера, необходимый для
преобразования самого длинного возможного значения каждого целочисленного
типа, включая символ конца NULL и знак для нескольких общих баз. Чтобы
убедиться, что буфер преобразования достаточно велик, чтобы получить любое
преобразование в базовой базе radix , используйте один из этих определенных
макросов при выделении буфера. Макросы помогают предотвратить ошибки
переполнения буфера при преобразовании целочисленных типов в строки. Эти
макросы определяются при включении stdlib.h или wchar.h в источник.

Чтобы использовать один из этих макросов в функции преобразования строк,


объявите буфер преобразования соответствующего типа символов и используйте
значение макроса для целочисленного типа и базы в качестве измерения буфера. В
этой таблице перечислены макросы, подходящие для каждой функции для
перечисленных баз:

Функции radix Макросы

_itoa , _itow 16
_MAX_ITOSTR_BASE16_COUNT

10
_MAX_ITOSTR_BASE10_COUNT

8
_MAX_ITOSTR_BASE8_COUNT

2 _MAX_ITOSTR_BASE2_COUNT

_ltoa , _ltow 16
_MAX_LTOSTR_BASE16_COUNT

10
_MAX_LTOSTR_BASE10_COUNT

8
_MAX_LTOSTR_BASE8_COUNT

2 _MAX_LTOSTR_BASE2_COUNT

_ultoa , _ultow 16
_MAX_ULTOSTR_BASE16_COUNT

10
_MAX_ULTOSTR_BASE10_COUNT

8
_MAX_ULTOSTR_BASE8_COUNT

2 _MAX_ULTOSTR_BASE2_COUNT

_i64toa , _i64tow 16
_MAX_I64TOSTR_BASE16_COUNT

10
_MAX_I64TOSTR_BASE10_COUNT

8
_MAX_I64TOSTR_BASE8_COUNT

2 _MAX_I64TOSTR_BASE2_COUNT

_ui64toa , _ui64tow 16
_MAX_U64TOSTR_BASE16_COUNT

10
_MAX_U64TOSTR_BASE10_COUNT

8
_MAX_U64TOSTR_BASE8_COUNT

2 _MAX_U64TOSTR_BASE2_COUNT

В этом примере используется макрос счетчика преобразований для определения


достаточно большого буфера unsigned long long для хранения в базе 2:

C++

#include <wchar.h>

#include <iostream>

int main()

wchar_t buffer[_MAX_U64TOSTR_BASE2_COUNT];

std:wcout << _ui64tow(0xFFFFFFFFFFFFFFFFull, buffer, 2) << std::endl;

Сопоставления подпрограмм универсального текста


Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_itot _itoa _itoa _itow

_ltot _ltoa _ltoa _ltow

_ultot _ultoa _ultoa _ultow

_i64tot _i64toa _i64toa _i64tow

_ui64tot _ui64toa _ui64toa _ui64tow

Требования
Подпрограмма Обязательный заголовок

itoa , ltoa , ultoa <stdlib.h>

_itoa , _ltoa , _ultoa , _i64toa , _ui64toa <stdlib.h>

_itow , _ltow , _ultow , _i64tow , _ui64tow <stdlib.h> или <wchar.h>

Эти функции и макросы зависят от Майкрософт. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
В этом примере демонстрируется использование некоторых функций
преобразования целых чисел. Обратите внимание на использование
_CRT_SECURE_NO_WARNINGS макроса для молчания предупреждения C4996.

// crt_itoa.c

// Compile by using: cl /W4 crt_itoa.c

// This program makes use of the _itoa functions

// in various examples.

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h> // for printf

#include <string.h> // for strnlen

#include <stdlib.h> // for _countof, _itoa fns, _MAX_COUNT macros

int main(void)

char buffer[_MAX_U64TOSTR_BASE2_COUNT];

int r;

for (r = 10; r >= 2; --r)

_itoa(-1, buffer, r);

printf("base %d: %s (%d chars)\n", r, buffer,

strnlen(buffer, _countof(buffer)));

printf("\n");

for (r = 10; r >= 2; --r)

_i64toa(-1LL, buffer, r);

printf("base %d: %s (%d chars)\n", r, buffer,

strnlen(buffer, _countof(buffer)));

printf("\n");

for (r = 10; r >= 2; --r)

_ui64toa(0xffffffffffffffffULL, buffer, r);

printf("base %d: %s (%d chars)\n", r, buffer,

strnlen(buffer, _countof(buffer)));

Output

base 10: -1 (2 chars)

base 9: 12068657453 (11 chars)

base 8: 37777777777 (11 chars)

base 7: 211301422353 (12 chars)

base 6: 1550104015503 (13 chars)

base 5: 32244002423140 (14 chars)


base 4: 3333333333333333 (16 chars)

base 3: 102002022201221111210 (21 chars)

base 2: 11111111111111111111111111111111 (32 chars)

base 10: -1 (2 chars)

base 9: 145808576354216723756 (21 chars)

base 8: 1777777777777777777777 (22 chars)

base 7: 45012021522523134134601 (23 chars)

base 6: 3520522010102100444244423 (25 chars)

base 5: 2214220303114400424121122430 (28 chars)

base 4: 33333333333333333333333333333333 (32 chars)

base 3: 11112220022122120101211020120210210211220 (41 chars)

base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64


chars)

base 10: 18446744073709551615 (20 chars)

base 9: 145808576354216723756 (21 chars)

base 8: 1777777777777777777777 (22 chars)

base 7: 45012021522523134134601 (23 chars)

base 6: 3520522010102100444244423 (25 chars)

base 5: 2214220303114400424121122430 (28 chars)

base 4: 33333333333333333333333333333333 (32 chars)

base 3: 11112220022122120101211020120210210211220 (41 chars)

base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64


chars)

См. также:
Преобразование данных

_itoa_s, _itow_s функции


_itoa_s , _ltoa_s , _ultoa_s , _i64toa_s ,
_ui64toa_s , _itow_s , _ltow_s , _ultow_s ,
_i64tow_s , _ui64tow_s
Статья • 03.04.2023

Преобразует целое число в строку. Эти функции являются версиями _itoaфункций с


усовершенствованиями безопасности, _itow как описано в функциях безопасности
в CRT.

Синтаксис
C

errno_t _itoa_s( int value, char * buffer, size_t size, int radix );

errno_t _ltoa_s( long value, char * buffer, size_t size, int radix );

errno_t _ultoa_s( unsigned long value, char * buffer, size_t size, int radix
);

errno_t _i64toa_s( long long value, char *buffer,

size_t size, int radix );

errno_t _ui64toa_s( unsigned long long value, char *buffer,

size_t size, int radix );

errno_t _itow_s( int value, wchar_t *buffer,

size_t size, int radix );

errno_t _ltow_s( long value, wchar_t *buffer,

size_t size, int radix );

errno_t _ultow_s( unsigned long value, wchar_t *buffer,

size_t size, int radix );

errno_t _i64tow_s( long long value, wchar_t *buffer,

size_t size, int radix );

errno_t _ui64tow_s( unsigned long long value, wchar_t *buffer,

size_t size, int radix

);

// These template functions are C++ only:

template <size_t size>

errno_t _itoa_s( int value, char (&buffer)[size], int radix );

template <size_t size>

errno_t _ltoa_s( long value, char (&buffer)[size], int radix );

template <size_t size>

errno_t _ultoa_s( unsigned long value, char (&buffer)[size], int radix );

template <size_t size>

errno_t _itow_s( int value, wchar_t (&buffer)[size], int radix );

template <size_t size>

errno_t _ltow_s( long value, wchar_t (&buffer)[size], int radix );

template <size_t size>

errno_t _ultow_s( unsigned long value, wchar_t (&buffer)[size], int radix );

Параметры
value

Число, которое требуется преобразовать.

buffer

Выходной буфер, содержащий результат преобразования.

size

buffer Размер символов или расширенных символов.

radix

Радикс или числовая база для преобразования value , которая должна находиться в
диапазоне от 2 до 36.

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи. Если
применяется любое из следующих условий, функция вызывает обработчик
недопустимых параметров, как описано в разделе "Проверка параметров".

Условия ошибок

значение buffer size radix Возвращает

any NULL any any EINVAL

any any <=0 any EINVAL

any any <= длина требуемой строки any EINVAL


результата

any any any radix < 2 или EINVAL


radix > 36

Проблемы с безопасностью
Эти функции могут создать нарушение доступа, если buffer не указывает на
допустимую память и не NULL является, или если длина буфера недостаточно
длинна для хранения результирующих строк.

Комментарии
За исключением параметров и возвращаемого значения, семейства функций
_itow_s имеют то же поведение, _itoa_s что и соответствующие менее
безопасные _itoa и _itow версии.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

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


для преобразования самого длинного возможного значения каждого
целочисленного типа, включая признак конца NULL и символ знака для нескольких
общих баз. Дополнительные сведения см. в разделе "Максимальное число
макросов преобразования".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_itot_s _itoa_s _itoa_s _itow_s

_ltot_s _ltoa_s _ltoa_s _ltow_s

_ultot_s _ultoa_s _ultoa_s _ultow_s

_i64tot_s _i64toa_s _i64toa_s _i64tow_s


Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_ui64tot_s _ui64toa_s _ui64toa_s _ui64tow_s

Требования
Подпрограмма Обязательный заголовок

_itoa_s , _ltoa_s , _ultoa_s , _i64toa_s , _ui64toa_s <stdlib.h>

_itow_s , _ltow_s , _ultow_s , _i64tow_s , _ui64tow_s <stdlib.h> или <wchar.h>

Эти функции зависят от корпорации Майкрософт. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
В этом примере показано использование нескольких функций преобразования
целых чисел. Макрос _countof работает только для определения размера буфера,
когда объявление массива отображается компилятору, а не для параметров,
которые разлагались на указатели.

// crt_itoa_s.c

// Compile by using: cl /W4 crt_itoa_s.c

#include <stdlib.h> // for _itoa_s functions, _countof, count macro

#include <stdio.h> // for printf

#include <string.h> // for strnlen

int main( void )

char buffer[_MAX_U64TOSTR_BASE2_COUNT];

int r;

for ( r = 10; r >= 2; --r )

_itoa_s( -1, buffer, _countof(buffer), r );

printf( "base %d: %s (%d chars)\n",

r, buffer, strnlen(buffer, _countof(buffer)) );

printf( "\n" );

for ( r = 10; r >= 2; --r )

_i64toa_s( -1LL, buffer, _countof(buffer), r );

printf( "base %d: %s (%d chars)\n",

r, buffer, strnlen(buffer, _countof(buffer)) );

printf( "\n" );

for ( r = 10; r >= 2; --r )

_ui64toa_s( 0xffffffffffffffffULL, buffer, _countof(buffer), r );

printf( "base %d: %s (%d chars)\n",

r, buffer, strnlen(buffer, _countof(buffer)) );

Output

base 10: -1 (2 chars)

base 9: 12068657453 (11 chars)

base 8: 37777777777 (11 chars)

base 7: 211301422353 (12 chars)

base 6: 1550104015503 (13 chars)

base 5: 32244002423140 (14 chars)


base 4: 3333333333333333 (16 chars)

base 3: 102002022201221111210 (21 chars)

base 2: 11111111111111111111111111111111 (32 chars)

base 10: -1 (2 chars)

base 9: 145808576354216723756 (21 chars)

base 8: 1777777777777777777777 (22 chars)

base 7: 45012021522523134134601 (23 chars)

base 6: 3520522010102100444244423 (25 chars)

base 5: 2214220303114400424121122430 (28 chars)

base 4: 33333333333333333333333333333333 (32 chars)

base 3: 11112220022122120101211020120210210211220 (41 chars)

base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64


chars)

base 10: 18446744073709551615 (20 chars)

base 9: 145808576354216723756 (21 chars)

base 8: 1777777777777777777777 (22 chars)

base 7: 45012021522523134134601 (23 chars)

base 6: 3520522010102100444244423 (25 chars)

base 5: 2214220303114400424121122430 (28 chars)

base 4: 33333333333333333333333333333333 (32 chars)

base 3: 11112220022122120101211020120210210211220 (41 chars)

base 2: 1111111111111111111111111111111111111111111111111111111111111111 (64


chars)

См. также:
Преобразование данных

_itoa, _itow функции


j0 , j1 , jn
Статья • 03.04.2023

Имена j0 j1 функций POSIX, реализованные корпорацией Майкрософт, и jn


являются устаревшими псевдонимами для _j0функций и _j1_jn функций. По
умолчанию они создают предупреждение компилятора (уровень 3) C4996. Имена
являются устаревшими, так как они не соответствуют стандартным правилам C для
имен, относящихся к реализации. Однако функции по-прежнему поддерживаются.

Вместо этого рекомендуется использовать _j0и _j1_jn вместо этого. Вы также


можете продолжать использовать эти имена функций и отключить
предупреждение. Дополнительные сведения см. в разделе "Отключение имен
предупреждений и функций POSIX".
kbhit
Статья • 03.04.2023

Имя kbhit функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _kbhit функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _kbhit . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_kbhit
Статья • 03.04.2023

Проверяет консоль на предмет ввода с клавиатуры.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _kbhit( void );

Возвращаемое значение
Функция _kbhit возвращает ненулевое значение, если была нажата клавиша. В
противном случае возвращается значение 0.

Комментарии
Функция _kbhit проверяет консоль на предмет недавнего нажатия клавиши. Если
функция возвращает ненулевое значение, нажатие клавиши ожидает в буфере.
Программа может затем вызвать _getch или _getche для получения нажатия
клавиши.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_kbhit <conio.h>
Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_kbhit.c

// compile with: /c

/* This program loops until the user

* presses a key. If _kbhit returns nonzero, a

* keystroke is waiting in the buffer. The program

* can call _getch or _getche to get the keystroke.

*/

#include <conio.h>

#include <stdio.h>

int main( void )

/* Display message until key is pressed. */

while( !_kbhit() )

_cputs( "Hit me!! " );

/* Use _getch to throw key away. */

printf( "\nKey struck was '%c'\n", _getch() );

Пример полученных результатов


Output

Hit me!! Hit me!! Hit me!! Hit me!! Hit me!! Hit me!! Hit me!!

Key struck was 'q'

См. также раздел


Ввод-вывод на консоль и порт
ldexp , ldexpf , ldexpl
Статья • 03.04.2023

Умножает число с плавающей запятой на целую степень числа два.

Синтаксис
C

double ldexp(

double x,

int exp

);

float ldexpf(

float x,

int exp

);

long double ldexpl(

long double x,

int exp

);

#define ldexp(X, INT) // Requires C11 or higher

float ldexp(

float x,

int exp

); // C++ only

long double ldexp(

long double x,

int exp

); // C++ only

Параметры
x

Значение с плавающей запятой.

exp

Целый показатель степени.

Возвращаемое значение
При ldexp успешном выполнении x функции возвращают значение *2 exp . При
переполнении x ldexp и в зависимости от знака возвращает +/- HUGE_VAL значение
errno ERANGE .

Дополнительные сведения о errno и возможных значениях возвращаемых ошибок


см. в разделе errno, , _doserrno_sys_errlistи _sys_nerr.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки ldexp , которые
принимают типы float или long double . В программе C, если вы не используете
<макрос tgmath.h> для вызова этой функции, ldexp всегда принимает double и
int возвращает значение double .

При использовании <макроса tgmath.h> ldexp() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Заголовок C Заголовок C++

ldexp , ldexpf , ldexpl <math.h> <cmath>

ldexp Макрос <tgmath.h>

Сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_ldexp.c

#include <math.h>

#include <stdio.h>

int main( void )

double x = 4.0, y;

int p = 3;

y = ldexp( x, p );

printf( "%2.1f times two to the power of %d is %2.1f\n", x, p, y );

Выходные данные
Output

4.0 times two to the power of 3 is 32.0

См. также
Поддержка математических функций для чисел с плавающей запятой
frexp

modf, modff, modfl


div , ldiv , lldiv
Статья • 03.04.2023

Вычисляет частное и остаток от деления двух целочисленных значений.

Синтаксис
C

div_t div(

int numer,

int denom

);

ldiv_t ldiv(

long numer,

long denom

);

lldiv_t lldiv(

long long numer,

long long denom

);

C++

ldiv_t div(

long numer,

long denom

); /* C++ only */

lldiv_t div(

long long numer,

long long denom

); /* C++ only */

Параметры
numer

Числитель.

denom

Знаменатель.

Возвращаемое значение
div вызывается с помощью аргументов типа int , возвращает структуру типа

div_t , которая содержит кворот и оставшуюся часть. Возвращаемое значение с


аргументами типа long равно , а возвращаемое значение с аргументами типа long
long lldiv_t . ldiv_t ldiv_t lldiv_t И div_t типы определяются в <stdlib.h>.

Комментарии
Функция div делится numer на denom и вычисляет цитент и оставшуюся часть.
Структура div_t содержит частное ( quot ) и остаток ( rem ). Знак цитаты совпадает со
знаком математического кворента. Его абсолютное значение является крупнейшим
целым числом, которое меньше абсолютного значения математического кворента.
Если знаменатель равен 0, выполнение программы прекратится и появится
сообщение об ошибке.

Перегрузки, которые принимают аргументы div типа long или long long доступны
только для кода C++. Возвращаемые типы ldiv_t и lldiv_t содержат элементы quot ,
rem которые имеют те же значения, что и члены div_t .

Требования
Подпрограмма Обязательный заголовок

div , ldiv , lldiv <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_div.c

// arguments: 876 13

// This example takes two integers as command-line

// arguments and displays the results of the integer

// division. This program accepts two arguments on the

// command line following the program name, then calls

// div to divide the first argument by the second.

// Finally, it prints the structure members quot and rem.

//

#include <stdlib.h>

#include <stdio.h>

#include <math.h>

int main( int argc, char *argv[] )

int x,y;

div_t div_result;

x = atoi( argv[1] );

y = atoi( argv[2] );

printf( "x is %d, y is %d\n", x, y );

div_result = div( x, y );

printf( "The quotient is %d, and the remainder is %d\n",

div_result.quot, div_result.rem );

Output

x is 876, y is 13

The quotient is 67, and the remainder is 5

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
imaxdiv
lfind
Статья • 03.04.2023

Имя lfind функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _lfind для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _lfind или функцию с повышенным


_lfind_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".
_lfind
Статья • 03.04.2023

Выполняет линейный поиск указанного ключа. Доступна более безопасная версия


этой функции; см _lfind_s.

Синтаксис
C

void *_lfind(

const void *key,

const void *base,

unsigned int *num,

unsigned int width,

int (__cdecl *compare)(const void *, const void *)

);

Параметры
key

Искомый объект.

base

Указатель на начало данных, где будет производиться поиск.

number

Число элементов массива.

width

Ширина элементов массива.

compare

Указатель на подпрограмму сравнения. Первый параметр — это указатель на ключ


для поиска. Второй параметр — это указатель на элемент массива, который будет
сравниваться с ключом.

Возвращаемое значение
Если ключ найден, функция _lfind возвращает указатель на элемент массива base ,
соответствующий key . Если ключ не найден, _lfind возвращается NULL .
Комментарии
Функция _lfind выполняет линейный поиск значения key в массиве из number
элементов шириной width каждый. В отличие от bsearch этого, _lfind не требует
сортировки массива. Аргумент base является указателем на начало массива, в
котором осуществляется поиск. Аргумент compare является указателем на
пользовательскую подпрограмму, которая сравнивает два элемента массива и
возвращает значение, показывающее, как соотносятся их значения. Во время
поиска функция _lfind вызывает подпрограмму compare один или несколько раз,
передавая указатели на два элемента массива при каждом вызове. Подпрограмма
compare должна сравнивать элементы и возвращать либо отличное от нуля

значение (если элементы различаются), либо 0 (если элементы идентичны).

Эта функция проверяет свои параметры. Если compare значение равно или
key number равно base NULL number NULL или ненулевое значение или width меньше

нуля, вызывается обработчик недопустимых параметров, как описано в разделе


"Проверка параметров". Если выполнение может быть продолжено, параметр
errno устанавливается в значение EINVAL , и функция возвращает значение NULL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_lfind <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_lfind.c

// This program uses _lfind to search a string array

// for an occurrence of "hello".

#include <search.h>

#include <string.h>

#include <stdio.h>

int compare(const void *arg1, const void *arg2 )

return( _stricmp( * (char**)arg1, * (char**)arg2 ) );

int main( )

char *arr[] = {"Hi", "Hello", "Bye"};

int n = sizeof(arr) / sizeof(char*);

char **result;

char *key = "hello";

result = (char **)_lfind( &key, arr,

&n, sizeof(char *), compare );

if( result )

printf( "%s found\n", *result );

else

printf( "hello not found!\n" );

Output

Hello found

См. также раздел


Сортировка и поиск

_lfind_s

bsearch

_lsearch

qsort
_lfind_s
Статья • 03.04.2023

Выполняет линейный поиск указанного ключа. Версия _lfind с


усовершенствованиями безопасности, как описано в функциях безопасности в CRT.

Синтаксис
C

void *_lfind_s(

const void *key,

const void *base,

unsigned int *num,

size_t size,

int (__cdecl *compare)(void *, const void *, const void *),

void * context

);

Параметры
key

Искомый объект.

base

Указатель на начало данных, где будет производиться поиск.

number

Число элементов массива.

size

Размер элементов массива в байтах.

compare

Указатель на подпрограмму сравнения. Первый параметр — это указатель context .


Второй параметр — это указатель на ключ для поиска. Третий параметр — это
указатель на элемент массива, который будет сравниваться с ключом.

context

Указатель на объект, доступ к которому может получить функция сравнения.


Возвращаемое значение
Если ключ найден, функция _lfind_s возвращает указатель на элемент массива
base , соответствующий key . Если ключ не найден, _lfind_s возвращается NULL .

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


недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, параметр errno устанавливается в значение
EINVAL , и функция возвращает значение NULL .

Условия ошибок

key base compare number size errno

NULL any any any any EINVAL

any NULL any != 0 any EINVAL

any any any any нуль EINVAL

any any NULL любой any EINVAL

Комментарии
Функция _lfind_s выполняет линейный поиск значения key в массиве из number
элементов шириной size каждый. В отличие от bsearch_s этого, _lfind_s не
требуется сортировка массива. Аргумент base является указателем на начало
массива, в котором осуществляется поиск. Аргумент compare является указателем
на пользовательскую подпрограмму, которая сравнивает два элемента массива и
возвращает значение, показывающее, как соотносятся их значения. Во время
поиска функция _lfind_s вызывает подпрограмму compare один или несколько раз,
передавая указатель context и указатели на два элемента массива при каждом
вызове. Подпрограмма compare должна сравнивать элементы и возвращать либо
отличное от нуля значение (если элементы различаются), либо 0 (если элементы
идентичны).

Функция _lfind_s схожа с _lfind , однако добавляет указатель context к


аргументам функции сравнения и списку параметров функции. Указатель context
может быть полезен, если структура данных, в которой производится поиск,
является частью объекта и функции compare требуется доступ к членам объекта.
Функция compare может привести указатель void к соответствующему типу объекта
и получить доступ к членам этого объекта. Добавление параметра делает _lfind_s
более безопасным, так как можно использовать дополнительный контекст, чтобы
избежать ошибок повторного context входа, связанных с использованием
статических переменных, чтобы сделать данные доступными для compare функции.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_lfind_s <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_lfind_s.cpp

// This program uses _lfind_s to search a string array,

// passing a locale as the context.

// compile with: /EHsc

#include <stdlib.h>

#include <stdio.h>

#include <search.h>

#include <process.h>

#include <locale.h>

#include <locale>

#include <windows.h>

using namespace std;

// The sort order is dependent on the code page. Use 'chcp' at the

// command line to change the codepage. When executing this application,

// the command prompt codepage must match the codepage used here:

#define CODEPAGE_850

#ifdef CODEPAGE_850

// Codepage 850 is the OEM codepage used by the command line,

// so \x00e1 is the German Sharp S

char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",

"weit" };

#define GERMAN_LOCALE "German_Germany.850"

#endif

#ifdef CODEPAGE_1252

// If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df

// for the German Sharp S

char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",

"weit" };

#define GERMAN_LOCALE "German_Germany.1252"

#endif

// The context parameter lets you create a more generic compare.

// Without this parameter, you would have stored the locale in a

// static variable, thus making it vulnerable to thread conflicts

// (if this were a multithreaded program).

int compare( void *pvlocale, const void *str1, const void *str2)

char *s1 = *(char**)str1;

char *s2 = *(char**)str2;

locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

return use_facet< collate<char> >(loc).compare(

s1, s1+strlen(s1),

s2, s2+strlen(s2) );

void find_it( char *key, char *array[], unsigned int num, locale &loc )

char **result = (char **)_lfind_s( &key, array,

&num, sizeof(char *), compare, &loc );

if( result )

printf( "%s found\n", *result );

else

printf( "%s not found\n", key );

int main( )

find_it( "weit", array1, sizeof(array1)/sizeof(char*),


locale(GERMAN_LOCALE) );

Output

weit found

См. также раздел


Сортировка и поиск

bsearch_s

_lsearch_s

qsort_s
_lfind
lgamma , lgammaf , lgammal
Статья • 03.04.2023

Определяет натуральный логарифм абсолютного значения гамма-функции для


указанного значения.

Синтаксис
C

double lgamma( double x );

float lgammaf( float x );

long double lgammal( long double x );

#define lgammal(X) // Requires C11 or higher

float lgamma( float x ); //C++ only

long double lgamma( long double x ); //C++ only

Параметры
x

Вычисляемое значение.

Возвращаемое значение
В случае успеха возвращается естественный логарифм абсолютного значения
гамма-функции x .

Проблема Возвращает

x = не число не число

x = ±0 +INFINITY

x = отрицательное целое число +INFINITY

±INFINITY +INFINITY

Ошибка полюса + HUGE_VAL , + HUGE_VALF , или + HUGE_VALL

Ошибка переполнения диапазона HUGE_VAL ±, ± HUGE_VALF или ± HUGE_VALL

Об ошибках сообщается, как указано в _matherr.


Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции
lgamma , принимающие и возвращающие типы float и long double . В программе C,

если вы не используете <макрос tgmath.h> для вызова этой функции, lgamma


всегда принимает и возвращает double .

Если вы используете <макрос tgmath.h> lgamma() , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

Если x является рациональным числом, эта функция возвращает логарифм


факториала (x – 1).

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

lgamma , lgammaf , lgammal <math.h> <cmath>

lgamma Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

tgamma, tgammaf, tgammal


localeconv
Статья • 03.04.2023

Получает подробные сведения о параметрах языкового стандарта.

Синтаксис
C

struct lconv *localeconv( void );

Возвращаемое значение
localeconv возвращает указатель на заполненный объект типа struct lconv.
Значения, содержащиеся в объекте, копируются из параметров языкового
стандарта в локальном хранилище потока и могут быть перезаписаны
последующими вызовами localeconv . Изменения, внесенные в значения этого
объекта, не изменяют параметры языкового стандарта. setlocale Вызовы со
значениями LC_ALL category , LC_MONETARY или LC_NUMERIC перезапись содержимого
структуры.

Комментарии
Функция localeconv получает подробные сведения о форматировании чисел для
текущего языкового стандарта. Эти сведения хранятся в структуре типа lconv .
Структура, определенная lconv в LOCALE. H содержит следующие элементы:

Поле Значение

decimal_point ,
Указатель на символ десятичной запятой для немонетарных
_W_decimal_point значений.

thousands_sep ,
Указатель на символ, разделяющий группы цифр слева от
_W_thousands_sep десятичной запятой для немонетарных значений.

grouping Указатель на char целое число -size, содержащее размер каждой


группы цифр в немонетарных количествах.
Поле Значение

int_curr_symbol ,
Указатель на международный символ валюты для текущего
_W_int_curr_symbol языкового стандарта. Первые три символа определяют
международный алфавитный символ валюты, как определено в
стандарте ISO 4217. Коды для представления валют и фондов.
Четвертый символ (непосредственно перед нуль-символом)
разделяет международный символ валюты и денежное значение.

currency_symbol ,
Указатель на символ локальной валюты для текущего языкового
_W_currency_symbol стандарта.

mon_decimal_point ,
Указатель на символ десятичной запятой для денежных величин.
_W_mon_decimal_point

mon_thousands_sep ,
Указатель на разделитель для групп цифр слева от десятичного
_W_mon_thousands_sep разряда в денежных количествах.

mon_grouping Указатель на char целое число размера, содержащее размер каждой


группы цифр в денежном количестве.

positive_sign ,
Строка, обозначающая знак для неотрицательных денежных
_W_positive_sign значений.

negative_sign ,
Строка, обозначающая знак для отрицательных денежных значений.
_W_negative_sign

int_frac_digits Число цифр справа от десятичной запятой в международных


форматированных денежных значениях.

frac_digits Число цифр справа от десятичной запятой в форматированных


денежных значениях.

p_cs_precedes Задайте значение 1, если символ валюты предшествует


неотрицательному форматированному денежному значению.
Задайте значение 0, если символ стоит после значения.

p_sep_by_space Задайте значение 1, если символ валюты отделяется пробелом от


неотрицательного форматированного денежного значения.
Установите значение 0, если нет разделения пробелов.

n_cs_precedes Задайте значение 1, если символ валюты предшествует


отрицательному форматированному денежному значению. Задайте
значение 0, если символ следует за значением.

n_sep_by_space Задайте значение 1, если символ валюты отделяется пробелом от


отрицательного форматированного денежного значения. Установите
значение 0, если нет разделения пробелов.

p_sign_posn В неотложных денежных количествах позиции положительного


знака.
Поле Значение

n_sign_posn В отрицательных отформатированных денежных количествах


позиция положительного знака.

За исключением указанных, члены lconv структуры, которые имеют char * и


wchar_t * версии, являются указателями на строки. Любой элемент, равный ""
(или для wchar_t * ), имеет либо нулевую длину, либо L"" не поддерживается в
текущем языковом стандарте. Оба decimal_point и _W_decimal_point всегда
поддерживаются и имеют ненулевое значение.

char Члены структуры являются небольшими не отрицательными числами, а не

символами. Любой член, равный CHAR_MAX , не поддерживается в текущем


языковом стандарте.

Значения grouping и mon_grouping интерпретируются в соответствии со


следующими правилами:

CHAR_MAX — Не выполняйте дальнейшую группировку.

0. Используйте предыдущий элемент для каждой оставшейся цифры.

n — число цифр, составляющих текущую группу. Проверяется следующий

элемент для определения размера следующей группы разрядов перед


текущей группой.

Значения для int_curr_symbol интерпретируются в соответствии со следующими


правилами:

Первые три символа определяют международный алфавитный символ


валюты, как определено в стандарте ISO 4217. Коды для представления
валют и фондов.

Четвертый символ (непосредственно перед нуль-символом) отделяет


международный символ валюты от денежного значения.

Значения для p_cs_precedes и n_cs_precedes интерпретируются в соответствии со


следующими правилами ( n_cs_precedes правило находится в скобках):

0 — символ валюты следует значению неотрицательного (отрицательного)


отформатированного денежного значения.

1 — символ валюты предшествует значению неотрицательного


(отрицательного) отформатированного денежного значения.
Значения для p_sep_by_space и n_sep_by_space интерпретируются в соответствии со
следующими правилами ( n_sep_by_space правило находится в скобках):

0 — символ валюты отделен от значения пробелом для неотрицательного


(отрицательного) отформатированного денежного значения.

1 . Нет разделения пробелов между символом валюты и значением для


неотрицательных (отрицательных) отформатированных денежных значений.

Значения для p_sign_posn и n_sign_posn интерпретируются в соответствии со


следующими правилами:

0 — круглые скобки окружают количество и символ валюты.

1 . Строка знака предшествует количеству и символу валюты.

2 . Строка подписи следует количеству и символу валюты.

3. Строка подписи сразу же предшествует символу валюты.

4 . Строка подписи сразу же следует символу валюты.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

localeconv <locale.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Локаль

setlocale

Функции strcoll

strftime, wcsftime, _strftime_l, _wcsftime_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


localtime , _localtime32 , _localtime64
Статья • 03.04.2023

Преобразует значение времени и корректирует его для местного часового пояса.


Доступны более безопасные версии этих функций; see localtime_s, ,
_localtime64_s_localtime32_s.

Синтаксис
C

struct tm *localtime( const time_t *sourceTime );

struct tm *_localtime32( const __time32_t *sourceTime );

struct tm *_localtime64( const __time64_t *sourceTime );

Параметры
sourceTime

Указатель на сохраненное время.

Возвращаемое значение
Возвращает указатель на результирующую структуру или значение NULL , если дата,
переданная функции, удовлетворяет следующим условиям:

До полуночи 1-го января 1970 года.

После 03:14: 07 19 января 2038 года в формате UTC (при использовании


функций _time32 и time32_t ).

После 23:59:59 31-го декабря 3000 года в формате UTC (при использовании
функций _time64 и __time64_t ).

Функция _localtime64 , которая использует структуру __time64_t , допускает даты до


23:59:59 31 декабря 3000 года в формате UTC, тогда как функция _localtime32
представляет даты до 23:59:59 18 января 2038 года в формате UTC.

localtime — встроенная функция, которая принимает значение _localtime64 и


time_t эквивалентна __time64_t . Если необходимо, чтобы компилятор

принудительно интерпретировал time_t как старое 32-разрядное значение time_t ,


можно определить _USE_32BIT_TIME_T . _USE_32BIT_TIME_T localtime вызывает
вычисление _localtime32 . Не рекомендуется _USE_32BIT_TIME_T , так как
приложение может завершиться сбоем после 18 января 2038 г. и не допускается на
64-разрядных платформах.

Поля типа tm структуры хранят следующие значения, каждый из которых


является: int

Поле Описание

tm_sec Секунды после минуты (0 – 59).

tm_min Минуты после часа (0 – 59).

tm_hour Часы с полуночи (от 0 до 23).

tm_mday День месяца (от 1 до 31).

tm_mon Месяц (0 – 11; Январь = 0).

tm_year Год (текущий год минус 1900).

tm_wday День недели (0 – 6; Воскресенье = 0).

tm_yday День года (0 – 365; 1 января = 0).

tm_isdst Положительное значение, если летнее время действует; 0, если летнее время не
действует; отрицательное значение, если состояние летнего времени неизвестно.

Если задана переменная среды TZ , для реализации перехода на летнее время (DST)
в библиотеке времени выполнения C принимаются правила, подходящие для США.

Комментарии
Функция localtime преобразует время, хранящееся в виде time_t значения, и
сохраняет результат в структуре типа tm. Значение long типа sourceTime
представляет секунды, прошедшие с полуночи (00:00:00) 1-го января 1970 года в
формате UTC. Это значение часто получается из time функции.

32- и 64-разрядные версии функций gmtime, mktime, mkgmtime и localtime


используют для преобразования единственную для потока структуру tm . Каждый
вызов одной из этих подпрограмм уничтожает результат предыдущего вызова.

Функция localtime выполняет коррекцию для местного часового пояса, если


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

( _timezone , _daylight и _tzname ). TZ Если переменная не задана, пытается


использовать сведения о часовом поясе, localtime указанные в приложении даты
и времени в панель управления. Если эти сведения не удается получить, PST8PDT,
которая обозначает тихоокеанский часовой пояс, используется по умолчанию.
Описание этих переменных см _tzset . в описании. TZ представляет собой
расширение Microsoft и не является частью стандарта ANSI для localtime .

7 Примечание

Целевая среда должна попытаться определить, действует ли летнее время.

Эти функции проверяют свои параметры. Если sourceTime это пустой указатель или
sourceTime значение отрицательное, эти функции вызывают обработчик

недопустимых параметров, как описано в разделе "Проверка параметров". Если


выполнение может быть продолжено, эти функции возвращают NULL и
устанавливают параметр errno в значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный Обязательный заголовок
заголовок C C++

localtime , _localtime32 , <time.h> <ctime> или <time.h>


_localtime64

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_localtime.cpp

// compile with: /W3

// This program uses _time64 to get the current time

// and then uses localtime64() to convert this time to a structure

// representing the local time. The program converts the result

// from a 24-hour clock to a 12-hour clock and determines the

// proper extension (AM or PM).

#include <stdio.h>

#include <string.h>

#include <time.h>

int main( void )

struct tm *newtime;

char am_pm[] = "AM";

__time64_t long_time;

_time64( &long_time ); // Get time as 64-bit integer.

// Convert to local time.

newtime = _localtime64( &long_time ); // C4996

// Note: _localtime64 deprecated; consider _localetime64_s

if( newtime->tm_hour > 12 ) // Set up extension.

strcpy_s( am_pm, sizeof(am_pm), "PM" );

if( newtime->tm_hour > 12 ) // Convert from 24-hour

newtime->tm_hour -= 12; // to 12-hour clock.

if( newtime->tm_hour == 0 ) // Set hour to 12 if midnight.

newtime->tm_hour = 12;

char buff[30];

asctime_s( buff, sizeof(buff), newtime );

printf( "%.19s %s\n", buff, am_pm );

Output

Tue Feb 12 10:05:58 AM

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

localtime_s, _localtime32_s, _localtime64_s

time, _time32, _time64

_tzset
localtime_s , _localtime32_s ,
_localtime64_s
Статья • 03.04.2023

Преобразует значение времени в time_t структуру tm и исправляет местный


часовой пояс. Эти функции являются версиями localtime, _localtime32с _localtime64
улучшениями безопасности, описанными в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t localtime_s(

struct tm* const tmDest,

time_t const* const sourceTime

);

errno_t _localtime32_s(

struct tm* tmDest,

__time32_t const* sourceTime

);

errno_t _localtime64_s(

struct tm* tmDest,

__time64_t const* sourceTime

);

Параметры
tmDest

Указатель на структуру времени, которую требуется заполнить.

sourceTime

Указатель на хранимое время.

Возвращаемое значение
Нуль при успешном завершении. Возвращаемое значение — это код ошибки, если
произошел сбой. Коды ошибок определяются в Errno.h . Список этих ошибок см. в
разделе errno.

Условия ошибок
tmDest sourceTime Возвращаемое Значение Вызывает
значение в tmDest обработчик
недопустимого
параметра

NULL any EINVAL Без Да


изменений

Не NULL NULL EINVAL Во всех Да


(указывает на полях
допустимую заданы
память) значения –
1

Не NULL имеет значение EINVAL Во всех Нет


(указывает на меньше 0 или полях
допустимую больше заданы
память) _MAX__TIME64_T значения –
1

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


описано в разделе Проверка параметров. Если выполнение может быть
продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение EINVAL .

Комментарии
Функция localtime_s преобразует время, хранящееся в time_t качестве значения, и
сохраняет результат в структуре типа tm. Значение time_t типа sourceTime
представляет секунды, прошедшие с полуночи (00:00:00) 1-го января 1970 года в
формате UTC. Это значение часто получается из time функции .

Функция localtime_s выполняет коррекцию для местного часового пояса, если


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

( _timezone , _daylight и _tzname ). TZ Если переменная не задана, пытается


использовать сведения о часовом поясе, localtime_s указанные в приложении
даты и времени в панель управления. Если эти сведения не удается получить, по
умолчанию используется PST8PDT, обозначающее тихоокеанский часовой пояс. См
_tzset . описание этих переменных. TZ представляет собой расширение Microsoft и
не является частью стандарта ANSI для localtime .

7 Примечание
Целевая среда должна попытаться определить, действует ли летнее время.

Функция _localtime64_s , которая использует структуру __time64_t , допускает даты


до 23:59:59 18 декабря 3001 года в формате UTC, тогда как функция _localtime32_s
представляет даты до 23:59:59 18 января 2038 года в формате UTC.

localtime_s — встроенная функция, которая принимает значение _localtime64_s и

time_t эквивалентна __time64_t . Если необходимо принудительно

интерпретировать time_t компилятор как старый 32-разрядный time_t , можно


определить _USE_32BIT_TIME_T , что приводит localtime_s к вычислению
. _localtime32_s Не рекомендуется _USE_32BIT_TIME_T , так как приложение может
завершиться сбоем после 18 января 2038 г. и оно не разрешено на 64-разрядных
платформах.

В полях типа tm структуры хранятся следующие значения, каждое из которых


является . int

Поле Описание

tm_sec Секунды за минутой (от 0 до 59).

tm_min Минуты после часа (от 0 до 59).

tm_hour Часы с полуночи (0–23).

tm_mday День месяца (от 1 до 31).

tm_mon Месяц (от 0 до 11; Январь = 0).

tm_year Год (текущий год минус 1900).

tm_wday День недели (0–6; Воскресенье = 0).

tm_yday День года (0 - 365; 1 января = 0).

tm_isdst Положительное значение, если действует летнее время; 0, если летнее время не
действует; отрицательное значение, если состояние летнего времени неизвестно.

Если задана переменная среды TZ , для реализации перехода на летнее время (DST)
в библиотеке времени выполнения C принимаются правила, подходящие для США.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный Обязательный заголовок
заголовок C C++

localtime_s , _localtime32_s , <time.h> <ctime> или <time.h>


_localtime64_s

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_localtime_s.c

// This program uses _time64 to get the current time

// and then uses _localtime64_s() to convert this time to a structure

// representing the local time. The program converts the result

// from a 24-hour clock to a 12-hour clock and determines the

// proper extension (AM or PM).

#include <stdio.h>

#include <string.h>

#include <time.h>

int main( void )

struct tm newtime;

char am_pm[] = "AM";

__time64_t long_time;

char timebuf[26];

errno_t err;

// Get time as 64-bit integer.

_time64( &long_time );

// Convert to local time.

err = _localtime64_s( &newtime, &long_time );

if (err)

printf("Invalid argument to _localtime64_s.");

exit(1);

if( newtime.tm_hour > 12 ) // Set up extension.

strcpy_s( am_pm, sizeof(am_pm), "PM" );

if( newtime.tm_hour > 12 ) // Convert from 24-hour

newtime.tm_hour -= 12; // to 12-hour clock.

if( newtime.tm_hour == 0 ) // Set hour to 12 if midnight.

newtime.tm_hour = 12;

// Convert to an ASCII representation.

err = asctime_s(timebuf, 26, &newtime);

if (err)

printf("Invalid argument to asctime_s.");

exit(1);

printf( "%.19s %s\n", timebuf, am_pm );

Output

Fri Apr 25 01:19:27 PM

См. также раздел


Управление временем

asctime_s, _wasctime_s

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_ftime, _ftime32, _ftime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime, _localtime32, _localtime64

time, _time32, _time64

_tzset
_lock_file
Статья • 03.04.2023

Блокирует объект FILE , чтобы обеспечить согласованность для потоков,


параллельно обращающихся к объекту FILE .

Синтаксис
C

void _lock_file( FILE* file );

Параметры
file

Дескриптор файла.

Комментарии
Функция _lock_file блокирует объект FILE , заданный с помощью file . Базовый
файл не заблокирован. _lock_file Используется для _unlock_file освобождения
блокировки файла. Вызовы _lock_file и _unlock_file должны совпадать в потоке.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_lock_file <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_lock_file.c

// This example creates multiple threads that write to standard output

// concurrently, first with _file_lock, then without.

#include <stdio.h>

#include <process.h>// _beginthread

#include <windows.h>// HANDLE

void Task_locked( void* str )

for( int i=0; i<1000; ++i )

_lock_file( stdout );

for( char* cp = (char*)str; *cp; ++cp )

_fputc_nolock( *cp, stdout );

_unlock_file( stdout );

void Task_unlocked( void* str )

for( int i=0; i<1000; ++i )

for( char* cp = (char*)str; *cp; ++cp )

fputc( *cp, stdout );

int main()

HANDLE h[3];

h[0] = (HANDLE)_beginthread( &Task_locked, 0, "First\n" );

h[1] = (HANDLE)_beginthread( &Task_locked, 0, "Second\n" );

h[2] = (HANDLE)_beginthread( &Task_locked, 0, "Third\n" );

WaitForMultipleObjects( 3, h, true, INFINITE );

h[0] = (HANDLE)_beginthread( &Task_unlocked, 0, "First\n" );

h[1] = (HANDLE)_beginthread( &Task_unlocked, 0, "Second\n" );

h[2] = (HANDLE)_beginthread( &Task_unlocked, 0, "Third\n" );

WaitForMultipleObjects( 3, h, true, INFINITE );

Output

...

First

Second

First

Second

Third

Second

Third

Second

...

FSiercsotn

dF

iSrescto

nFdi

rSsetc

oFnidr

sSte

cFoinrds

tS

eFciornsdt

См. также раздел


Обработка файлов

_creat, _wcreat

_open, _wopen

_unlock_file
locking
Статья • 03.04.2023

Имя locking функции, зависят от Майкрософт, является устаревшим псевдонимом


_locking для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _locking . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_locking
Статья • 03.04.2023

Блокирует или разблокирует байт файла.

Синтаксис
C

int _locking(

int fd,

int mode,

long nbytes

);

Параметры
fd

Дескриптор файла.

mode

Выполняемое действие блокировки.

nbytes

Число байтов для блокировки.

Возвращаемое значение
Функция _locking возвращает 0 в случае успеха. Возвращаемое значение -1
указывает на сбой. В этом случае errno устанавливается одно из следующих
значений.

Значение Условие
errno

EACCES Нарушение блокировки (файл уже заблокирован или разблокирован).

EBADF Недопустимый дескриптор файла.

EDEADLOCK Нарушение блокировки. Возвращается, если _LK_LOCK указан флаг или _LK_RLCK
и файл не может быть заблокирован после 10 попыток.
Значение Условие
errno

EINVAL В функцию _locking передан недопустимый аргумент.

Если ошибка вызвана неправильным параметром, например недопустимым


дескриптором файла, вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров.

Комментарии
Функция _locking блокирует или разблокирует байты nbytes файла, указанного
параметром fd . Блокировка байтов в файле предотвращает доступ других
процессов к этим байтам. Блокировка или разблокировка начинается с текущей
позиции указателя на файл и продолжается в течение следующих nbytes байтов.
Можно заблокировать байты в конце файла.

mode должен быть одной из следующих констант манифеста, определенных в

Locking.h.

Значение Действие
mode

_LK_LOCK Блокирует указанные байты. Если байты не удается заблокировать, программа


немедленно попытается повторить попытку через 1 секунду. Если байты не
могут быть заблокированы после 10 попыток, константа возвращает ошибку.

_LK_NBLCK Блокирует указанные байты. Если байты не могут быть заблокированы,


константа возвращает ошибку.

_LK_NBRLCK Эквивалентно _LK_NBLCK .

_LK_RLCK Эквивалентно _LK_LOCK .

_LK_UNLCK Разблокирует указанные байты, которые предварительно должны быть


заблокированы.

Несколько областей файла, которые не перекрываются, можно заблокировать.


Разблокируемый раздел файла должен быть предварительно заблокирован.
_locking не объединяет смежные области; Если два заблокированных региона

находятся рядом, каждый регион должен быть разблокирован отдельно. Разделы


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

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_locking <io.h> и <sys/locking.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_locking.c

/* This program opens a file with sharing. It locks

* some bytes before reading them, then unlocks them. Note that the

* program works correctly only if the file exists.

*/

#include <sys/types.h>

#include <sys/stat.h>

#include <sys/locking.h>

#include <share.h>

#include <fcntl.h>

#include <stdio.h>

#include <stdlib.h>

#include <io.h>

int main( void )

int fh, numread;

char buffer[40];

/* Quit if can't open file or system doesn't

* support sharing.

*/

errno_t err = _sopen_s( &fh, "crt_locking.txt", _O_RDONLY, _SH_DENYNO,

_S_IREAD | _S_IWRITE );

printf( "%d %d\n", err, fh );

if( err != 0 )

exit( 1 );

/* Lock some bytes and read them. Then unlock. */

if( _locking( fh, LK_NBLCK, 30L ) != -1 )

long lseek_ret;

printf( "No one can change these bytes while I'm reading them\n" );

numread = _read( fh, buffer, 30 );

buffer[30] = '\0';

printf( "%d bytes read: %.30s\n", numread, buffer );

lseek_ret = _lseek( fh, 0L, SEEK_SET );

_locking( fh, LK_UNLCK, 30L );

printf( "Now I'm done. Do what you will with them\n" );

else

perror( "Locking failed\n" );

_close( fh );

Входные данные: crt_locking.txt


Input

The first thirty bytes of this file will be locked.

Пример полученных результатов


Output

No one can change these bytes while I'm reading them

30 bytes read: The first thirty bytes of this

Now I'm done. Do what you will with them

См. также раздел


Обработка файлов

_creat, _wcreat

_open, _wopen
log , logf , logl , log10 , log10f , log10l
Статья • 03.04.2023

Вычисляет логарифмы.

Синтаксис
C

double log(double x);

float logf(float x);

long double logl(double x);

double log10(double x);

float log10f (float x);

long double log10l(double x);

#define log(X) // Requires C11 or higher

#define log10(X) // Requires C11 or higher

float log(float x); // C++ only

long double log(long double x); // C++ only

float log10(float x); // C++ only

long double log10(long double x); // C++ only

Параметры
x

Значение, логарифм которого должен быть найден.

Возвращаемое значение
В log случае успешного выполнения функции возвращают естественный логарифм
(базовый e x ). Функции log10 возвращают логарифм base-10. Если x значение
отрицательное, эти функции по умолчанию возвращают неопределенное значение
( IND ). Если x имеет значение 0, они возвращают бесконечность ( INF ).

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

±0 ZERODIVIDE _SING

x < 0 INVALID _DOMAIN


log и log10 имеют реализацию, которая использует расширения SIMD потоковой

передачи 2 (SSE2). Сведения и ограничения по использованию реализации SSE2 см


_set_SSE2_enable . в этой статье.

Комментарии
C++ позволяет перегружать, поэтому можно вызывать перегрузки log и log10 ,
которые принимают и возвращают float значения или long double . В программе
на языке C, если вы не используете <tgmath.h> макрос для вызова этой функции и
log10 log всегда принимаете и возвращаете double .

Если вы используете <tgmath.h> log() макрос, тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

log , logf , logl , log10 , log10f , log10l <math.h>

log Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_log.c

/* This program uses log and log10

* to calculate the natural logarithm and

* the base-10 logarithm of 9,000.


*/

#include <math.h>

#include <stdio.h>

int main( void )

double x = 9000.0;

double y;

y = log( x );

printf( "log( %.2f ) = %f\n", x, y );

y = log10( x );

printf( "log10( %.2f ) = %f\n", x, y );

Output

log( 9000.00 ) = 9.104980

log10( 9000.00 ) = 3.954243

Для получения логарифмов по другим основаниям используйте математическое


соотношение: логарифм по основанию b от числа a == натуральный логарифм (a) /
натуральный логарифм (b).

C++

// logbase.cpp

#include <math.h>

#include <stdio.h>

double logbase(double a, double base)

return log(a) / log(base);

int main()

double x = 65536;

double result;

result = logbase(x, 2);

printf("Log base 2 of %lf is %lf\n", x, result);

Output

Log base 2 of 65536.000000 is 16.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой

exp, expf, expl

_matherr

pow, powf, powl

_CIlog

_CIlog10\
log1p , log1pf , log1pl
Статья • 03.04.2023

Вычисляет натуральный логарифм суммы указанного значения и 1.

Синтаксис
C

double log1p(double x);

float log1pf(float x);

long double log1pl(long double x);

#define log1p(X) // Requires C11 or higher

float log1p(float x); //C++ only

long double log1p(long double x); //C++ only

Параметры
x

Аргумент с плавающей запятой.

Возвращаемое значение
В случае успешного выполнения возвращает естественный (base-e) журнал ( x + 1).

В случае неудачи может возвращать одно из следующих значений:

Входные данные Результат Исключение SEH errno

+INF +INF

Денормализованные Так же, как и для входных данных UNDERFLOW


числа

±0 Так же, как и для входных данных

-1 -INF DIVBYZERO ERANGE

< -1 Не число INVALID EDOM

-INF Не число INVALID EDOM


Входные данные Результат Исключение SEH errno

±SNaN Так же, как и для входных данных INVALID

±QNaN, неопределенный Так же, как и для входных данных

errno имеет значение ERANGE, если x = –1. Если errno задано EDOM x < значение
-1.

Комментарии
Функции log1p могут быть более точными, чем при использовании log(x + 1) ,
когда x значение близко к 0.

Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции log1p ,


принимающие и возвращающие типы float и long double . В программе C, если вы
не используете <макрос tgmath.h> для вызова этой функции, log1p всегда
принимает и возвращает double .

Если вы используете <tgmath.h> log1p() макрос, тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

Где x — натуральное число, эта функция возвращает базовый логарифм x e + 1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

log1p , log1pf , log1pl <math.h> <cmath>

log1p Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

log2, log2f, log2l

log, logf, log10, log10f


log2 , log2f , log2l
Статья • 03.04.2023

Определяет двоичный логарифм (по основанию 2) для указанного значения.

Синтаксис
C

double log2(

double x

);

float log2(

float x

); //C++ only

long double log2(

long double x

); //C++ only

float log2f(

float x

);

long double log2l(

long double x

);

#define log2(X) // Requires C11 or higher

Параметры
x

Значение, для которого вычисляется логарифм по основанию 2.

Возвращаемое значение
При успешном выполнении функции возвращают журнал base-2 для x .

В противном случае функции могут вернуть одно из следующих значений:

Проблема Возвращает
Проблема Возвращает

x< 0 не число

x = ±0 -INFINITY

x =1 +0

+INFINITY +INFINITY

Не число Не число

ошибка домена Не число

Ошибка полюса - HUGE_VAL , - HUGE_VALF , или - HUGE_VALL

Об ошибках сообщается, как указано в _matherr.

Комментарии
Если x является целым числом, эта функция по сути возвращает отсчитываемый от
нуля индекс наиболее значительного 1 бита x .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

log2 , log2f , log2l <math.h> <cmath>

log2 Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

exp2, exp2f, exp2l

log, logf, log10, log10f


logb , logbf , logbl , _logb , _logbf
Статья • 03.04.2023

Извлекает значение экспоненты для аргумента с плавающей запятой.

Синтаксис
C

double logb(

double x

);

float logb(

float x

); // C++ only

long double logb(

long double x

); // C++ only

float logbf(

float x

);

long double logbl(

long double x

);

double _logb(

double x

);

float _logbf(

float x

);

#define logb(X) // Requires C11 or higher

Параметры
x

Значение с плавающей запятой.

Возвращаемое значение
Функция logb возвращает значение экспоненты x без смещения в виде целого
числа со знаком, представленного как значение с плавающей запятой.

Комментарии
Функции logb извлекают экспоненциальное значение аргумента с плавающей
запятой x так, как если бы x было представлено с бесконечным диапазоном. Если
аргумент x денормализован, он обрабатывается как нормализованный.

Поскольку C++ допускает перегрузку, можно вызывать перегрузки logb , которые


принимают и возвращают значения float или long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, logb всегда
принимает и возвращает double .

Если вы используете logb макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND Нет _DOMAIN

±0 ZERODIVIDE _SING

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_logb <float.h>

logb , logbf , logbl , _logbf <math.h>

logb Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
frexp
longjmp
Статья • 03.04.2023

Восстанавливает среду стека и языковой стандарт выполнения, заданный вызовом


setjmp .

Синтаксис
C

void longjmp(

jmp_buf env,

int value

);

Параметры
env

Переменная, в которой хранится среда.

value

Значение, возвращаемое в вызов setjmp .

Комментарии
Функция longjmp восстанавливает среду стека и языковой стандарт выполнения,
которые ранее были сохранены в параметре env функцией setjmp . setjmp и
longjmp предоставьте способ выполнения нелокального goto ; они обычно
используются для передачи управления выполнением в код обработки ошибок
или восстановления в ранее вызываемой подпрограмме без использования
обычных соглашений о вызове и возврате.

Вызов функции setjmp сохраняет текущую среду стека в параметре env .


Последующий вызов функции longjmp восстанавливает сохраненную среду и
возвращает управление в точку, следующую сразу за соответствующим вызовом
функции setjmp . Выполнение возобновляется, как если бы value оно было
возвращено вызовом setjmp . Все переменные (за исключением регистровых
переменных), доступные для получившей управление подпрограммы, содержат те
значения, которые они имели при вызове функции longjmp . Значения регистровых
переменных непредсказуемы. Значение, возвращаемое функцией setjmp , должно
быть ненулевым. Если value значение передается как 0, значение 1 заменяется
фактическим возвратом.

Блок, относящийся только к системам Microsoft

В коде Microsoft C++ в Windows longjmp используется та же семантика очистки


стека, что и код обработки исключений. Безопасно использовать в том же месте,
где могут возникать исключения C++. Однако это использование не является
переносимым и поставляется с некоторыми важными предостережениями.

Только вызов longjmp функции, вызываемой функцией setjmp ; в противном


случае результаты будут непредсказуемыми.

При использовании функции longjmp соблюдайте следующие ограничения:

Не предполагайте, что значения переменных регистра останутся прежними.


Значения регистровых переменных, установленные на момент вызова
подпрограммы setjmp , после вызова longjmp могут измениться.

Не используйте для longjmp передачи управления из подпрограммы


обработки прерываний, если прерывание не вызвано исключением с
плавающей запятой. В этом случае программа может выполнять возврат из
обработчика прерываний посредством функции longjmp , если она сначала
повторно инициализирует пакет вычислений с плавающей запятой путем
вызова функции _fpreset.

Не используйте longjmp для передачи управления из подпрограммы


обратного вызова, вызываемой непосредственно или косвенно кодом
Windows.

Если код компилируется с помощью /EHs или /EHsc и функции, содержащей


longjmp вызов, то noexcept локальные объекты в этой функции не могут быть

деструктированы во время очистки стека.

Завершение блока, относящегося только к системам Майкрософт

7 Примечание

В переносимом коде C++ нельзя предполагать setjmp и longjmp


поддерживать семантику объектов C++. В частности, setjmp / longjmp пара
вызовов не определена при замене setjmp и longjmp catch вызове throw
любых нетривиальных деструкторов для любых автоматических объектов. В
программах C++ рекомендуется использовать механизм обработки
исключений C++.

Дополнительные сведения см. в разделе Использование setjmp и longjmp.

Требования
Подпрограмма Обязательный заголовок

longjmp <setjmp.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _fpreset.

См. также раздел


Управление процессами и средойsetjmp
lrint , lrintf , lrintl , llrint , llrintf ,
llrintl
Статья • 03.04.2023

Округляет указанное значение с плавающей запятой до ближайшего целого


значения, используя текущие режим и направление округления.

Синтаксис
C

long int lrint(

double x

);

long int lrint(

float x

); //C++ only

long int lrint(

long double x

); //C++ only

long int lrintf(

float x

);

long int lrintl(

long double x

);

long long int llrint(

double x

);

long long int llrint(

float x

); //C++ only

long long int llrint(

long double x

); //C++ only

long long int llrintf(

float x

);

long long int llrintl(

long double x

);

#define lrint(X) // Requires C11 or higher

Параметры
x

Округляемое значение.

Возвращаемое значение
В случае успешного выполнения возвращает округленное целочисленное значение
x.

Проблема Возвращает

x находится за пределами диапазона типа FE_INVALID Вызывает и возвращает


возвращаемого значения
ноль (0).

x = ±INF

x = не число

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки lrint и llrint ,
которые принимают float типы и long double . В программе C, если вы не
используете макрос tgmath.h> для вызова этой функции и lrint llrint всегда
принимаете double .<

Если вы используете <макрос tgmath.h> llrint() , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

Если x не представляет эквивалент целочисленного значения с плавающей


запятой, эти функции вызывают . FE_INEXACT

Для майкрософт. Если результат выходит за пределы диапазона возвращаемого


типа или параметром является NaN или бесконечностью, то возвращаемое
значение определяется реализацией. Компилятор Майкрософт возвращает
нулевое значение (0).
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

lrint , lrintf , lrintl , llrint , llrintf , llrintl <math.h> <cmath>

lrint Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций
lround , lroundf , lroundl , llround ,
llroundf , llroundl
Статья • 03.04.2023

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

Синтаксис
C

long lround(

double x

);

long lround(

float x

); // C++ only

long lround(

long double x

); // C++ only

long lroundf(

float x

);

long lroundl(

long double x

);

long long llround(

double x

);

long long llround(

float x

); // C++ only

long long llround(

long double x

); // C++ only

long long llroundf(

float x

);

long long llroundl(

long double x

);

#define lround(X) // Requires C11 or higher

Параметры
x

Округляемое значение с плавающей запятой.


Возвращаемое значение
Функции lround и llround возвращают ближайшее целое число типа long или
long long для x . Промежуточные значения округляются в сторону от нуля,

независимо от настройки режима округления чисел с плавающей запятой. Ошибка


не возвращается.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

Комментарии
Так как C++ допускает перегрузку, можно вызывать lround или llround
перегрузки, которые принимают и возвращают float значения и long double . В
программе C, если вы не используете макрос tgmath.h> для вызова этой функции и
lround llround всегда принимаете и возвращаете double .<

Если вы используете <макрос tgmath.h> lround() , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

lround , lroundf , lroundl , llround , llroundf , llroundl <math.h>

lround Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_lround.c

// Build with: cl /W4 /Tc crt_lround.c

// This example displays the rounded results of

// the floating-point values 2.499999, -2.499999,

// 2.8, -2.8, 3.5 and -3.5.

#include <math.h>

#include <stdio.h>

int main( void )

double x = 2.499999;
float y = 2.8f;

long double z = 3.5L;

printf("lround(%f) is %d\n", x, lround(x));

printf("lround(%f) is %d\n", -x, lround(-x));

printf("lroundf(%f) is %d\n", y, lroundf(y));

printf("lroundf(%f) is %d\n", -y, lroundf(-y));

printf("lroundl(%Lf) is %d\n", z, lroundl(z));

printf("lroundl(%Lf) is %d\n", -z, lroundl(-z));

Output

lround(2.499999) is 2

lround(-2.499999) is -2

lroundf(2.800000) is 3

lroundf(-2.800000) is -3

lroundl(3.500000) is 4

lroundl(-3.500000) is -4

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ceil, ceilf, ceill

floor, floorf, floorl

fmod, fmodf

lrint, lrintf, lrintl, llrint, llrintf, llrintl

round, roundf, roundl

nearbyint, nearbyintf, nearbyintl

rint, rintf, rintl


_lrotl , _lrotr
Статья • 03.04.2023

Циклически сдвигает биты влево ( _lrotl ) или вправо ( _lrotr ).

Синтаксис
C

unsigned long _lrotl( unsigned long value, int shift );

unsigned long _lrotr( unsigned long value, int shift );

Параметры
value

Значение для сдвига.

shift

Число битов для смещения value .

Возвращаемое значение
Обе функции возвращают значение с циклическим сдвигом. Ошибка не
возвращается.

Комментарии
Функции _lrotl _lrotr поворачиваются value по битам shift . _lrotl
поворачивает значение влево, в сторону более значимых битов. _lrotr
поворачивает значение вправо, в сторону менее значимых битов. Обе функции
обтекают биты, поворачиваемые от одного конца value к другому.

Требования
Подпрограмма Обязательный заголовок

_lrotl , _lrotr <stdlib.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_lrot.c

#include <stdlib.h>

#include <stdio.h>

int main( void )

unsigned long val = 0x0fac35791;

printf( "0x%8.8lx rotated left eight bits is 0x%8.8lx\n",

val, _lrotl( val, 8 ) );

printf( "0x%8.8lx rotated right four bits is 0x%8.8lx\n",

val, _lrotr( val, 4 ) );

Output

0xfac35791 rotated left eight bits is 0xc35791fa

0xfac35791 rotated right four bits is 0x1fac3579

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_rotl, _rotl64, _rotr, _rotr64
lsearch
Статья • 03.04.2023

Имя lsearch функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _lsearch для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _lsearch или функцию с повышенным


_lsearch_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".
_lsearch
Статья • 03.04.2023

Выполняет линейный поиск значения и добавляет значение в конец списка, если


оно не найдено. Доступна более безопасная версия этой функции; См. раздел
_lsearch_s.

Синтаксис
C

void *_lsearch(

const void *key,

void *base,

unsigned int *num,

unsigned int width,

int (__cdecl *compare)(const void *, const void *)

);

Параметры
key

Искомый объект.

base

Указатель на начало массива, где будет производиться поиск.

number

Число элементов.

width

Ширина каждого элемента массива.

compare

Указатель на подпрограмму сравнения. Первый параметр — это указатель на ключ


для поиска. Второй параметр — это указатель на элемент массива, который будет
сравниваться с ключом.

Возвращаемое значение
Если ключ найден, функция _lsearch возвращает указатель на элемент массива
base , соответствующий key . Если ключ не найден, _lsearch возвращает указатель
на добавленный элемент в конце массива.

Комментарии
Функция _lsearch выполняет линейный поиск значения key в массиве из number
элементов шириной width каждый. В отличие от bsearch не _lsearch требуется
сортировка массива. Если key объект не найден, _lsearch добавляет его в конец
массива и увеличивает number .

Аргумент compare является указателем на пользовательскую подпрограмму,


которая сравнивает два элемента массива и возвращает значение, показывающее,
как соотносятся их значения. Во время поиска функция _lsearch вызывает
подпрограмму compare один или несколько раз, передавая указатели на два
элемента массива при каждом вызове. Функция compare должна сравнивать
элементы и возвращать либо отличное от нуля значение (если элементы
различаются), либо 0 (если элементы идентичны).

Эта функция проверяет свои параметры. Если compare , key или number имеет
значение NULL , или , если base имеет значение NULL и number не равно нулю, width
вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если выполнение может быть продолжено, параметр errno
устанавливается в значение EINVAL , и функция возвращает значение NULL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_lsearch <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_lsearch.c

#include <search.h>

#include <string.h>

#include <stdio.h>

int compare( const void *arg1, const void *arg2 );

int main(void)

char * wordlist[4] = { "hello", "thanks", "bye" };

// leave room to grow...

int n = 3;

char **result;

char *key = "extra";


int i;

printf( "wordlist before _lsearch:" );

for( i=0; i<n; ++i ) printf( " %s", wordlist[i] );

printf( "\n" );

result = (char **)_lsearch( &key, wordlist,

&n, sizeof(char *), compare );

printf( "wordlist after _lsearch:" );

for( i=0; i<n; ++i ) printf( " %s", wordlist[i] );

printf( "\n" );

int compare(const void *arg1, const void *arg2 )

return( _stricmp( * (char**)arg1, * (char**)arg2 ) );

Output

wordlist before _lsearch: hello thanks bye

wordlist after _lsearch: hello thanks bye extra

См. также раздел


Сортировка и поиск

bsearch

_lfind

_lsearch_s
_lsearch_s
Статья • 03.04.2023

Выполняет линейный поиск значения. Версия с _lsearch усовершенствованиями


безопасности, как описано в разделе Функции безопасности в CRT.

Синтаксис
C

void *_lsearch_s(

const void *key,

void *base,

unsigned int *num,

size_t size,

int (__cdecl *compare)(void *, const void *, const void *),

void * context

);

Параметры
key

Искомый объект.

base

Указатель на начало массива, где будет производиться поиск.

number

Число элементов.

size

Размер каждого элемента в байтах.

compare

Указатель на подпрограмму сравнения. Второй параметр — это указатель на ключ


для поиска. Третий параметр — это указатель на элемент массива, который будет
сравниваться с ключом.

context

Указатель на объект, доступ к которому может получить функция сравнения.


Возвращаемое значение
Если ключ key найден, _lsearch_s возвращает указатель на элемент массива base ,
соответствующий key . Если key объект не найден, _lsearch_s возвращает
указатель на добавленный элемент в конце массива.

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


недопустимых параметров, как описано в разделе Проверка параметров. Если
выполнение может быть продолжено, параметр errno устанавливается в значение
EINVAL , и функция возвращает NULL . Дополнительные сведения см. в разделе errno,

_doserrno, _sys_errlistи _sys_nerr.

Условия ошибок

key base compare number size errno

NULL any any any any EINVAL

any NULL any != 0 any EINVAL

any any any any нуль EINVAL

any any NULL любой any EINVAL

Комментарии
Функция _lsearch_s выполняет линейный поиск значения key в массиве из number
элементов шириной size каждый. В отличие от bsearch_s не _lsearch_s требуется
сортировка массива. Если key не найден, добавляет _lsearch_s его в конец
массива и увеличивается number .

Функция compare представляет собой указатель на предоставляемую


пользователем подпрограмму, которая сравнивает два элемента массива и
возвращает значение, показывающее, как соотносятся их значения. Функция
compare также принимает указатель на контекст в качестве первого аргумента.
Функция _lsearch_s вызывает функцию compare один или несколько раз во время
поиска, передавая при каждом вызове указатели на два элемента массива. Функция
compare должна сравнивать элементы и возвращать либо отличное от нуля
значение (если элементы различаются), либо 0 (если элементы идентичны).
Указатель context может быть полезен, если структура данных, в которой
производится поиск, является частью объекта и функции compare требуется доступ
к членам объекта. Например, код в функции compare может привести указатель
void к соответствующему типу объекта и получить доступ к членам этого объекта.
Добавление указателя context повышает _lsearch_s безопасность, так как можно
использовать дополнительный контекст, чтобы избежать ошибок повторного
входа, связанных с использованием статических переменных для предоставления
функции доступа к compare данным.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_lsearch_s <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Сортировка и поиск

bsearch_s

_lfind_s

_lsearch
lseek
Статья • 03.04.2023

Имя lseek функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _lseek для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _lseek . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_lseek , _lseeki64
Статья • 03.04.2023

Перемещает указатель файла в заданное местоположение.

Синтаксис
C

long _lseek(

int fd,

long offset,

int origin

);

__int64 _lseeki64(

int fd,

__int64 offset,

int origin

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

offset

Количество байт начиная с origin .

origin

Первоначальная позиция.

Возвращаемое значение
Функция _lseek возвращает смещение новой позиции в байтах относительно
начала файла. Функция _lseeki64 возвращает смещение в виде 64-разрядного
целого числа. Функция возвращает -1L, чтобы указать ошибку. Если передан
недопустимый параметр, например недопустимый дескриптор файла, или
значение origin недопустимого или позиция, указанная offset перед началом
файла, вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, эти функции
устанавливают параметр errno в значение EBADF и возвращают –1L. Если
устройство неспособно выполнять поиск (например, терминалы и принтеры),
возвращаемое значение не определено.

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Функция _lseek перемещает указатель файла, связанный с fd новым
расположением, offset из байтов origin . Следующая операция в файле
выполняется в новом местоположении. Аргумент origin должен быть одной из
следующих констант, определенных в Stdio.h.

Значение origin Описание

SEEK_SET Начало файла.

SEEK_CUR Текущая позиция указателя файла.

SEEK_END Конец файла.

С помощью функции _lseek можно переместить указатель в любое место в файле


или за его конец.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_lseek <io.h>

_lseeki64 <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
C

// crt_lseek.c

/* This program first opens a file named lseek.txt.

* It then uses _lseek to find the beginning of the file,

* to find the current position in the file, and to find

* the end of the file.

*/

#include <io.h>

#include <fcntl.h>

#include <stdlib.h>

#include <stdio.h>

#include <share.h>

int main( void )

int fh;

long pos; /* Position of file pointer */

char buffer[10];

_sopen_s( &fh, "crt_lseek.c_input", _O_RDONLY, _SH_DENYNO, 0 );

/* Seek the beginning of the file: */

pos = _lseek( fh, 0L, SEEK_SET );

if( pos == -1L )

perror( "_lseek to beginning failed" );

else

printf( "Position for beginning of file seek = %ld\n", pos );

/* Move file pointer a little */

_read( fh, buffer, 10 );

/* Find current position: */

pos = _lseek( fh, 0L, SEEK_CUR );

if( pos == -1L )

perror( "_lseek to current position failed" );

else

printf( "Position for current position seek = %ld\n", pos );

/* Set the end of the file: */

pos = _lseek( fh, 0L, SEEK_END );

if( pos == -1L )

perror( "_lseek to end failed" );

else

printf( "Position for end of file seek = %ld\n", pos );

_close( fh );

Входные данные: crt_lseek.c_input


Input

Line one.

Line two.

Line three.

Line four.

Line five.

Вывод
Output

Position for beginning of file seek = 0

Position for current position seek = 10

Position for end of file seek = 57

См. также
Низкоуровневый ввод-вывод

fseek, _fseeki64

_tell, _telli64
_makepath , _wmakepath
Статья • 03.04.2023

Создают путь из компонентов. Доступны более безопасные версии этих функций;


См. раздел_makepath_s , _wmakepath_s.

Синтаксис
C

void _makepath(

char *path,

const char *drive,

const char *dir,

const char *fname,

const char *ext

);

void _wmakepath(

wchar_t *path,

const wchar_t *drive,

const wchar_t *dir,

const wchar_t *fname,

const wchar_t *ext

);

Параметры
path

Буфер полного пути.

drive

Содержит букву (A, B и т. д.), соответствующую требуемому диску, с


необязательным двоеточием после нее. _makepath автоматически вставляет
двоеточие в составной путь, если он отсутствует. Если параметр drive имеет
значение NULL или указывает на пустую строку, в составной строке path буква
диска не отображается.

dir

Содержит путь каталогов, не включая обозначение диска или фактическое имя


файла. Завершающая косая черта является необязательной, и в одном dir
аргументе может использоваться косая черта ( / ) или обратная косая черта ( \ ).
Если косая черта ( / или \ ) не указана, она вставляется автоматически. Если
параметр dir имеет значение NULL или указывает на пустую строку, путь каталога
не вставляется в составную строку path .

fname

Содержит базовое имя файла без расширений. Если параметр fname имеет
значение NULL или указывает на пустую строку, имя файла не вставляется в
составную строку path .

ext

Содержит фактическое расширение имени файла с начальной точкой ( . или без


нее). _makepath автоматически вставляет точку, если она не отображается в ext .
Если параметр ext имеет значение NULL или указывает на пустую строку,
расширение не вставляется в составную строку path .

Комментарии
Функция _makepath создает строку составного пути из отдельных компонентов,
сохраняя результат в параметре path . Путь path может включать букву диска, путь
к каталогу, имя файла и расширение имени файла. _wmakepath — это двухбайтовая
версия _makepath ; аргументы для _wmakepath представляют собой двухбайтовые
строки. Поведение _wmakepath и _makepath идентично в противном случае.

Примечание о безопасности. Следует использовать строку, оканчивающуюся


нуль-символом. Длина строки, завершающейся нуль-символом, не должна
превышать размер буфера path . _makepath не гарантирует, что длина строки
составного пути не превышает _MAX_PATH . Дополнительные сведения см . в статье
Предотвращение переполнения буфера.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tmakepath _makepath _makepath _wmakepath


Аргумент path должен указывать на пустой буфер достаточного для хранения
полного пути размера. Размер составного пути path не должен быть больше
константы _MAX_PATH , определенной в файле Stdlib.h.

Если параметр path имеет значение NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Кроме того, для
параметра errno устанавливается значение EINVAL . Для всех остальных параметров
допускаются значения NULL .

Требования
Подпрограмма Обязательный заголовок

_makepath <stdlib.h>

_wmakepath <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_makepath.c

#include <stdlib.h>

#include <stdio.h>

int main( void )

char path_buffer[_MAX_PATH];

char drive[_MAX_DRIVE];

char dir[_MAX_DIR];

char fname[_MAX_FNAME];

char ext[_MAX_EXT];

_makepath( path_buffer, "c", "\\sample\\crt\\", "makepath", "c" ); //


C4996

// Note: _makepath is deprecated; consider using _makepath_s instead

printf( "Path created with _makepath: %s\n\n", path_buffer );

_splitpath( path_buffer, drive, dir, fname, ext ); // C4996

// Note: _splitpath is deprecated; consider using _splitpath_s instead

printf( "Path extracted with _splitpath:\n" );

printf( " Drive: %s\n", drive );

printf( " Dir: %s\n", dir );

printf( " Filename: %s\n", fname );

printf( " Ext: %s\n", ext );

Output

Path created with _makepath: c:\sample\crt\makepath.c

Path extracted with _splitpath:

Drive: c:

Dir: \sample\crt\

Filename: makepath

Ext: .c

См. также раздел


Обработка файлов

_fullpath, _wfullpath

_splitpath, _wsplitpath

_makepath_s, _wmakepath_s
_makepath_s , _wmakepath_s
Статья • 03.04.2023

Создает путь из компонентов. Эти функции являются версиями _makepath, с


улучшениями безопасности, _wmakepath описанными в разделе Функции
безопасности в CRT.

Синтаксис
C

errno_t _makepath_s(

char *path,

size_t sizeInBytes,

const char *drive,

const char *dir,

const char *fname,

const char *ext

);

errno_t _wmakepath_s(

wchar_t *path,

size_t sizeInWords,

const wchar_t *drive,

const wchar_t *dir,

const wchar_t *fname,

const wchar_t *ext

);

template <size_t size>

errno_t _makepath_s(

char (&path)[size],

const char *drive,

const char *dir,

const char *fname,

const char *ext

); // C++ only

template <size_t size>

errno_t _wmakepath_s(

wchar_t (&path)[size],

const wchar_t *drive,

const wchar_t *dir,

const wchar_t *fname,

const wchar_t *ext

); // C++ only

Параметры
path

Буфер полного пути.

sizeInWords

Размер буфера в словах.

sizeInBytes

Размер буфера в байтах.

drive

Содержит букву (A, B и т. д.), соответствующую требуемому диску, с


необязательным двоеточием после нее. _makepath_s автоматически вставляет
двоеточие в составной путь, если он отсутствует. Если параметр drive имеет
значение NULL или указывает на пустую строку, в составной строке path буква
диска не отображается.

dir

Содержит путь каталогов, не включая обозначение диска или фактическое имя


файла. Косая черта в конце является необязательной, и в одном dir аргументе
может использоваться косая черта (/) или обратная косая черта (\). Если косая
черта (/ или \) не указана, она вставляется автоматически. Если параметр dir имеет
значение NULL или указывает на пустую строку, путь каталога не вставляется в
составную строку path .

fname

Содержит базовое имя файла без расширений. Если параметр fname имеет
значение NULL или указывает на пустую строку, имя файла не вставляется в
составную строку path .

ext

Содержит фактическое расширение имени файла с предшествующей точкой (.) или


без нее. _makepath_s автоматически вставляет точку, если она не отображается в
ext . Если параметр ext имеет значение NULL или указывает на пустую строку,

расширение не вставляется в составную строку path .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.

Условия ошибок
path sizeInWords / sizeInBytes Возвращает Содержимое path

NULL any EINVAL не изменено

any <= 0 EINVAL не изменено

Если возникает какое-либо из описанных выше условий ошибки, эти функции


вызывают обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, для параметра errno
устанавливается значение EINVAL , и функция возвращает значение EINVAL .
Значение NULL допускается для параметров drive , fname и ext . Дополнительные
сведения о поведении в случае, когда эти параметры являются указателями NULL
или пустыми строками, см. в разделе примечаний.

Комментарии
Функция _makepath_s создает строку составного пути из отдельных компонентов,
сохраняя результат в параметре path . Путь path может включать букву диска, путь
к каталогу, имя файла и расширение имени файла. _wmakepath_s — это
двухбайтовая версия _makepath_s ; аргументы для _wmakepath_s представляют собой
двухбайтовые строки. Поведение _wmakepath_s и _makepath_s идентично в
противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tmakepath_s _makepath_s _makepath_s _wmakepath_s

Аргумент path должен указывать на пустой буфер достаточного для хранения


полного пути размера. Размер составного пути path не должен быть больше
константы _MAX_PATH , определенной в файле Stdlib.h.

Если параметр path имеет значение NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Кроме того, для
параметра errno устанавливается значение EINVAL . Для всех остальных параметров
допускаются значения NULL .

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

Требования
Подпрограмма Обязательный заголовок

_makepath_s <stdlib.h>

_wmakepath_s <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_makepath_s.c

#include <stdlib.h>

#include <stdio.h>

int main( void )

char path_buffer[_MAX_PATH];

char drive[_MAX_DRIVE];

char dir[_MAX_DIR];

char fname[_MAX_FNAME];

char ext[_MAX_EXT];

errno_t err;

err = _makepath_s( path_buffer, _MAX_PATH, "c", "\\sample\\crt\\",

"crt_makepath_s", "c" );

if (err != 0)

printf("Error creating path. Error code %d.\n", err);

exit(1);

printf( "Path created with _makepath_s: %s\n\n", path_buffer );

err = _splitpath_s( path_buffer, drive, _MAX_DRIVE, dir, _MAX_DIR, fname,

_MAX_FNAME, ext, _MAX_EXT );

if (err != 0)

printf("Error splitting the path. Error code %d.\n", err);

exit(1);

printf( "Path extracted with _splitpath_s:\n" );

printf( " Drive: %s\n", drive );

printf( " Dir: %s\n", dir );

printf( " Filename: %s\n", fname );

printf( " Ext: %s\n", ext );

Output

Path created with _makepath_s: c:\sample\crt\crt_makepath_s.c

Path extracted with _splitpath_s:


Drive: c:

Dir: \sample\crt\

Filename: crt_makepath_s

Ext: .c

См. также раздел


Обработка файлов

_fullpath, _wfullpath

_splitpath_s, _wsplitpath_s

_makepath, _wmakepath
malloc
Статья • 03.04.2023

Размещение блоков памяти

Синтаксис
C

void *malloc(

size_t size

);

Параметры
size

Байты для размещения.

Возвращаемое значение
malloc возвращает пустой указатель на выделенное пространство или NULL , если
доступно недостаточно памяти. Чтобы вернуть указатель на тип, отличный от void ,
используйте приведение типов для возвращаемого значения. Дисковое
пространство, на которое указывает возвращаемое значение, хорошо
выравнивается для хранения объектов любого типа, требования к выравниванию
которого меньше или равны базовому выравниванию. (В Visual C++ основное
выравнивание — это выравнивание, необходимое double для , или 8 байт. В коде,
предназначенном для 64-разрядных платформ, это 16 байт.) Используйте
_aligned_malloc для выделения хранилища для объектов с большими требованиями
к выравниванию, например для типов __m128 SSE и __m256 , и типов, объявленных с
помощью __declspec(align( n )) , где n больше 8. Если значение size равно 0,
функция malloc выделяет элемент нулевой длины в куче и возвращает допустимый
указатель на этот элемент. Всегда проверяйте возвращаемое функцией malloc
значение, даже если объем запрошенной памяти мал.

Комментарии
Функция malloc выделяет блок памяти размером не менее size байтов. Размер
блока может превышать size байтов из-за дополнительных затрат места на
хранение информации о выравнивании и обслуживании.

Функция malloc задает для параметра errno в значение ENOMEM , если выделение
памяти завершается сбоем или количество запрошенной памяти превышает
_HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделеerrno ,

_doserrno, _sys_errlistи _sys_nerr.

Код запуска использует функцию malloc для выделения пространства для


переменных _environ , envp и argv . Функцию malloc также вызывают следующие
функции и их аналоги для расширенных символов.

calloc

Функции _exec

fgetc

_fgetchar
fgets
fprintf

fputc

_fputchar

fputs

fread

fscanf

fseek

fsetpos

_fullpath

fwrite

getc

getchar

_getcwd

_getdcwd

gets

_getw

_popen

printf

putc

putchar

_putenv

puts

_putw

scanf

_searchenv

setvbuf

Функции _spawn

_strdup

system

_tempnam

ungetc

vfprintf
vprintf

Функция C++ _set_new_mode задает новый режим обработчика для malloc . Новый
режим обработки указывает, должна ли функция malloc при сбое вызывать новую
подпрограмму обработчика, заданную функцией _set_new_handler. По умолчанию
malloc не вызывает новую подпрограмму обработчика при сбое выделения

памяти. Можно переопределить это поведение по умолчанию, чтобы в случае сбоя


предоставления памяти функцией malloc функция malloc вызывала новую
подпрограмму обработчика таким же образом, как это делает оператор new при
сбое по той же причине. Чтобы переопределить значение по умолчанию, вызовите
_set_new_mode(1) на ранней стадии программы или свяжите с NEWMODE.OBJ
помощью (см. раздел Параметры связи).

Если приложение связано с отладочной версией библиотек времени выполнения


C, malloc разрешается в _malloc_dbg. Дополнительные сведения об управлении
кучей в процессе отладки см. в разделе Сведения об отладочной куче CRT.

malloc помечается __declspec(noalias) и __declspec(restrict) . Эти атрибуты


означают, что функция гарантированно не будет изменять глобальные переменные
и что возвращаемый указатель не является псевдонимом. Дополнительные
сведения см. в разделах noalias и restrict.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

malloc <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_malloc.c

// This program allocates memory with

// malloc, then frees the memory with free.

#include <stdlib.h> // For _MAX_PATH definition

#include <stdio.h>

#include <malloc.h>

int main( void )

char *string;

// Allocate space for a path name

string = malloc( _MAX_PATH );

// In a C++ file, explicitly cast malloc's return. For example,

// string = (char *)malloc( _MAX_PATH );

if( string == NULL )

printf( "Insufficient memory available\n" );

else

printf( "Memory space allocated for path name\n" );

free( string );

printf( "Memory freed\n" );

Output

Memory space allocated for path name

Memory freed

См. также раздел


Выделение памяти

calloc

free

realloc

_aligned_malloc
_malloc_dbg
Статья • 03.04.2023

Выделяет блок памяти в куче с дополнительным пространством для заголовка


отладки и перезаписи буферов (только для отладочной версии).

Синтаксис
C

void *_malloc_dbg(

size_t size,

int blockType,

const char *filename,

int linenumber

);

Параметры
size

Запрошенный размер блока памяти (байт).

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Параметры filename и linenumber доступны только при _malloc_dbg явном вызове


или определении _CRTDBG_MAP_ALLOC константы препроцессора.

Возвращаемое значение
При успешном завершении эта функция возвращает указатель на пользовательную
часть выделенного блока памяти, вызывает новую функцию обработчика или
возвращает NULL . Полное описание поведения возвращения см. в следующем
разделе "Примечания". Дополнительные сведения об использовании новой
функции обработчика см. в malloc этой функции.

Комментарии
_malloc_dbg — отладочная версия malloc функции. Если _DEBUG параметр не

определен, каждый вызов _malloc_dbg сводится к вызову malloc . И malloc , и


_malloc_dbg выполняют выделение блока памяти в основной куче, однако

_malloc_dbg включает различные возможности отладки: буферы на обеих сторонах

пользовательской части блока для тестирования утечек, параметр типа блока для
отслеживания конкретных типов выделения, а также сведения о
filename / linenumber для определения источника запросов на выделение.

_malloc_dbg выделяет блок памяти, добавив немного больше пространства, чем

запрошено size . Дополнительное пространство используется диспетчером кучи


отладки для связывания блоков памяти отладки и предоставления приложению
сведений о заголовке отладки и перезаписи буферов. При выделении блока
пользовательская часть блока заполняется значением 0xCD, а каждый буфер
перезаписи заполняется 0xFD.

_malloc_dbg задает для errno значение ENOMEM в случае сбоя выделения памяти или

если необходимый объем памяти (включая ранее упомянутую нагрузку) превышает


_HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделе errno,

_doserrno, _sys_errlistи _sys_nerr.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и отладочными версиями см. в разделе Отладка версий функций выделения
кучи.

Требования
Подпрограмма Обязательный заголовок

_malloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
Пример использования _malloc_dbg см. в разделе crt_dbg1 .

См. также раздел


Подпрограммы отладки

malloc

_calloc_dbg
_malloca
Статья • 03.04.2023

Выделение памяти в стеке. Эта функция представляет собой версию _alloca с


усовершенствованиями безопасности, как описано в разделе "Функции
безопасности" в CRT.

Синтаксис
C

void *_malloca(

size_t size

);

Параметры
size

Байты, которые нужно выделить из стека.

Возвращаемое значение
Подпрограмма _malloca возвращает void указатель на выделенное пространство,
которое подходит для хранения любого типа объекта. Если значение size равно 0,
_malloca выделяет элемент нулевой длины и возвращает допустимый указатель на

этот элемент.

Если size значение больше _ALLOCA_S_THRESHOLD , то _malloca пытается выделить


кучу и возвращает пустой указатель, если пространство не может быть выделено.
Если size значение меньше или равно _ALLOCA_S_THRESHOLD , то _malloca пытается
выделить его в стеке и создается исключение переполнения стека, если
пространство не может быть выделено. Исключение переполнения стека не
является исключением C++; Это структурированное исключение. Вместо
обработки исключений C++ для перехвата этого исключения необходимо
использовать обработку структурированных исключений (SEH).

Комментарии
_malloca выделяет size байтов из стека программы или кучи, если запрос

превышает определенный размер в байтах, определяемый _ALLOCA_S_THRESHOLD .


Различие между _malloca и _alloca состоит в том, что _alloca всегда выделяет
память из стека независимо от размера. В отличие от _alloca того, что не требует
или не разрешает вызов освобождения free выделенной _freea памяти, _malloca
требует использования для освобождения памяти. В режиме отладки _malloca
всегда выделяет память из кучи.

Существуют ограничения на явный вызов _malloca в обработчике исключений


(EH). Подпрограммы EH, работающие на процессорах класса x86, работают в
собственном кадре памяти: они выполняют свои задачи в пространстве памяти,
который не основан на текущем расположении указателя стека включающей
функции. Наиболее распространенные реализации включают выражения
структурной обработки исключений (SEH) Windows NT и выражения catch языка
C++. Поэтому явный вызов _malloca в любом из следующих сценариев приводит к
сбою программы во время возврата к вызывающей подпрограмме EH:

Выражение фильтра исключений SEH Для Windows: __except ( _malloca () )

Окончательный обработчик исключений Windows SEH: __finally { _malloca ()


}

Выражение catch обработки исключений языка C++

Однако _malloca можно вызывать непосредственно из подпрограммы обработки


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

) Важно!

В Windows, если _malloca вызывается внутри try/catch блока, необходимо


вызвать _resetstkoflw блок catch.

Помимо указанных выше ограничений при использовании /clr параметра


(компиляция среды CLR) нельзя использовать в __except блоках. _malloca
Дополнительные сведения см. в разделе /clr "Ограничения".

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_malloca <malloc.h>

Пример: _malloca
C

// crt_malloca_simple.c

#include <stdio.h>

#include <malloc.h>

void Fn()

char * buf = (char *)_malloca( 100 );

// do something with buf

_freea( buf );

int main()

Fn();

Пример: _malloca исключение


C

// crt_malloca_exception.c

// This program demonstrates the use of

// _malloca and trapping any exceptions

// that may occur.

#include <windows.h>

#include <stdio.h>

#include <malloc.h>

int main()

int size;

int numberRead = 0;

int errcode = 0;

void *p = NULL;

void *pMarker = NULL;

while (numberRead == 0)

printf_s("Enter the number of bytes to allocate "

"using _malloca: ");

numberRead = scanf_s("%d", &size);

// Do not use try/catch for _malloca,

// use __try/__except, since _malloca throws

// Structured Exceptions, not C++ exceptions.

__try

if (size > 0)

p = _malloca( size );

else

printf_s("Size must be a positive number.");

_freea( p );

// Catch any exceptions that may occur.

__except( GetExceptionCode() == STATUS_STACK_OVERFLOW )

printf_s("_malloca failed!\n");

// If the stack overflows, use this function to restore.

errcode = _resetstkoflw();

if (errcode)

printf("Could not reset the stack!");

_exit(1);

};

Входные данные
Input

1000

Пример полученных результатов


Output

Enter the number of bytes to allocate using _malloca: 1000

См. также раздел


Выделение памяти

calloc

malloc

realloc

_resetstkoflw
_matherr
Статья • 03.04.2023

Обрабатывает математические ошибки.

Синтаксис
C

int _matherr(struct _exception *except);

Параметры
except

Указатель на структуру, содержащую сведения об ошибке.

Возвращаемое значение
_matherr возвращает значение 0, указывающее на ошибку, или ненулевое
значение, указывающее на успешное выполнение:

Если _matherr возвращает значение 0, может отображаться сообщение об


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

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Функция _matherr обрабатывает ошибки, созданные функциями с плавающей
запятой математической библиотеки. Эти функции вызываются _matherr при
обнаружении ошибки. На это взаимодействие не влияет режим с плавающей
запятой компилятора или управляющее слово с плавающей запятой. Так как
_matherr является функцией библиотеки, встроенные математические функции не

будут вызывать ее.


Для специальной обработки ошибок можно указать другое _matherr определение .
Если вы используете динамически связанную версию библиотеки времени
выполнения C (CRT), можно заменить подпрограмму по умолчанию _matherr в
клиентском исполняемом файле пользовательской версией. Однако вы не можете
заменить подпрограмму по умолчанию _matherr в клиенте DLL библиотеки DLL
CRT.

При возникновении ошибки в математической подпрограмме _matherr вызывается


с указателем на структуру _exception типа (определенную в ) в <math.h> качестве
аргумента. Структура _exception содержит следующие элементы.

struct _exception

int type; // exception type - see below

char* name; // name of function where error occurred

double arg1; // first argument to function

double arg2; // second argument (if any) to function

double retval; // value to be returned by function

};

Элемент type указывает тип математической ошибки. Это одно из следующих


значений, определенных в <math.h> :

Макрос Описание

_DOMAIN Ошибка домена аргументов

_SING Сингулярность аргумента

_OVERFLOW Ошибка переполнения диапазона

_PLOSS Частичная потеря значимости

_TLOSS Общая потеря значимости

_UNDERFLOW Результат слишком мал для представления. (Это условие в настоящее время не
поддерживается.)

Элемент name структуры — это указатель на строку, завершающуюся значением


NULL, содержащую имя функции, вызвавшей ошибку. Элементы структуры arg1 и
arg2 указывают значения, вызвавшие ошибку. Если указан только один аргумент,
он сохраняется в arg1 .
Возвращаемое значение по умолчанию для данной ошибки — retval . Если вы
измените возвращаемое значение, оно должно определять, действительно ли
произошла ошибка.

Требования
Подпрограмма Обязательный заголовок

_matherr <math.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

/* crt_matherr.c

* Illustrates writing an error routine for math

* functions.

* The error handling function must be named _matherr

*/

#include <math.h>

#include <string.h>

#include <stdio.h>

int main()

/* Do several math operations that cause errors. The _matherr

* routine handles _DOMAIN errors, but lets the system handle

* other errors normally.

*/

printf( "log( -2.0 ) = %e\n", log( -2.0 ) );

printf( "log10( -5.0 ) = %e\n", log10( -5.0 ) );

printf( "log( 0.0 ) = %e\n", log( 0.0 ) );


}

/* Handle several math errors caused by passing a negative argument

* to log or log10 (_DOMAIN errors). When this happens, _matherr

* returns the natural or base-10 logarithm of the absolute value

* of the argument and suppresses the usual error message.

*/

int _matherr(struct _exception *except)

/* Handle _DOMAIN errors for log or log10. */

if (except->type == _DOMAIN)

if (strcmp(except->name, "log") == 0)

except->retval = log(-(except->arg1));

printf("Special: using absolute value: %s: _DOMAIN "

"error\n", except->name);

return 1;

else if (strcmp(except->name, "log10") == 0)

except->retval = log10(-(except->arg1));

printf("Special: using absolute value: %s: _DOMAIN "

"error\n", except->name);

return 1;

printf("Normal: ");
return 0; /* Else use the default actions */

Output

Special: using absolute value: log: _DOMAIN error

log( -2.0 ) = 6.931472e-01

Special: using absolute value: log10: _DOMAIN error

log10( -5.0 ) = 6.989700e-01

Normal: log( 0.0 ) = -inf

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
__max
Статья • 03.04.2023

Макрос препроцессора, возвращающий большее из двух значений.

Синтаксис
C

#define __max(a,b) (((a) > (b)) ? (a) : (b))

Параметры
a, b

Сравниваемые значения любого числового типа данных.

Возвращаемое значение
Функция __max возвращает больший из двух своих аргументов.

Комментарии
Макрос __max сравнивает два значения и возвращает значение большего.
Аргументы могут быть любого числового типа данных со знаком или без знака.
Оба аргумента и возвращаемое значение должны принадлежать к одному типу
данных.

Возвращаемый аргумент вычисляется макросом дважды. Двойное вычисление


может привести к непредвиденным результатам, если аргумент является
выражением, которое изменяет его значение при вычислении, например *p++ .

Requirements (Требования)
Макрос Обязательный заголовок

__max <stdlib.h>
Пример
Дополнительные сведения см. в примере для __min.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
__min
_mbbtombc , _mbbtombc_l
Статья • 03.04.2023

Преобразует однобайтовый многобайтовый символ в соответствующий


двухбайтовый многобайтовый символ.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned int _mbbtombc(


unsigned int c

);

unsigned int _mbbtombc_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Однобайтовый символ, который необходимо преобразовать.

locale

Используемый языковой стандарт.

Возвращаемое значение
Если функция _mbbtombc успешно преобразовывает c , она возвращает
многобайтовый символ; в противном случае она возвращает c .

Комментарии
Функция _mbbtombc преобразовывает указанный однобайтовый многобайтовый
символ в соответствующий двухбайтовый многобайтовый символ. Символы
должны находиться в диапазоне 0x20 — 0x7E или 0xA1 — 0xDF для
преобразования.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделе setlocale, _wsetlocale. Версии этих функций
идентичны, за исключением того, что функция _mbbtombc использует текущий
языковой стандарт для поведения, зависящего от языкового стандарта, а функция
_mbbtombc_l вместо этого использует переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

В более ранних версиях функция _mbbtombc называлась hantozen . Для нового кода
используйте _mbbtombc .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_mbbtombc <mbstring.h>

_mbbtombc_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

_mbctombb, _mbctombb_l
_mbbtype , _mbbtype_l
Статья • 03.04.2023

Возвращает тип байта, основываясь на предыдущем байте.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _mbbtype(

unsigned char c,

int type

);

int _mbbtype_l(

unsigned char c,

int type,

_locale_t locale

);

Параметры
c

Проверяемый символ.

type

Тип байта для проверки.

locale

Используемый языковой стандарт.

Возвращаемое значение
_mbbtype возвращает тип байта в строке. Это решение контекстно зависимо — на

это указывает значение параметра type , который определяет условие проверки


управления. type — это тип предыдущего байта в строку. Константы манифеста,
представленные в приведенной ниже таблице, определены в файле Mbctype.h.

Значение Функция _mbbtype Возвращаемое c


параметра проверяет значение
type

Любое Допустимый _MBC_SINGLE (0) Один байт (0x20 — 0x7E, 0xA1 — 0xDF)
значение, одиночный байт
кроме 1 или старший байт

Любое Допустимый _MBC_LEAD (1) Байт свинца многобайтового символа


значение, одиночный байт (0x81 — 0x9F, 0xE0 — 0xFC)
кроме 1 или старший байт

Любое Допустимый _MBC_ILLEGAL


Недопустимый символ (любое
значение, одиночный байт значение, кроме 0x20 — 0x7E, 0xA1 —
кроме 1 или старший байт (-1) 0xDF, 0x81 — 0x9F, 0xE0 — 0xFC

1 Допустимый _MBC_TRAIL (2) Конечный байт многобайтового


младший байт символа (0x40 — 0x7E, 0x80 — 0xFC)

1 Допустимый _MBC_ILLEGAL
Недопустимый символ (любое
младший байт значение, кроме 0x20 — 0x7E, 0xA1 —
(-1) 0xDF, 0x81 — 0x9F, 0xE0 — 0xFC

Комментарии
Функция _mbbtype определяет тип байта в многобайтовом символе. Если параметр
type имеет любым значение, кроме 1, _mbbtype проверяет допустимый одиночный

байт или старший байт многобайтового символа. Если значение параметра type
равно 1, _mbbtype проверяет допустимый младший байт многобайтового символа.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделеsetlocale . _wsetlocale Версия _mbbtype этой
функции использует текущий языковой стандарт для этого поведения, зависящего
от языкового стандарта; _mbbtype_l версия идентична, за исключением того, что
вместо нее используется переданный параметр языкового стандарта. Для
получения дополнительной информации см. Locale.

В более ранних версиях функция _mbbtype называлась chkctype . Для нового кода
используйте вместо нее _mbbtype .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_mbbtype <mbstring.h> <mbctype.h>*

_mbbtype_l <mbstring.h> <mbctype.h>*

* Для определения констант манифеста, которые используются в качестве


возвращаемых значений.

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов
_mbccpy , _mbccpy_l
Статья • 03.04.2023

Копирует многобайтовый символ из одной строки в другую. Доступны более


безопасные версии этих функций; see _mbccpy_s, _mbccpy_s_l.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

void _mbccpy(

unsigned char *dest,


const unsigned char *src

);

void _mbccpy_l(

unsigned char *dest,


const unsigned char *src,

_locale_t locale

);

Параметры
dest

Место назначения копирования.

src

Многобайтовый символ для копирования.

locale

Используемый языковой стандарт.

Комментарии
Функция _mbccpy копирует один многобайтовый символ из src в dest .
Эта функция проверяет свои параметры. Если _mbccpy передается пустой указатель
или dest src вызывается обработчик недопустимых параметров, как описано в
разделе "Проверка параметров". Если выполнение может быть продолжено,
параметр errno устанавливается в значение EINVAL .

Функция _mbccpy использует текущий языковой стандарт для любого поведения,


зависящего от языкового стандарта. Функция _mbccpy_l идентична функции
_mbccpy , но в функции _mbccpy_l для любого поведения, зависящего от языкового
стандарта, используется переданный в параметре языковой стандарт. Для
получения дополнительной информации см. Locale.

Примечание о безопасности. Следует использовать строку, оканчивающуюся


нуль-символом. Длина строки, завершающейся нуль-символом, не должна
превышать размер буфера назначения. Дополнительные сведения см. в разделе
"Предотвращение переполнения буфера". Проблемы переполнения буфера — это
распространенный метод атак на системы, который приводит к
несанкционированному повышению уровня прав.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE Определенные


Tchar.h определены Определенные

_tccpy Сопоставляется макросу или _mbccpy Сопоставляется макросу


встраиваемой функции или встраиваемой
функции

_tccpy_l Недоступно _mbccpy_l Недоступно

Требования
Подпрограмма Обязательный заголовок

_mbccpy <mbctype.h>

_mbccpy_l <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Локаль

Интерпретация последовательностей многобайтовых символов

_mbclen, mblen, _mblen_l


_mbccpy_s , _mbccpy_s_l
Статья • 03.04.2023

Копирует один многобайтовый символ из одной строки в другую. Эти версии


имеют улучшения безопасности, как описано в функциях
_mbccpy_mbccpy_lбезопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _mbccpy_s(

unsigned char *dest,


size_t buffSizeInBytes,

int * pCopied,

const unsigned char *src

);

errno_t _mbccpy_s_l(

unsigned char *dest,


size_t buffSizeInBytes,

int * pCopied,

const unsigned char *src,

_locale_t locale

);

template <size_t size>

errno_t _mbccpy_s(

unsigned char (&dest)[size],

int * pCopied,

const unsigned char *src

); // C++ only

template <size_t size>

errno_t _mbccpy_s_l(

unsigned char (&dest)[size],

int * pCopied,

const unsigned char *src,

_locale_t locale

); // C++ only

Параметры
dest

Место назначения копирования.

buffSizeInBytes

Размер буфера назначения.

pCopied

Заполняется числом скопированных байтов (1 или 2 в случае успешного


выполнения). Если это значение не важно, передайте NULL .

src

Многобайтовый символ для копирования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи. Если src или
dest есть NULL или больше buffSizeinBytes байтов копируются dest в, вызывается

обработчик недопустимых параметров, как описано в разделе "Проверка


параметров". Если выполнение разрешено продолжать, функции возвращаются
EINVAL и errno устанавливаются в значение EINVAL .

Комментарии
Функция _mbccpy_s копирует один многобайтовый символ из src в dest . Если src
не указывает на ведущий байт многобайтового символа, определяемый неявным
вызовом _ismbblead, то копируется один байт, src указывающий на этот символ.
Если src указывает на байт свинца, но следующий байт равен 0 и, следовательно,
является недопустимым, то 0 копируется dest в , errno имеет значение EILSEQ , а
функция возвращает . EILSEQ

_mbccpy_s не добавляет признак конца NULL; однако, если src указывает на нуль-

символ, этот null копируется dest в (как обычная однобайтовая копия).

Значение pCopied заполняется числом скопированных байтов. В случае успешного


выполнения операции возможны значения 1 и 2. Если передано значение NULL ,
этот параметр не учитывается.
src копируется в dest pCopied Возвращаемое
значение

не старший байт не старший байт 1 0

0 0 1 0

старший байт, за которым старший байт, за которым 2 0


следует не 0 следует не 0

старший байт, за которым 0 1 EILSEQ


следует 0

Вторая строка — это просто особый случай первой строки. В таблице


предполагается buffSizeInBytes >= pCopied .

Функция _mbccpy_s использует текущий языковой стандарт для любого поведения,


зависящего от языкового стандарта. Функция _mbccpy_s_l идентична функции
_mbccpy_s , но в функции _mbccpy_s_l для любого поведения, зависящего от

языкового стандарта, используется переданный в параметре языковой стандарт.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE Определенные


Tchar.h определены Определенные

_tccpy_s Сопоставляется макросу или _mbccpy_s Сопоставляется макросу


встраиваемой функции. или встраиваемой
функции.

Требования
Подпрограмма Обязательный заголовок

_mbccpy_s <mbstring.h>
Подпрограмма Обязательный заголовок

_mbccpy_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Локаль

Интерпретация последовательностей многобайтовых символов

_mbclen, mblen, _mblen_l


_mbcjistojms , _mbcjistojms_l ,
_mbcjmstojis , _mbcjmstojis_l
Статья • 03.04.2023

Преобразуют символы стандартов Japan Industry Standard (JIS) и Japan Microsoft


(JMS) в разных направлениях.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned int _mbcjistojms(

unsigned int c

);

unsigned int _mbcjistojms_l(

unsigned int c,

_locale_t locale

);

unsigned int _mbcjmstojis(

unsigned int c

);

unsigned int _mbcjmstojis_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Символ для преобразования.

locale

Используемый языковой стандарт.


Возвращаемое значение
Для японского языкового стандарта эти функции возвращают преобразованный
символ или 0, если преобразование невозможно. Для других языковых стандартов
эти функции возвращают переданный символ.

Комментарии
Функция _mbcjistojms преобразует символ стандарта Japan Industry Standard (JIS) в
символ Microsoft Kanji (Shift JIS). Символ преобразуется, только если байты свинца
и следа находятся в диапазоне 0x21 — 0x7E. Если старший или младший байт лежит
вне этого диапазона, errno получает значение EILSEQ . Дополнительные сведения
об этом и других кодах ошибок см. в разделе errno, и _doserrno_sys_errlist_sys_nerr.

Функция _mbcjmstojis преобразует символ SHIFT JIS в символ JIS. Символ


преобразуется только в том случае, если байт свинца находится в диапазоне 0x81 -
0x9F или 0xE0 - 0xFC, а конечный байт находится в диапазоне 0x40 - 0x7E или 0x80 -
0xFC. Некоторые кодовые точки в этом диапазоне не имеют назначенного
символа, поэтому его нельзя преобразовать.

Параметр c должен иметь 16-разрядное значение, старшие 8 бит которого


представляют старший байт преобразуемого символа, а младшие 8 бит —
соответственно его младший байт.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

В более ранних версиях _mbcjistojms и _mbcjmstojis были вызваны jistojms и


jmstojis соответственно. _mbcjistojms , _mbcjistojms_l _mbcjmstojis и
_mbcjmstojis_l следует использовать вместо него.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_mbcjistojms <mbstring.h>

_mbcjistojms_l <mbstring.h>

_mbcjmstojis <mbstring.h>

_mbcjmstojis_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

_ismbb Процедуры
_mbclen , mblen , _mblen_l , _mbclen_l
Статья • 03.04.2023

Получает длину многобайтового символа и определяет его допустимость.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

size_t _mbclen(

const unsigned char *c

);

size_t _mbclen_l(

unsigned char const* c,

_locale_t locale

);

int mblen(

const char *mbstr,

size_t count

);

int _mblen_l(

const char *mbstr,

size_t count,

_locale_t locale

);

Параметры
c

Многобайтовый символ.

mbstr

Адрес последовательности байтов (многобайтовый символ).

count

Число проверяемых байтов.


locale

Используемый языковой стандарт.

Возвращаемое значение
_mbclen и _mbclen_l возвращает значение 1 или 2 в соответствии с длиной
многобайтового символа c . Функции всегда возвращают значение 1 для UTF-8
независимо от того, является ли c многобайтовый. Не возвращается ошибка для
_mbclen .

Если mbstr значение не NULL задано и _mblen_l mblen возвращает длину


многобайтового символа в байтах. Функции mblen работают _mblen_l правильно в
UTF-8 и могут возвращать значение от 1 до 3. Если mbstr ( NULL или указывает на
расширенный символ NULL) mblen и _mblen_l возвращается 0. Объект,
указывающий на то, mbstr должен формировать допустимый многобайтовый
символ в первых count символах или _mblen_l mblen возвращать -1.

Комментарии
Функция _mbclen возвращает длину многобайтового символа c в байтах. Если c не
указывает на ведущий байт многобайтового символа (как определено неявным
вызовом _ismbblead, результат _mbclen будет непредсказуемым.

mblen возвращает длину в байтах mbstr , если это допустимый многобайтовый


символ. Он также определяет допустимость многобайтовых символов, связанную с
кодовой страницей. Функция mblen проверяет count или меньшее число байтов,
содержащихся в mbstr , но не более MB_CUR_MAX байтов.

Выходное значение зависит от LC_CTYPE параметра категории языкового стандарта.


Версии этих функций без суффикса _l используют текущий языковой стандарт для
этого поведения, зависяющего от языкового стандарта. Суффиксовые _l версии
ведут себя одинаково, но вместо этого используют переданный параметр
языкового стандарта. Дополнительные сведения см. в разделе setlocale и языковом
стандарте.

_mbclen , _mblen_l и _mbclen_l являются конкретными корпорацией Майкрософт, а


не частью стандартной библиотеки C. Мы не рекомендуем использовать их, где
требуется переносимый код. Для совместимости c уровня "Стандартный"
используйте mblen или mbrlen вместо этого.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE Определенные


Tchar.h определены Определенные

_tclen Сопоставляется макросу или _mbclen Сопоставляется макросу


встраиваемой функции или встраиваемой
функции

Требования
Подпрограмма Обязательный заголовок

_mbclen <mbstring.h>

mblen <stdlib.h>

_mblen_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_mblen.c

/* illustrates the behavior of the mblen function

*/

#include <stdlib.h>

#include <stdio.h>

int main( void )

int i;

char *pmbc = (char *)malloc( sizeof( char ) );

wchar_t wc = L'a';

printf( "Convert wide character to multibyte character:\n" );

wctomb_s( &i, pmbc, sizeof(char), wc );

printf( " Characters converted: %u\n", i );

printf( " Multibyte character: %x\n\n", *pmbc );

i = mblen( pmbc, MB_CUR_MAX );

printf( "Length in bytes of multibyte character %x: %u\n", *pmbc, i );

pmbc = NULL;

i = mblen( pmbc, MB_CUR_MAX );

printf( "Length in bytes of NULL multibyte character %x: %u\n", pmbc, i


);

Output

Convert wide character to multibyte character:

Characters converted: 1

Multibyte character: 61

Length in bytes of multibyte character 61: 1

Length in bytes of NULL multibyte character 0: 0

См. также раздел


Классификация символов

Локаль

Интерпретация последовательностей многобайтовых символов

_mbccpy, _mbccpy_l

mbrlen

strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l


_mbctohira , _mbctohira_l , _mbctokata ,
_mbctokata_l
Статья • 03.04.2023

Преобразует символы хирагана в катакана и наоборот.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned int _mbctohira(

unsigned int c

);

unsigned int _mbctohira_l(

unsigned int c,

_locale_t locale

);

unsigned int _mbctokata(

unsigned int c

);

unsigned int _mbctokata_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Многобайтовый символ для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает преобразованный символ c , если это
возможно. В противном случае символ c возвращается без изменений.

Комментарии
Функции _mbctohira и _mbctokata проверяют символ c и, если это возможно,
выполняют одно из следующих преобразований.

Подпрограммы Преобразования

_mbctohira , Многобайтовые символы катакана в многобайтовые символы


_mbctohira_l хирагана.

_mbctokata , Многобайтовые символы хирагана в многобайтовые символы


_mbctokata_l катакана.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
идентичны за исключением того, что версии без суффикса _l используют текущий
языковой стандарт для этого поведения, зависимого от языкового стандарта, а
версии с суффиксом _l — параметр языкового стандарта, переданный в функцию.
Для получения дополнительной информации см. Locale.

В более ранних версиях функция _mbctohira называлась jtohira , а функция


_mbctokata — jtokata . В новом коде используйте новые имена.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_mbctohira <mbstring.h>

_mbctohira_l <mbstring.h>

_mbctokata <mbstring.h>

_mbctokata_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также:
Преобразование данных

_mbcjistojms, _mbcjistojms_l, _mbcjmstojis, _mbcjmstojis_l

_mbctolower, _mbctolower_l, _mbctoupper, _mbctoupper_l

_mbctombb, _mbctombb_l
_mbctolower , _mbctolower_l ,
_mbctoupper , _mbctoupper_l
Статья • 03.04.2023

Проверяет и преобразовывает регистр многобайтового символа.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned int _mbctolower(

unsigned int c

);

unsigned int _mbctolower_l(

unsigned int c,

_locale_t locale

);

unsigned int _mbctoupper(

unsigned int c

);

unsigned int _mbctoupper_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Многобайтовый символ для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает преобразованный символ c , если это
возможно. В противном случае символ c возвращается без изменений.

Комментарии
Функции проверяют символ c и, если это возможно, выполняют одно из
следующих преобразований.

Подпрограммы Преобразования

_mbctolower , _mbctolower_l Символ верхнего регистра в символ нижнего регистра.

_mbctoupper , _mbctoupper_l Символ нижнего регистра в символ верхнего регистра.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версия этой функции
без суффикса _l использует текущий языковой стандарт для данной
функциональности, зависящей от языкового стандарта; версия с суффиксом _l
идентична версии без суффикса, но использует переданный параметр языкового
стандарта. Для получения дополнительной информации см. Locale.

В предыдущих версиях _mbctolower назывался jtolower , а _mbctoupper — jtoupper .


В новом коде используйте новые имена.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_totlower tolower _mbctolower towlower

_totlower_l _tolower_l _mbctolower_l _towlower_t

_totupper toupper _mbctoupper towupper

_totupper_l toupper_l _mbctoupper_l _towupper_l

Требования
Подпрограммы Обязательный заголовок

_mbctolower , _mbctolower_l <mbstring.h>

_mbctoupper , _mbctoupper_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

_mbbtombc, _mbbtombc_l

_mbcjistojms, _mbcjistojms_l, _mbcjmstojis, _mbcjmstojis_l

_mbctohira, _mbctohira_l, _mbctokata, _mbctokata_l

_mbctombb, _mbctombb_l
_mbctombb , _mbctombb_l
Статья • 03.04.2023

Преобразует двухбайтовый многобайтовый символ в соответствующий


однобайтовый многобайтовый символ.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned int _mbctombb(


unsigned int c

);

unsigned int _mbctombb_l(

unsigned int c,

_locale_t locale

);

Параметры
c

Многобайтовый символ для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
В случае успешного _mbctombb выполнения и _mbctombb_l возвращает
однобайтовый символ, соответствующий ; в c противном случае возвращается c .

Комментарии
Функции _mbctombb и _mbctombb_l преобразуют заданный многобайтовый символ в
соответствующий однобайтовый многобайтовый символ. Символы должны
соответствовать однобайтовой символам в диапазоне 0x20 ( 0x7E или 0xA1 - 0xDF
для преобразования.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версия этой функции
без суффикса _l использует текущий языковой стандарт для данной
функциональности, зависящей от языкового стандарта; версия с суффиксом _l
идентична версии без суффикса, но использует переданный параметр языкового
стандарта. Для получения дополнительной информации см. Locale.

В предыдущих версиях функция _mbctombb называлась zentohan . Взамен


рекомендуется использовать _mbctombb .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_mbctombb <mbstring.h>

_mbctombb_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

_mbbtombc, _mbbtombc_l

_mbcjistojms, _mbcjistojms_l, _mbcjmstojis, _mbcjmstojis_l

_mbctohira, _mbctohira_l, _mbctokata, _mbctokata_l

_mbctolower, _mbctolower_l, _mbctoupper, _mbctoupper_l


mbrlen
Статья • 03.04.2023

Определяют число байтов, необходимое для составления многобайтового символа


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

Синтаксис
C

size_t mbrlen(

const char * str,

size_t count,

mbstate_t * mbstate

);

Параметры
str

Указатель на следующий байт для проверки в строке многобайтовых символов.

count

Максимальное число байтов для проверки.

mbstate

Указатель на текущее состояние сдвига начального байта str .

Возвращаемое значение
Одно из следующих значений:

Значение Описание

0 Если следующие count или менее байт составляют многобайтовый символ,


представляющий расширенный нуль-символ.

от 1 до count Если следующие count или менее байт составляют допустимый


включительно многобайтовый символ. Возвращаемое значение равно количеству байтов,
составляющих многобайтовый символ.
Значение Описание

(size_t)(-2) Если следующие count байт складываются в неполный, но потенциально


допустимый многобайтовый символ и все байты count были обработаны.

(size_t)(-1) Произошла ошибка кодирования. Следующие count или меньше байтов не


способствуют созданию полного и допустимого многобайтового символа. В
этом случае для errno будет установлено значение EILSEQ, а состояние
преобразования в mbstate будет не определено.

Комментарии
Функция mbrlen проверяет не более count байт, начиная с байта, на который
указывает параметр str , для определения числа байтов, необходимых для
составления следующего многобайтового символа, включая любые
последовательности сдвигов. Это эквивалентно вызову mbrtowc(NULL, str, count,
&mbstate) , где mbstate является либо предоставленным mbstate_t пользователем
объектом, либо статическим внутренним объектом, предоставляемым
библиотекой.

Функция mbrlen сохраняет и использует состояние сдвига неполного


многобайтового символа в параметре mbstate . Именно поэтому ** mbrlen ** может
перезапуститься в середине многобайтового символа, если это необходимо, и
проверить не более count байтов. Если mbstate является пустым указателем,
mbrlen использует внутренний статичный объект mbstate_t для хранения состояния
сдвига. Так как внутренний mbstate_t объект не является потокобезопасной,
рекомендуется всегда выделять и передавать собственный mbstate параметр.

Функция mbrlen отличается от _mbclen, mblenвозможностью _mblen_l перезапуска.


Состояние сдвига хранится в переменной mbstate для последующих вызовов тех
же или других перезапускаемых функций. При смешанном использовании
перезапускаемых и неперезапускаемых функций результаты становятся
неопределенными. Например, в приложении необходимо использовать функцию
wcsrlen вместо функции wcslen , если в последующем вызове используется
функция wcsrtombs , а не функция wcstombs .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом
Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные Определенные

Неприменимо Неприменимо mbrlen Неприменимо

Требования
Подпрограмма Обязательный заголовок

mbrlen <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
В этом примере показано, как интерпретация многобайтовых символов зависит от
текущей кодовой страницы, и демонстрируется возможность продолжения
выполнения функции mbrlen .

// crt_mbrlen.c

// Compile by using: cl crt_mbrlen.c

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <locale.h>

#include <wchar.h>

size_t Example(const char * pStr)

size_t charLen = 0;

size_t charCount = 0;

mbstate_t mbState = {0};

while ((charLen = mbrlen(pStr++, 1, &mbState)) != 0 &&

charLen != (size_t)-1)

if (charLen != (size_t)-2) // if complete mbcs char,

charCount++;

return (charCount);

int main( void )

int cp;

size_t charCount = 0;

const char *pSample =

"\x82\xD0\x82\xE7\x82\xAA\x82\xC8: Shift-jis hiragana.";

cp = _getmbcp();

charCount = Example(pSample);
printf("\nCode page: %d\n%s\nCharacter count: %d\n",
cp, pSample, charCount);

setlocale(LC_ALL, "ja-JP"); // Set Japanese locale

_setmbcp(932); // and Japanese multibyte code page

cp = _getmbcp();

charCount = Example(pSample);
printf("\nCode page: %d\n%s\nCharacter count: %d\n",
cp, pSample, charCount);

Output

Code page: 0

é╨éτé¬é╚: Shift-jis hiragana.

Character count: 29

Code page: 932

????: Shift-jis hiragana.

Character count: 25

См. также раздел


Манипуляция со строками

Локаль
mbrtoc16 , mbrtoc32
Статья • 03.04.2023

Преобразует первый многобайтовый символ UTF-8 в строке в эквивалентный


символ в кодировке UTF-16 или UTF-32.

Синтаксис
C

size_t mbrtoc16(

char16_t* destination,

const char* source,

size_t max_bytes,

mbstate_t* state

);

size_t mbrtoc32(

char32_t* destination,

const char* source,

size_t max_bytes,

mbstate_t* state

);

Параметры
destination

Указатель на эквивалент char16_t или char32_t многобайтового символа UTF-8,


который нужно преобразовать. Если значение равно NULL, функция не сохраняет
значение.

source

Указатель на строку многобайтовых символов UTF-8, которую нужно


преобразовать.

max_bytes

Максимальное число байтов в source , которое нужно проанализировать на


наличие символа для преобразования. Этот аргумент должен быть значением
между одним и числом байтов, включая любой признак конца NULL, оставшийся в
source .
state

Указатель на объект состояния преобразования, используемый mbstate_t для


интерпретации многобайтовой строки UTF-8 на один или несколько выходных
символов.

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

Значение Условие

0 Следующие max_bytes или меньше символов, преобразованных


из source соответствия широкому символу NULL, который
является значением, хранящимся, если destination значение не
равно NULL.

state содержит начальное состояние сдвига.

От 1 до Возвращаемое значение равно количеству байтов в source ,


max_bytes включительно составляющих допустимый многобайтовый символ.
Преобразованный расширенный символ сохраняется, если
destination значение не равно NULL.

–3 Следующий расширенный символ, полученный из предыдущего


вызова функции, хранится, destination если destination значение
не равно NULL. Байты из source не используются при этом вызове
функции.

При source указании на многобайтовый символ UTF-8, для


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

-2 Следующие max_bytes байты представляют неполный, но


потенциально допустимый многобайтовый символ UTF-8.
Значение в destination не сохраняется. Этот результат может быть
получен, если max_bytes равно нулю.

-1 Произошла ошибка кодирования. Следующие max_bytes или


меньше байтов не влияют на полный и допустимый
многобайтовый символ UTF-8. Значение в destination не
сохраняется.

EILSEQ хранится в errno , а значение state состояния


преобразования не указано.
Комментарии
Функция mbrtoc16 считывает до max_bytes байтов source , чтобы найти первый
полный, допустимый многобайтовый символ UTF-8, а затем сохраняет
эквивалентный символ UTF-16 в destination . Если для символа требуется
несколько выходных символов UTF-16, таких как суррогатная пара, state значение
задается для хранения следующего символа UTF-16 при destination следующем
вызове mbrtoc16 . Функция mbrtoc32 идентична, но выходные данные сохраняются в
виде символа в формате UTF-32.

Если source значение равно NULL, эти функции возвращают эквивалент вызова,
выполненного с использованием аргументов NULL for destination , "" (пустая,
строка, завершающаяся null) для source и 1 для max_bytes . Значения, передаваемые
в параметрах destination и max_bytes , игнорируются.

Если source значение не равно NULL, функция начинается в начале строки и


проверяет до max_bytes байтов, чтобы определить количество байтов,
необходимых для завершения следующего многобайтового символа UTF-8,
включая все последовательности сдвига. Если проверяемые байты содержат
допустимый и полный многобайтовый символ UTF-8, функция преобразует его в
эквивалентный 16- или 32-битовый расширенный символ (либо несколько
символов). Если destination значение не равно NULL, функция сохраняет первый
(и, возможно, только) символ результата в назначении. Если требуются
дополнительные выходные символы, задается state значение, чтобы последующие
вызовы функции выводили дополнительные символы и возвращали значение -3.
Если дополнительных символов больше не требуется, state устанавливается в
начальное состояние сдвига.

Чтобы преобразовать многобайтовые символы, отличные от UTF-8, в символы LE


UTF-16, используйте mbrtowcфункции , mbtowc или _mbtowc_l .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Заголовок C Заголовок C++

mbrtoc16 , mbrtoc32 <uchar.h> <cuchar>


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

c16rtomb, c32rtomb

mbrtowc

mbsrtowcs

mbsrtowcs_s
mbrtowc
Статья • 03.04.2023

Преобразуют многобайтовый символ в текущем языковом стандарте в


эквивалентный расширенный символ с возможностью перезапуска в середине
многобайтового символа.

Синтаксис
C

size_t mbrtowc(

wchar_t *wchar,

const char *mbchar,

size_t count,

mbstate_t *mbstate

);

Параметры
wchar

Адрес расширенного символа для получения преобразованной строки


расширенных символов (тип wchar_t ). Это значение может быть пустым
указателем, если не требуется возвращать расширенный символ.

mbchar

Адрес последовательности байтов (многобайтовый символ).

count

Число проверяемых байтов.

mbstate

Указатель на объект состояния преобразования. Если это значение является пустым


указателем, функция использует статичный внутренний объект состояния
преобразования. Так как внутренний mbstate_t объект не является
потокобезопасной, рекомендуется всегда передавать собственный mbstate
аргумент.

Возвращаемое значение
Принимает одно из следующих значений:

0 Следующий count или меньше байтов заполняют многобайтовый символ,


представляющий широкий символ NULL, который хранится в wchar , если wchar не
является пустым указателем.

От 1 до count включительно Следующий count или меньше байтов заполняют


допустимый многобайтовый символ. Возвращаемое значение равно количеству
байтов, составляющих многобайтовый символ. Эквивалент расширенных символов
хранится в wchar , если wchar не является пустым указателем.

(size_t) (-1) Произошла ошибка кодирования. Следующие count или меньше байтов
не способствуют созданию полного и допустимого многобайтового символа. В
этом случае значение errno будет EILSEQ, а состояние сдвига преобразования в
mbstate будет не определено.

(size_t) (-2) Следующие count байты приводят к неполному, но потенциально


допустимому многобайтового символа, и все count байты были обработаны.
Значение в wchar не сохраняется, но mbstate обновляется для перезапуска
функции.

Комментарии
Если параметр mbchar является пустым указателем, функция эквивалентна вызову:

mbrtowc(NULL, "", 1, &mbstate)

В этом случае значения аргументов wchar и count игнорируются.

Если mbchar не является пустым указателем, функция проверяет байты count из


mbchar , чтобы определить необходимое количество байтов, необходимых для

завершения следующего многобайтового символа. Если следующий символ


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

расширенному нуль-символу, результирующее состояние mbstate является


начальным состоянием преобразования.

Функция mbrtowc отличается от mbtowcфункции возможностью _mbtowc_l


перезапуска. Состояние преобразования хранится в переменной mbstate для
последующих вызовов тех же или других перезапускаемых функций. При
смешанном использовании перезапускаемых и неперезапускаемых функций
результаты становятся неопределенными. Например, в приложении необходимо
использовать функцию wcsrlen вместо функции wcslen , если в последующем
вызове используется функция wcsrtombs , а не функция wcstombs .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Пример
Преобразует многобайтовый символ в эквивалентный расширенный символ.

C++

// crt_mbrtowc.cpp

#include <stdio.h>

#include <mbctype.h>

#include <string.h>

#include <locale.h>

#include <wchar.h>

#define BUF_SIZE 100

int Sample(char* szIn, wchar_t* wcOut, int nMax)

mbstate_t state = {0}; // Initial state

size_t nConvResult,

nmbLen = 0,

nwcLen = 0;

wchar_t* wcCur = wcOut;

wchar_t* wcEnd = wcCur + nMax;

const char* mbCur = szIn;

const char* mbEnd = mbCur + strlen(mbCur) + 1;

char* szLocal;

// Sets all locale to French_Canada.1252

szLocal = setlocale(LC_ALL, "French_Canada.1252");

if (!szLocal)

printf("The fuction setlocale(LC_ALL, \"French_Canada.1252\")


failed!\n");

return 1;

printf("Locale set to: \"%s\"\n", szLocal);

// Sets the code page associated current locale's code page

// from a previous call to setlocale.

if (_setmbcp(_MB_CP_SBCS) == -1)

printf("The fuction _setmbcp(_MB_CP_SBCS) failed!");

return 1;

while ((mbCur < mbEnd) && (wcCur < wcEnd))

//

nConvResult = mbrtowc(wcCur, mbCur, 1, &state);

switch (nConvResult)

case 0:

{ // done

printf("Conversion succeeded!\nMultibyte String: ");

printf(szIn);

printf("\nWC String: ");

wprintf(wcOut);

printf("\n");

mbCur = mbEnd;

break;

case -1:

{ // encoding error

printf("The call to mbrtowc has detected an encoding


error.\n");

mbCur = mbEnd;

break;

case -2:

{ // incomplete character

if (!mbsinit(&state))

printf("Currently in middle of mb conversion, state =


%x\n", state);

// state will contain data regarding lead byte of mb


character

++nmbLen;

++mbCur;

break;

default:

if (nConvResult > 2) // The multibyte should never be


larger than 2

printf("Error: The size of the converted multibyte is


%d.\n", nConvResult);

++nmbLen;

++nwcLen;

++wcCur;

++mbCur;

break;

return 0;

int main(int argc, char* argv[])

char mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";

wchar_t wcBuf[BUF_SIZE] = {L''};

return Sample(mbBuf, wcBuf, BUF_SIZE);

Пример полученных результатов


Output

Locale set to: "French_Canada.1252"

Conversion succeeded!

Multibyte String: AaBbCcÜïα∩≡xXyYzZ

WC String: AaBbCcÜïα∩≡xXyYzZ

Требования
Подпрограмма Обязательный заголовок

mbrtowc <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов


_mbsbtype , _mbsbtype_l
Статья • 03.04.2023

Возвращает тип байта в строке.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _mbsbtype(

const unsigned char *mbstr,

size_t count

);

int _mbsbtype_l(

const unsigned char *mbstr,

size_t count,

_locale_t locale

);

Параметры
mbstr

Адрес последовательности многобайтовых символов.

count

Смещение в байтах относительно заголовка строки.

locale

Используемый языковой стандарт.

Возвращаемое значение
_mbsbtype и _mbsbtype_l возвращает целочисленное значение, указывающее

результат теста на указанном байте. Константы манифеста, представленные в


приведенной ниже таблице, определены в файле Mbctype.h.

Возвращаемое Тип байта


значение

_MBC_SINGLE (0) Однобайтовый символ. Например, на кодовой странице 932 возвращает


значение 0, _mbsbtype если указанный байт находится в диапазоне 0x20 —
0x7E или 0xA1 — 0xDF.

_MBC_LEAD (1) Старший байт многобайтового символа. Например, на кодовой странице


932 возвращает значение 1, _mbsbtype если указанный байт находится в
диапазоне 0x81 - 0x9F или 0xE0 - 0xFC.

_MBC_TRAIL (2) Младший байт многобайтового символа. Например, на кодовой странице


932 возвращается значение 2, _mbsbtype если указанный байт находится в
диапазоне 0x40 — 0x7E или 0x80 — 0xFC.

_MBC_ILLEGAL NULL строка, недопустимый символ или пустой байт, найденный до байта
(-1) со смещением count в mbstr .

Комментарии
Функция _mbsbtype определяет тип байта в строке многобайтовых символов. Эта
функция проверяет только байт со смещением count в mbstr , пропуская
недопустимые символы перед указанным байтом.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версия этой функции
без суффикса _l использует текущий языковой стандарт для данной
функциональности, зависящей от языкового стандарта; версия с суффиксом _l
идентична версии без суффикса, но использует переданный параметр языкового
стандарта. Для получения дополнительной информации см. Locale.

Если входная строка имеет значение NULL , вызывается обработчик недопустимых


параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, параметр errno устанавливается в значение EINVAL , и
функция возвращает значение _MBC_ILLEGAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_mbsbtype <mbstring.h> <mbctype.h>*

_mbsbtype_l <mbstring.h> <mbctype.h>*

* Для констант манифеста, используемых в качестве возвращаемых значений.

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Классификация байтов
mbsinit
Статья • 03.04.2023

Отслеживает состояние преобразования многобайтового символа.

Синтаксис
C

int mbsinit(

const mbstate_t* ps

);

Параметры
ps

Указатель на переменную mbstate_t .

Возвращаемое значение
Ненулевое значение, если ps оно находится NULL или не находится в середине
преобразования.

Комментарии
При использовании одной из функций ANSI, принимающей mbstate_t указатель,
передайте адрес, mbstate_t который будет возвращать сведения о том, был ли
преобразован последний байт в буфере.

Для поддержки многобайтовых символов должна быть установлена


соответствующая кодовая страница.

Пример
C++

// crt_mbsinit.cpp

#include <stdio.h>

#include <mbctype.h>

#include <string.h>

#include <locale.h>

#include <cwchar>

#include <xlocinfo.h>

#define BUF_SIZE 0x40

wchar_t g_wcBuf[BUF_SIZE] = L"This a wc buffer that will be over


written...";

char g_mbBuf[BUF_SIZE] = "AaBbCc\x9A\x8B\xE0\xEF\xF0xXyYzZ";

int g_nInit = strlen(g_mbBuf);

int MbsinitSample(char* szIn, wchar_t* wcOut, int nMax)

mbstate_t state = {0};

size_t nConvResult, nmbLen = 0, nwcLen = 0;

wchar_t* wcCur = wcOut;

wchar_t* wcEnd = wcCur + nMax;

const char* mbCur = szIn;

const char* mbEnd = mbCur + strlen(mbCur) + 1;

char* szLocal = setlocale(LC_ALL, "japanese");

printf("Locale set to: \"%s\"\n", szLocal);

if (_setmbcp(_MB_CP_LOCALE) != -1)

while ((mbCur < mbEnd) && (wcCur < wcEnd))

nConvResult = mbrtowc(wcCur, mbCur, 1, &state);

switch (nConvResult)

case 0:

{ // done

printf("Conversion succeeded!\nMB String: ");

printf(szIn);

printf("\nWC String: ");

wprintf(wcOut);

printf("\n");

mbCur = mbEnd;

break;

case -1:

{ // encoding error
printf("ERROR: The call to mbrtowc has detected an encoding
error.\n");

mbCur = mbEnd;

break;

case -2:

{ // incomplete character

if (!mbsinit(&state))

printf("Currently in middle of mb conversion, state =


%x\n", state);

// state will contain data regarding lead byte of mb


character

++nmbLen;

++mbCur;

break;

default:

if (nConvResult > 2) // Microsoft mb should never be


larger than 2

printf("ERROR: nConvResult = %d\n", nConvResult);

++nmbLen;

++nwcLen;

++wcCur;

++mbCur;

break;

else

printf("ERROR: _setmbcp(932) failed!");

return 0;

int main(int argc, char* argv[])

return MbsinitSample(g_mbBuf, g_wcBuf, BUF_SIZE);

Пример полученных результатов


Output

Locale set to: "Japanese_Japan.932"

Currently in middle of mb conversion, state = 9a

Currently in middle of mb conversion, state = e0

Currently in middle of mb conversion, state = f0

Conversion succeeded!

MB String: AaBbCcxXyYzZ

WC String: AaBbCcxXyYzZ

См. также раздел


Классификация байтов
_mbsnbcat , _mbsnbcat_l
Статья • 03.04.2023

Добавляет не более первых n байт одной многобайтовой строки в другую.


Доступны более безопасные версии этих функций; см. ,_mbsnbcat_s_mbsnbcat_s_l .

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned char *_mbsnbcat(

unsigned char *dest,


const unsigned char *src,

size_t count

);

unsigned char *_mbsnbcat_l(

unsigned char *dest,


const unsigned char *src,

size_t count,

_locale_t locale

);

template <size_t size>

unsigned char *_mbsnbcat(

unsigned char (&dest)[size],

const unsigned char *src,

size_t count

); // C++ only

template <size_t size>

unsigned char *_mbsnbcat_l(

unsigned char (&dest)[size],

const unsigned char *src,

size_t count,

_locale_t locale

); // C++ only

Параметры
dest

Многобайтовая строка назначения, завершаемая нуль-символом.

src

Исходная многобайтовая строка, завершаемая нуль-символом.

count

Число байтов из src , добавляемых к dest .

locale

Используемый языковой стандарт.

Возвращаемое значение
Функция _mbsnbcat возвращает указатель на целевую строку символов. Нет
зарезервированных возвращаемых значений для указания ошибки.

Комментарии
Функция _mbsnbcat добавляет не более count первых байтов строки src в строку
dest . Если байт непосредственно перед нуль-символом в строке dest является
старшим байтом, он перезаписывается начальным байтом строки src . В
противном случае начальный байт строки src перезаписывает завершающий
нуль-символ строки dest . Если байт NULL встречается в строке src до того как
будет добавлено count байтов, функция _mbsnbcat добавляет все байты из строки
src вплоть до нуль-символа. Если значение count больше длины строки src ,

вместо параметра src используется длина строки count . Результирующая строка


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

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версия _mbsnbcat этой
функции использует текущий языковой стандарт для поведения, зависящего от
языкового стандарта; версия _mbsnbcat_l работает аналогично, но использует
переданный языковой стандарт. Для получения дополнительной информации см.
Locale.

Примечание о безопасности. Следует использовать строку, оканчивающуюся


нуль-символом. Длина строки, завершающейся нуль-символом, не должна
превышать размер буфера назначения. Дополнительные сведения см. в разделе
"Предотвращение переполнения буфера".

Если dest или src нет NULL , функция создаст ошибку недопустимого параметра,
как описано в разделе "Проверка параметров". Если ошибка обработана, функция
возвращает EINVAL и задает для параметра errno значение EINVAL .

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsncat strncat _mbsnbcat wcsncat

_tcsncat_l _strncat_l _mbsnbcat_l _wcsncat_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbcat <mbstring.h>

_mbsnbcat_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


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

_mbsnbcmp, _mbsnbcmp_l

_strncnt, _wcsncnt, _mbsnbcnt, _mbsnbcnt_l, _mbsnccnt, _mbsnccnt_l

_mbsnbcpy, _mbsnbcpy_l

_mbsnbicmp, _mbsnbicmp_l

_mbsnbset, _mbsnbset_l

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

_mbsnbcat_s, _mbsnbcat_s_l
_mbsnbcat_s , _mbsnbcat_s_l
Статья • 03.04.2023

Добавляет к многобайтовой строке символов, по крайней мере первые n байт


другой многобайтовой строки. Эти функции являются версиями _mbsnbcat,
_mbsnbcat_l которые имеют улучшения безопасности, как описано в разделе
Функции безопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _mbsnbcat_s(

unsigned char *dest,


size_t sizeInBytes,

const unsigned char *src,

size_t count

);

errno_t _mbsnbcat_s_l(

unsigned char *dest,


size_t sizeInBytes,

const unsigned char *src,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t _mbsnbcat_s(

unsigned char (&dest)[size],

const unsigned char *src,

size_t count

); // C++ only

template <size_t size>

errno_t _mbsnbcat_s_l(

unsigned char (&dest)[size],

const unsigned char *src,

size_t count,

_locale_t locale

); // C++ only

Параметры
dest

Многобайтовая строка назначения, завершаемая нуль-символом.

sizeInBytes

Размер буфера dest в байтах.

src

Исходная многобайтовая строка, завершаемая нуль-символом.

count

Число байтов из src , добавляемых к dest .

locale

Используемый языковой стандарт.

Возвращаемое значение
Ноль в случае успешного выполнения; в противном случае — код ошибки.

Условия ошибок

dest sizeInBytes src Возвращаемое значение

NULL any any EINVAL

Любой <= 0 any EINVAL

Любой any NULL EINVAL

Если возникает какое-либо из условий ошибки, функция создает ошибку


недопустимого параметра, как описано в разделе Проверка параметров. Если
ошибка обработана, функция возвращает EINVAL и задает для параметра errno
значение EINVAL .

Комментарии
Функция _mbsnbcat_s добавляет в строку dest не более count первых байт строки
src . Если байт, непосредственно предшествующий символу NULL в dest , является

начальным байтом, он перезаписывается начальным байтом src . В противном


случае начальный байт строки src перезаписывает завершающий нуль-символ
строки dest . Если байт NULL встречается в строке src до того как будет добавлено
count байтов, функция _mbsnbcat_s добавляет все байты из строки src вплоть до
нуль-символа. Если значение count больше длины строки src , вместо параметра
src используется длина строки count . Результирующая строка завершается нуль-
символом. Если копирование производится между перекрывающимися строками,
поведение не определено.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
идентичны, но в версиях без суффикса _l используется текущий языковой
стандарт, а в версиях с суффиксом _l используется переданный параметр
языкового стандарта. Для получения дополнительной информации см. Locale.

В C++ использование этих функций упрощается перегрузками шаблонов.


Перегрузки могут автоматически определять длину буфера, что избавляет от
необходимости указывать аргумент размера, и они могут автоматически
использовать более новые, более безопасные функции для замены старых, менее
безопасных функций. Дополнительные сведения см. в разделе Безопасные
перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsncat_s strncat_s _mbsnbcat_s wcsncat_s

_tcsncat_s_l _strncat_s_l _mbsnbcat_s_l _wcsncat_s_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbcat_s <mbstring.h>
Подпрограмма Обязательный заголовок

_mbsnbcat_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Манипуляция со строками

_mbsnbcmp, _mbsnbcmp_l

_strncnt, _wcsncnt, _mbsnbcnt, _mbsnbcnt_l, _mbsnccnt, _mbsnccnt_l

_mbsnbcpy, _mbsnbcpy_l

_mbsnbcpy_s, _mbsnbcpy_s_l

_mbsnbset, _mbsnbset_l

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l


_mbsnbcmp , _mbsnbcmp_l
Статья • 03.04.2023

Сравнивает первые n байтов двух многобайтовых строк.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _mbsnbcmp(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _mbsnbcmp_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);

Параметры
string1 , string2

Строки для сравнения.

count

Число байтов для сравнения.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращаемое значение отражает порядковую взаимосвязь подстрок string1 и
string2 .

Возвращаемое значение Описание

<0 Подстрока string1 меньше, чем подстрока string2 .

0 Подстрока string1 идентична подстроке string2 .

>0 Подстрока string1 больше, чем подстрока string2 .

При ошибке _mbsnbcmp проверки параметра и _mbsnbcmp_l возвращают


_NLSCMPERROR , который определен в <string.h> и <mbstring.h>.

Комментарии
Функции _mbsnbcmp сравнивают не более чем count первых байт в string1 и
string2 и возвращают значение, указывающее отношение между подстроками.

_mbsnbcmp — чувствительная к регистру версия _mbsnbicmp . В отличие от _mbsnbcoll ,

_mbsnbcmp не зависит от порядка параметров сортировки языкового стандарта.


Функция _mbsnbcmp распознает последовательности многобайтовых символов в
соответствии с текущей многобайтовой кодовой страницей.

Функция _mbsnbcmp похожа на _mbsncmp за тем исключением, что _mbsncmp


сравнивает строки посимвольно, а не побайтно.

На выходное значение влияет настройка категории LC_CTYPE языкового стандарта,


которая определяет начальные и конечные байты многобайтовых символов. Для
получения дополнительной информации см. setlocale. Функция _mbsnbcmp
использует текущий языковой стандарт для данной функциональности, зависящей
от языкового стандарта. Функция _mbsnbcmp_l идентична за исключением того, что
она использует вместо этого параметр locale . Для получения дополнительной
информации см. Locale.

Если или string1 string2 является пустым указателем, эти функции вызывают
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение разрешено для продолжения, функции возвращают
_NLSCMPERROR , а errno для задано значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsncmp strncmp _mbsnbcmp wcsncmp

_tcsncmp_l strncmp _mbsnbcml wcsncmp

Требования
Подпрограмма Обязательный заголовок

_mbsnbcmp <mbstring.h>

_mbsnbcmp_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_mbsnbcmp.c

#include <mbstring.h>

#include <stdio.h>

char string1[] = "The quick brown dog jumps over the lazy fox";

char string2[] = "The QUICK brown fox jumps over the lazy dog";

int main( void )

char tmp[20];

int result;

printf( "Compare strings:\n %s\n", string1 );

printf( " %s\n\n", string2 );

printf( "Function: _mbsnbcmp (first 10 characters only)\n" );

result = _mbsncmp( string1, string2 , 10 );

if( result > 0 )

_mbscpy_s( tmp, sizeof(tmp), "greater than" );

else if( result < 0 )

_mbscpy_s( tmp, sizeof(tmp), "less than" );

else

_mbscpy_s( tmp, sizeof(tmp), "equal to" );

printf( "Result: String 1 is %s string 2\n\n", tmp );

printf( "Function: _mbsnicmp _mbsnicmp (first 10 characters only)\n" );

result = _mbsnicmp( string1, string2, 10 );

if( result > 0 )

_mbscpy_s( tmp, sizeof(tmp), "greater than" );

else if( result < 0 )

_mbscpy_s( tmp, sizeof(tmp), "less than" );

else

_mbscpy_s( tmp, sizeof(tmp), "equal to" );

printf( "Result: String 1 is %s string 2\n\n", tmp );

Выходные данные
Output

Compare strings:

The quick brown dog jumps over the lazy fox

The QUICK brown fox jumps over the lazy dog

Function: _mbsnbcmp (first 10 characters only)

Result: String 1 is greater than string 2

Function: _mbsnicmp _mbsnicmp (first 10 characters only)

Result: String 1 is equal to string 2

См. также
Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_mbsnbicmp, _mbsnbicmp_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

Локаль

Интерпретация последовательностей многобайтовых символов


_mbsnbcoll , _mbsnbcoll_l , _mbsnbicoll ,
_mbsnbicoll_l
Статья • 03.04.2023

Сравнивает n байтов двух строк многобайтовых символов, используя данные


многобайтовой кодовой страницы.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _mbsnbcoll(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _mbsnbcoll_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);

int _mbsnbicoll(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _mbsnbicoll_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);

Параметры
string1 , string2

Строки для сравнения.

count

Число сравниваемых байтов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращаемое значение отражает взаимосвязь подстрок string1 и string2 .

Возвращаемое значение Описание

<0 Подстрока string1 меньше, чем подстрока string2 .

0 Подстрока string1 идентична подстроке string2 .

>0 Подстрока string1 больше, чем подстрока string2 .

Если string1 значение или NULL string2 count больше , вызывается


INT_MAX обработчик недопустимых параметров, как описано в разделе Проверка

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


_NLSCMPERROR и устанавливают для errno значение EINVAL . Чтобы использовать

функцию _NLSCMPERROR , включите String.h или Mbstring.h.

Комментарии
Каждая из этих функций сравнивает максимум count первых байтов в string1 и
string2 , после чего возвращает значение, указывающее на отношение между
подстроками string1 и string2 . Если последний байт в подстроке string1 или
string2 является ведущим байтом, он не включается в сравнение; эти функции
сравнивают только полные символы в подстроках. _mbsnbicoll — не
чувствительная к регистру версия _mbsnbcoll . Аналогично функциям _mbsnbcmp и
_mbsnbicmp, функции _mbsnbcoll и _mbsnbicoll сравнивают две строки
многобайтовых символов в соответствии с лексикографическим порядком,
который задается используемой в данный момент многобайтовой кодовой
страницей.
Для некоторых кодовых страниц и соответствующих наборов символов порядок
символов в наборе может отличаться от лексикографического порядка символов. В
языковом стандарте "C" порядок символов в кодировке ASCII совпадает с
лексикографическим порядком символов. Однако, в некоторых европейских
языковых стандартах, например, символ "a" (значение 0x61) предшествует символу
"ä" (значение 0xE4) в кодировке, но "ä" предшествует символу "a"
лексикографически. В таком случае для лексикографического сравнения строк по
байтам используйте функцию _mbsnbcoll вместо _mbsnbcmp . Чтобы проверить
только равенство строк, используйте функцию _mbsnbcmp .

Поскольку функции coll сопоставляют строки для лексикографического


сравнения, тогда как функции cmp просто проверяют на равенство строк, функции
coll гораздо медленнее, чем соответствующие версии cmp . Поэтому функции
следует использовать только в том случае, coll если в текущей кодовой странице
имеется разница между порядком набора символов и лексикографическим
порядком символов, и это различие представляет интерес для сравнения.

На выходное значение влияет параметр LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsncoll _strncoll _mbsnbcoll _wcsncoll

_tcsncoll_l _strncoll_l _mbsnbcoll_l _wcsncoll_l

_tcsnicoll _strnicoll _mbsnbicoll _wcsnicoll

_tcsnicoll_l _strnicoll_l _mbsnbicoll_l _wcsnicoll_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbcoll <mbstring.h>

_mbsnbcoll_l <mbstring.h>

_mbsnbicoll <mbstring.h>

_mbsnbicoll_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_mbsnbcmp, _mbsnbcmp_l

_mbsnbicmp, _mbsnbicmp_l

Функции strcoll

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l


_mbsnbcpy , _mbsnbcpy_l
Статья • 03.04.2023

Копирует n байтов строки в конечную строку. Доступны более безопасные версии


этих функций— см. раздел_mbsnbcpy_s , _mbsnbcpy_s_l.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned char * _mbsnbcpy(

unsigned char * strDest,

const unsigned char * strSource,

size_t count

);

unsigned char * _mbsnbcpy_l(

unsigned char * strDest,

const unsigned char * strSource,

size_t count,

_locale_t locale

);

template <size_t size>

unsigned char * _mbsnbcpy(

unsigned char (&strDest)[size],

const unsigned char * strSource,

size_t count

); // C++ only

template <size_t size>

unsigned char * _mbsnbcpy_l(

unsigned char (&strDest)[size],

const unsigned char * strSource,

size_t count,

_locale_t locale

); // C++ only

Параметры
strDest

Место назначение для копирования строки символов.

strSource

Копируемая строка символов.

count

Число байтов для копирования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Функция _mbsnbcpy возвращает указатель на конечную строку символов. Нет
зарезервированных возвращаемых значений для указания ошибки.

Комментарии
Функция _mbsnbcpy копирует count байт из strSource в strDest . Если count
превышает размер strDest или строки источника и назначения перекрываются,
поведение функции _mbsnbcpy не определено.

Если strSource или strDest является пустым указателем, эта функция вызывает
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, функция возвращает NULL
и устанавливает для параметра errno значение EINVAL .

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
идентичны, за исключением того, что те, которые не имеют _l суффикса,
используют текущий языковой стандарт, а версии, имеющие суффикс _l ,
используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

) Важно!

Эти функции могут быть подвержены угрозам переполнения буфера.


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

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsncpy strncpy _mbsnbcpy wcsncpy

_tcsncpy_l _strncpy_l _mbsnbcp_l _wcsncpy_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbcpy <mbstring.h>

_mbsnbcpy_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_mbsnbcmp, _mbsnbcmp_l

_strncnt, _wcsncnt, _mbsnbcnt, _mbsnbcnt_l, _mbsnccnt, _mbsnccnt_l

_mbsnbset, _mbsnbset_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l


_mbsnbcpy_s , _mbsnbcpy_s_l
Статья • 03.04.2023

Копирует n байтов строки в конечную строку. Эти версии _mbsnbcpyимеют


_mbsnbcpy_l улучшения безопасности, как описано в разделе Функции
безопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _mbsnbcpy_s(

unsigned char * strDest,

size_t sizeInBytes,

const unsigned char * strSource,

size_t count

);

errno_t _mbsnbcpy_s_l(

unsigned char * strDest,

size_t sizeInBytes,

const unsigned char * strSource,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t _mbsnbcpy_s(

unsigned char (&strDest)[size],

const unsigned char * strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _mbsnbcpy_s_l(

unsigned char (&strDest)[size],

const unsigned char * strSource,

size_t count,

_locale_t locale

); // C++ only

Параметры
strDest

Место назначение для копирования строки символов.

sizeInBytes

Размер буфера назначения.

strSource

Копируемая строка символов.

count

Число байтов для копирования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успешного выполнения. EINVAL , если был передан недопустимый
параметр.

Комментарии
Функция _mbsnbcpy_s копирует count байт из strSource в strDest . Если count
размер превышает значение , либо входные строки являются пустым указателем,
либо sizeInBytes count равными 0, функция вызывает обработчик недопустимых
strDest параметров, как описано в разделе Проверка параметров . Если
выполнение может быть продолжено, функция возвращает EINVAL . При
перекрытии исходной и конечной строк поведение функции _mbsnbcpy_s не
определено.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

7 Примечание
В отличие от небезопасной версии этой функции, функция _mbsnbcpy_s не
выполняет заполнение значениями NULL и всегда завершает строку нуль-
символом.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsncpy_s _strncpy_s _mbsnbcpy_s _wcsncpy_s

_tcsncpy_s_l _strncpy_s_l _mbsnbcpy_s_l _wcsncpy_s_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbcpy_s <mbstring.h>

_mbsnbcpy_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_mbsnbcmp, _mbsnbcmp_l

_strncnt, _wcsncnt, _mbsnbcnt, _mbsnbcnt_l, _mbsnccnt, _mbsnccnt_l

_mbsnbicmp, _mbsnbicmp_l

_mbsnbset, _mbsnbset_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l


_mbsnbicmp , _mbsnbicmp_l
Статья • 03.04.2023

Сравнивает n байтов двух многобайтовых строк и игнорирует регистр.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _mbsnbicmp(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

count

Число сравниваемых байтов.

Возвращаемое значение
Возвращаемое значение показывает связь между подстроками.

Возвращаемое значение Описание

<0 Подстрока string1 меньше, чем подстрока string2 .

0 Подстрока string1 идентична подстроке string2 .

>0 Подстрока string1 больше, чем подстрока string2 .


При ошибке _mbsnbicmp возвращает значение _NLSCMPERROR , которое определено в
String.h и Mbstring.h.

Комментарии
Функция _mbsnbicmp выполняет порядковое сравнение не более count первых
байтов строк string1 и string2 . Сравнение выполняется путем преобразования
каждого символа в нижний регистр; _mbsnbcmp — версия _mbsnbicmp ,
учитывающая регистр. Сравнение заканчивается, если был достигнут
завершающий нуль-символ в любой из строк до того, как были сравнены count
симв. Если строки равны, когда завершающий нуль-символ достигается в любой из
строк до того, как count симв. сравнены, более короткая строка считается
меньшей.

_mbsnbicmp аналогичен _mbsnbcmp, за исключением того, что он сравнивает строки

до count байтов, а не по символам.

Две строки, содержащие символы, которые расположены между Z и a в таблице


ASCII ("[", "\", "]", "^", "_" и "`"), сравниваются по-разному в зависимости от их
регистра. Например, две строки "ABCDE" и "ABCD^" сравнивают один из способов,
если сравнение имеет нижний регистр ("abcde" > "abcd^"), а другой способ
("ABCDE" < "ABCD^"), если оно прописное.

Функция _mbsnbicmp распознает последовательности многобайтовых символов в


соответствии с текущей многобайтовой кодовой страницей. Текущий языковой
стандарт не влияет на него.

Если или string1 string2 является пустым указателем, вызывает обработчик


недопустимых параметров, _mbsnbicmp как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, функция возвращает
_NLSCMPERROR и устанавливает для параметра errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_tcsnicmp _strnicmp _mbsnbicmp _wcsnicmp

_tcsnicmp_l _strnicmp_l _mbsnbicmp_l _wcsnicmp_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbicmp <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _mbsnbcmp, _mbsnbcmp_l.

См. также раздел


Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_mbsnbcmp, _mbsnbcmp_l

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l


_mbsnbset , _mbsnbset_l
Статья • 03.04.2023

Задает для первого n байт многобайтовой строки для заданного символа.


Доступны более безопасные версии этих функций; См. раздел_mbsnbset_s ,
_mbsnbset_s_l.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

unsigned char *_mbsnbset(

unsigned char *str,

unsigned int c,

size_t count

);

unsigned char *_mbsnbset_l(

unsigned char *str,

unsigned int c,

size_t count,

_locale_t locale

);

Параметры
str

Строка, которую требуется изменить.

Однобайтовый или многобайтовый параметр.

count

Число байтов, которые нужно задать.


locale

Используемый языковой стандарт.

Возвращаемое значение
Функция _mbsnbset возвращает указатель на измененную строку.

Комментарии
Функции _mbsnbset и _mbsnbset_l устанавливают максимум первые несколько байт
( count ) str до c . Если значение count больше длины строки str , вместо
параметра count используется длина строки str . Если c является многобайтовый
символ и не может быть полностью задан в последний байт, указанный
параметром count , последний байт заполняется пустым символом. _mbsnbset и
_mbsnbset_l не помещает завершающее значение NULL в конце str .

_mbsnbset и _mbsnbset_l похож на _mbsnset , за исключением того, что он задает

count байты, а не count символы c .

Если str значение равно NULL или count равно нулю, эта функция создает
исключение недопустимого параметра, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, параметр errno
устанавливается в значение EINVAL , и функция возвращает значение NULL . Кроме
того, если c не является допустимым многобайтовый символ, errno
устанавливается значение EINVAL и вместо него используется пробел.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версия _mbsnbset этой
функции использует текущий языковой стандарт для этого поведения, зависящего
от языкового стандарта; _mbsnbset_l версия идентична, за исключением того, что
вместо нее используется переданный параметр языкового стандарта. Для
получения дополнительной информации см. Locale.

Примечание о безопасности. Эти функции представляют потенциальную угрозу,


связанную с проблемой переполнения буфера. Проблемы переполнения буфера
— это распространенный метод атак на системы, который приводит к
несанкционированному повышению уровня прав. Дополнительные сведения см . в
статье Предотвращение переполнения буфера.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsnset _strnset _mbsnbset _wcsnset

_tcsnset_l _strnset_l _mbsnbset_l _wcsnset_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbset <mbstring.h>

_mbsnbset_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_mbsnbset.c

// compile with: /W3

#include <mbstring.h>

#include <stdio.h>

int main( void )

char string[15] = "This is a test";

/* Set not more than 4 bytes of string to be *'s */

printf( "Before: %s\n", string );

_mbsnbset( string, '*', 4 ); // C4996

// Note; _mbsnbset is deprecated; consider _mbsnbset_s

printf( "After: %s\n", string );

Выходные данные
Output

Before: This is a test

After: **** is a test

См. также
Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_strnset, _strnset_l, _wcsnset, _wcsnset_l, _mbsnset, _mbsnset_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l


_mbsnbset_s , _mbsnbset_s_l
Статья • 03.04.2023

Задает для первого n байт многобайтовой строки для заданного символа. Эти
версии _mbsnbsetимеют _mbsnbset_l улучшения безопасности, как описано в
разделе Функции безопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _mbsnbset_s(

unsigned char *str,

size_t size,

unsigned int c,

size_t count

);

errno_t _mbsnbset_s_l(

unsigned char *str,

size_t size,

unsigned int c,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t _mbsnbset_s(

unsigned char (&str)[size],

unsigned int c,

size_t count

); // C++ only

template <size_t size>

errno_t _mbsnbset_s_l(

unsigned char (&str)[size],

unsigned int c,

size_t count,

_locale_t locale

); // C++ only

Параметры
str

Строка, которую требуется изменить.

size

Размер строкового буфера.

Однобайтовый или многобайтовый параметр.

count

Число байтов, которые нужно задать.

locale

Используемый языковой стандарт.

Возвращаемое значение
Ноль в случае успешного выполнения; в противном случае — код ошибки.

Комментарии
Функции _mbsnbset_s и _mbsnbset_s_l устанавливают максимум первые несколько
байт ( count ) str до c . Если значение count больше длины строки str , вместо
параметра count используется длина строки str . Если c является многобайтовый
символ и не может быть полностью задан в последний байт, указанный
параметром count , последний байт заполняется пустым символом. _mbsnbset_s и
_mbsnbset_s_l не помещайте завершающее значение NULL в конце str .

_mbsnbset_s и _mbsnbset_s_l напоминают _mbsnset за тем исключением, что задают

количество байт count , а не количество символов count для параметра c .

Если str значение равно NULL или count равно нулю, эта функция создает
исключение недопустимого параметра, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, параметр errno
устанавливается в значение EINVAL , и функция возвращает значение NULL . Кроме
того, если c не является допустимым многобайтовый символ, errno
устанавливается значение EINVAL и вместо него используется пробел.
На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.
Для получения дополнительной информации см. setlocale. Версия _mbsnbset_s этой
функции использует текущий языковой стандарт для поведения, зависящего от
языкового стандарта; версия _mbsnbset_s_l работает аналогично, но использует
переданный языковой стандарт. Для получения дополнительной информации см.
Locale.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устранена
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsnset_s _strnset_s _mbsnbset_s _wcsnset_s

_tcsnset_s_l _strnset_s _l _mbsnbset_s_l _wcsnset_s_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbset_s <mbstring.h>

_mbsnbset_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_mbsnbset_s.c

#include <mbstring.h>

#include <stdio.h>

int main( void )

char string[15] = "This is a test";

/* Set not more than 4 bytes of string to be *'s */

printf( "Before: %s\n", string );

_mbsnbset_s( string, sizeof(string), '*', 4 );

printf( "After: %s\n", string );

Выходные данные
Output

Before: This is a test

After: **** is a test

См. также
Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

_strnset, _strnset_l, _wcsnset, _wcsnset_l, _mbsnset, _mbsnset_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l


mbsrtowcs
Статья • 03.04.2023

Преобразует строку многобайтовых символов в текущем языковом стандарте в


соответствующую строку расширенных символов с возможностью перезапуска в
середине многобайтового символа. Доступна более безопасная версия этой
функции; См. раздел mbsrtowcs_s.

Синтаксис
C

size_t mbsrtowcs(

wchar_t *wcstr,

const char **mbstr,

sizeof count,

mbstate_t *mbstate

);

template <size_t size>

size_t mbsrtowcs(

wchar_t (&wcstr)[size],

const char **mbstr,

sizeof count,

mbstate_t *mbstate

); // C++ only

Параметры
wcstr

Адрес для сохранения результирующей преобразованной строки расширенных


символов.

mbstr

Косвенный указатель на расположение преобразуемой строки многобайтовых


символов.

count

Максимальное число символов (не байтов) для преобразования и сохранения в


wcstr .

mbstate

Указатель на объект состояния преобразования mbstate_t . Если это значение


является пустым указателем, используется статичный внутренний объект состояния
преобразования. Так как внутренний mbstate_t объект не является
потокобезопасной, рекомендуется всегда передавать собственный mbstate
параметр.

Возвращаемое значение
Возвращает число успешно преобразованных символов без учета завершающего
нуль-символа, если он есть. Возвращает (size_t)(-1), если произошла ошибка, и
задает значение errno EILSEQ .

Комментарии
Функция mbsrtowcs преобразует строку многобайтовых символов, на которую
косвенно указывает параметр mbstr , в расширенные символы, сохраняемые в
буфере, на который указывает параметр wcstr . При этом используется состояние
преобразования, содержащееся в mbstate . Преобразование продолжается для
каждого символа до тех пор, пока не будет обнаружен завершающий
многобайтовый символ NULL, многобайтовая последовательность, которая не
соответствует допустимому символу в текущем языковом стандарте, или пока
count не будут преобразованы символы. Если функция mbsrtowcs встречает

многобайтовый нуль-символ ("\0") до или после count симв., она преобразовывает


его в 16-разрядный завершающий нуль-символ и останавливается.

Таким образом, строка расширенных символов wcstr завершается нуль-символом


только в том случае, если функция mbsrtowcs встречает многобайтовый нуль-
символ во время преобразования. Если последовательности, на которые
указывают параметры mbstr и wcstr , перекрываются, то поведение mbsrtowcs не
определено. mbsrtowcs зависит от LC_TYPE категории текущего языкового
стандарта.

Функция mbsrtowcs отличается от mbstowcsфункции возможностью _mbstowcs_l


перезапуска. Состояние преобразования хранится в переменной mbstate для
последующих вызовов тех же или других перезапускаемых функций. При
смешанном использовании перезапускаемых и неперезапускаемых функций
результаты становятся неопределенными. Например, приложение должно
использовать mbsrlen вместо mbslen , если последующий вызов mbsrtowcs
используется вместо mbstowcs .
Если wcstr не является пустым mbstr указателем, объекту указателя, на который
указывает , назначается пустой указатель, если преобразование было остановлено
из-за достижения завершающего символа NULL. В противном случае ему
назначается адрес после последнего преобразованного многобайтового символа,
если он есть. Он позволяет последующему вызову функции перезапустить
преобразование там, где этот вызов был остановлен.

wcstr Если аргумент является пустым указателем, count аргумент игнорируется и


mbsrtowcs возвращает требуемый размер в расширенных символах для строки

назначения. Если mbstate является пустым указателем, функция использует


статичный внутренний объект состояния преобразования mbstate_t , не
являющийся потокобезопасным. Если последовательность mbstr символов не
имеет соответствующего многобайтового представления символов, возвращается
значение -1 и errno имеет значение EILSEQ .

Если mbstr является пустым указателем, вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эта функции задает для errno значение EINVAL и
возвращает -1.

В C++ эта функция имеет шаблонную перегрузку, которая вызывает более новые и
безопасные аналоги этой функции. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Исключения
Функция mbsrtowcs является многопоточной при условии, что никакие функции в
текущем потоке не вызывают setlocale , пока эта функция выполняется, а mbstate
аргумент не является пустым указателем.

Требования
Подпрограмма Обязательный заголовок

mbsrtowcs <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

mbrtowc

mbtowc, _mbtowc_l

mbstowcs, _mbstowcs_l

mbsinit
mbsrtowcs_s
Статья • 03.04.2023

Преобразуют многобайтовую строку символов в текущем языковом стандарте в


представление с расширенными символами. Версия с mbsrtowcs
усовершенствованиями безопасности, как описано в разделе Функции
безопасности в CRT.

Синтаксис
C

errno_t mbsrtowcs_s(

size_t * pReturnValue,

wchar_t * wcstr,

size_t sizeInWords,

const char ** mbstr,


size_t count,

mbstate_t * mbstate

);

template <size_t size>

errno_t mbsrtowcs_s(

size_t * pReturnValue,

wchar_t (&wcstr)[size],

const char ** mbstr,


size_t count,

mbstate_t * mbstate

); // C++ only

Параметры
pReturnValue

Количество символов для преобразования.

wcstr

Адрес буфера для результирующей преобразованной строки расширенных


символов.

sizeInWords

Размер wcstr в словах (расширенных символах).

mbstr

Косвенный указатель на расположение преобразуемой строки многобайтовых


символов.

count

Максимальное число расширенных символов для хранения в буфере wcstr без


учета завершающего значения NULL или _TRUNCATE.

mbstate

Указатель на объект состояния преобразования mbstate_t . Если это значение


является пустым указателем, используется статичный внутренний объект состояния
преобразования. Так как внутренний mbstate_t объект не является
потокобезопасной, рекомендуется всегда передавать собственный mbstate
параметр.

Возвращаемое значение
Нуль, если преобразование выполнено успешно; код ошибки при неудаче.

Условие ошибки Возвращаемое


значение и
errno

wcstr является пустым указателем и sizeInWords > 0 EINVAL

mbstr является пустым указателем EINVAL

Строка, косвенно на которую указывает параметр , mbstr содержит EILSEQ


многобайтовую последовательность, которая не является допустимой для
текущего языкового стандарта.

Буфер назначения слишком мал, чтобы вместить преобразованную строку ERANGE


(и параметр count не равен _TRUNCATE ; см. примечания ниже).

Если возникает какое-либо из этих условий, вызывается исключение


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

Комментарии
Функция mbsrtowcs_s преобразует строку многобайтовых символов, на которую
косвенно указывает параметр mbstr , в расширенные символы, сохраняемые в
буфере, на который указывает параметр wcstr . При этом используется состояние
преобразования, содержащееся в mbstate . Преобразование будет продолжаться
для каждого символа до тех пор, пока не будет выполнено одно из указанных ниже
условий.

Встретился многобайтовый символ null.

Встретился недопустимый многобайтовый символ.

Число расширенных символов, сохраненных в буфере wcstr , равно count .

Конечная строка wcstr всегда завершается null, даже при возникновении ошибки,
если wcstr только не является пустым указателем.

Если count является специальным значением _TRUNCATE, mbsrtowcs_s преобразует


столько строки, сколько поместится в целевой буфер, сохраняя при этом место для
признака конца null.

Если mbsrtowcs_s исходная строка успешно преобразуется, она помещает размер


преобразованной строки в широкие символы, а признак конца null — в
*pReturnValue , если pReturnValue не является пустым указателем. Размер

вычисляется, даже если wcstr аргумент является пустым указателем, что позволяет
определить требуемый размер буфера. Если wcstr является пустым указателем,
count параметр игнорируется.

Если wcstr не является пустым mbstr указателем, объекту указателя, на который


указывает , назначается пустой указатель, если преобразование было остановлено
из-за достижения завершающего символа NULL. В противном случае ему
назначается адрес после последнего преобразованного многобайтового символа,
если он есть. Он позволяет последующему вызову функции перезапустить
преобразование там, где этот вызов был остановлен.

Если значение mbstate является пустым указателем, используется статичный


внутренний объект состояния преобразования mbstate_t . Так как этот внутренний
статический объект не является потокобезопасной, рекомендуется передать
собственное mbstate значение.

Если mbsrtowcs_s встречается многобайтовый символ, который не является


допустимым в текущем языковом стандарте, он помещает значение -1 в
*pReturnValue , задает для буфера wcstr назначения пустую строку, задает значение
errno EILSEQ и возвращает EILSEQ .

Если последовательности, на которые указывают параметры mbstr и wcstr ,


перекрываются, то поведение mbsrtowcs_s не определено. mbsrtowcs_s зависит от
LC_TYPE категории текущего языкового стандарта.
) Важно!

Убедитесь, что строки wcstr и mbstr не перекрываются, и что параметр count


правильно отражает количество преобразуемых многобайтовых символов.

Функция mbsrtowcs_s отличается от mbstowcs_sфункции возможностью


_mbstowcs_s_l перезапуска. Состояние преобразования хранится в переменной
mbstate для последующих вызовов тех же или других перезапускаемых функций.

При смешанном использовании перезапускаемых и неперезапускаемых функций


результаты становятся неопределенными. Например, приложение должно
использовать mbsrlen вместо mbslen , если последующий вызов mbsrtowcs_s
используется вместо mbstowcs_s .

В C++ использование этой функции упрощается за счет перегрузок шаблонов;


перегрузки могут автоматически определять длину буфера (устраняя
необходимость указывать аргумент размера) и могут автоматически заменять
старые, небезопасные функции с помощью более новых безопасных аналогов.
Дополнительные сведения см. в разделе Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

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

Требования
Подпрограмма Обязательный заголовок

mbsrtowcs_s <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

mbrtowc

mbtowc, _mbtowc_l

mbstowcs_s, _mbstowcs_s_l

mbsinit
mbstowcs , _mbstowcs_l
Статья • 03.04.2023

Преобразует последовательность многобайтовых символов в соответствующую


последовательность расширенных символов. Доступны более безопасные версии
этих функций; См. разделmbstowcs_s , _mbstowcs_s_l.

Синтаксис
C

size_t mbstowcs(

wchar_t *wcstr,

const char *mbstr,

size_t count

);

size_t _mbstowcs_l(

wchar_t *wcstr,

const char *mbstr,

size_t count,

_locale_t locale

);

template <size_t size>

size_t mbstowcs(

wchar_t (&wcstr)[size],

const char *mbstr,

size_t count

); // C++ only

template <size_t size>

size_t _mbstowcs_l(

wchar_t (&wcstr)[size],

const char *mbstr,

size_t count,

_locale_t locale

); // C++ only

Параметры
wcstr

Адрес последовательности расширенных символов.

mbstr

Адрес последовательности многобайтовых символов, заканчивающейся нуль-


символом.
count

Наибольшее число многобайтовых символов для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Если функция mbstowcs успешно преобразовывает исходную строку, возвращается
число преобразованных многобайтовых символов. Если аргумент wcstr имеет
значение NULL , функция возвращает необходимый размер (в расширенных
символах) строки назначения. При mbstowcs обнаружении недопустимого
многобайтового символа возвращается значение -1. Если возвращаемое значение
равно count , строка расширенных символов не заканчивается null.

) Важно!

Убедитесь, что строки wcstr и mbstr не перекрываются, и что параметр count


правильно отражает количество преобразуемых многобайтовых символов.

Комментарии
Функция mbstowcs преобразовывает не более count многобайтовых символов,
указанных в параметре mbstr , в строку соответствующих расширенных символов,
определяемых текущим языковым стандартом. Она сохраняет результирующую
строку расширенных символов по адресу, указанному в параметре wcstr . Результат
аналогичен последовательности вызовов функции mbtowc. Если mbstowcs
обнаруживает однобайтовый пустой символ ('\0') до или при count возникновении,
он преобразует символ NULL в символ NULL с широким символом ( L'\0' ) и
останавливается. Таким образом, строка расширенных символов в параметре
wcstr заканчивается нуль-символом только в том случае, если нуль-символ

встречается во время преобразования. Если последовательности, на которые


указывают параметры wcstr и mbstr , перекрываются, то поведение не определено.

Если аргумент wcstr имеет значение NULL , функция mbstowcs возвращает


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

mbstr Если аргумент имеет значение NULL , или , если count имеет значение

> INT_MAX , вызывается обработчик недопустимых параметров, как описано в


разделе Проверка параметров. Если выполнение может быть продолжено,
параметр errno устанавливается в значение EINVAL и функция возвращает –1.

Функция mbstowcs использует текущий языковой стандарт для любых аспектов


поведения, зависящих от языкового стандарта; функция _mbstowcs_l идентична за
исключением того, что она использует переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

mbstowcs <stdlib.h>

_mbstowcs_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_mbstowcs.c

// compile with: /W3

// illustrates the behavior of the mbstowcs function

#include <stdlib.h>

#include <stdio.h>

#include <locale.h>

int main( void )

size_t size;

int nChar = 2; // number of characters to convert

int requiredSize;

unsigned char *pmbnull = NULL;

unsigned char *pmbhello = NULL;

char* localeInfo;

wchar_t *pwchello = L"\x3042\x3043"; // 2 Hiragana characters

wchar_t *pwc;

/* Enable the Japanese locale and codepage */

localeInfo = setlocale(LC_ALL, "Japanese_Japan.932");

printf("Locale information set to %s\n", localeInfo);

printf( "Convert to multibyte string:\n" );

requiredSize = wcstombs( NULL, pwchello, 0); // C4996

// Note: wcstombs is deprecated; consider using wcstombs_s

printf(" Required Size: %d\n", requiredSize);

/* Add one to leave room for the null terminator. */

pmbhello = (unsigned char *)malloc( requiredSize + 1);

if (! pmbhello)

printf("Memory allocation failure.\n");

return 1;

size = wcstombs( pmbhello, pwchello, requiredSize + 1); // C4996

// Note: wcstombs is deprecated; consider using wcstombs_s

if (size == (size_t) (-1))

printf("Couldn't convert string. Code page 932 may"

" not be available.\n");

return 1;

printf( " Number of bytes written to multibyte string: %u\n",

(unsigned int) size );

printf( " Hex values of the" );

printf( " multibyte characters: %#.2x %#.2x %#.2x %#.2x\n",

pmbhello[0], pmbhello[1], pmbhello[2], pmbhello[3] );

printf( " Codepage 932 uses 0x81 to 0x9f as lead bytes.\n\n");

printf( "Convert back to wide-character string:\n" );

/* Assume we don't know the length of the multibyte string.

Get the required size in characters, and allocate enough space. */

requiredSize = mbstowcs(NULL, pmbhello, 0); // C4996


/* Add one to leave room for the null terminator */

pwc = (wchar_t *)malloc( (requiredSize + 1) * sizeof( wchar_t ));

if (! pwc)

printf("Memory allocation failure.\n");

return 1;

size = mbstowcs( pwc, pmbhello, requiredSize + 1); // C4996

if (size == (size_t) (-1))

printf("Couldn't convert string--invalid multibyte character.\n");

printf( " Characters converted: %u\n", (unsigned int)size );

printf( " Hex value of first 2" );

printf( " wide characters: %#.4x %#.4x\n\n", pwc[0], pwc[1] );

free(pwc);

free(pmbhello);

Output

Locale information set to Japanese_Japan.932

Convert to multibyte string:

Required Size: 4

Number of bytes written to multibyte string: 4

Hex values of the multibyte characters: 0x82 0xa0 0x82 0xa1

Codepage 932 uses 0x81 to 0x9f as lead bytes.

Convert back to wide-character string:

Characters converted: 2

Hex value of first 2 wide characters: 0x3042 0x3043

См. также раздел


Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

_mbclen, mblen, _mblen_l

mbtowc, _mbtowc_l

wcstombs, _wcstombs_l

wctomb, _wctomb_l

MultiByteToWideChar
mbstowcs_s , _mbstowcs_s_l
Статья • 03.04.2023

Преобразует последовательность многобайтовых символов в соответствующую


последовательность расширенных символов. mbstowcsВерсии с улучшениями
безопасности, _mbstowcs_l описанными в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t mbstowcs_s(

size_t *pReturnValue,

wchar_t *wcstr,

size_t sizeInWords,

const char *mbstr,

size_t count

);

errno_t _mbstowcs_s_l(

size_t *pReturnValue,

wchar_t *wcstr,

size_t sizeInWords,

const char *mbstr,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t mbstowcs_s(

size_t *pReturnValue,

wchar_t (&wcstr)[size],

const char *mbstr,

size_t count

); // C++ only

template <size_t size>

errno_t _mbstowcs_s_l(

size_t *pReturnValue,

wchar_t (&wcstr)[size],

const char *mbstr,

size_t count,

_locale_t locale

); // C++ only

Параметры
pReturnValue

Количество символов для преобразования.


wcstr

Адрес буфера для результирующей преобразованной строки расширенных


символов.

sizeInWords

Размер буфера wcstr в словах.

mbstr

Адрес последовательности многобайтовых символов, заканчивающейся нуль-


символом.

count

Максимальное число расширенных символов для хранения в буфере wcstr без


учета завершающего значения NULL или _TRUNCATE.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успеха или код ошибки в случае неудачи.

Условие ошибки Возвращаемое


значение и
errno

wcstr значение NULL и sizeInWords > 0 EINVAL

mbstr имеет значение NULL . EINVAL

Буфер назначения слишком мал, чтобы вместить преобразованную ERANGE


строку (если параметр count не имеет значение _TRUNCATE ; см.
примечания ниже).

wcstr не NULL и sizeInWords == 0 EINVAL

Если возникает какое-либо из этих условий, вызывается исключение


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

Комментарии
Функция mbstowcs_s преобразует строку многобайтовых символов, на которую
указывает mbstr , в расширенные символы, сохраненные в буфере, на который
указывает wcstr . Преобразование будет продолжаться для каждого символа до тех
пор, пока не будет выполнено одно из указанных ниже условий.

Встретился многобайтовый символ null.

Встретился недопустимый многобайтовый символ.

Число расширенных символов, сохраненных в буфере wcstr , равно count .

Конечная строка всегда заканчивается null (даже если есть ошибка).

Если count является специальным значением _TRUNCATE, то mbstowcs_s


преобразует столько строки, сколько поместится в буфер назначения, сохраняя при
этом место для конца null.

Если mbstowcs_s исходная строка успешно преобразуется, она помещает размер в


расширенных символах преобразованной строки, включая признак конца NULL, в
*pReturnValue (если pReturnValue не равно NULL ). Размер вычисляется, даже если
wcstr аргумент имеет значение NULL , и предоставляет способ определения

требуемого размера буфера. Если wcstr имеет значение NULL , count параметр
игнорируется и sizeInWords должен иметь значение 0.

Если функция mbstowcs_s обнаруживает недопустимый многобайтовый символ, то


помещает в *pReturnValue значение 0, устанавливает пустую строку в качестве
целевого буфера, присваивает errno значение EILSEQ и возвращает EILSEQ .

Если последовательности, на которые указывают параметры mbstr и wcstr ,


перекрываются, то поведение mbstowcs_s не определено.

) Важно!

Убедитесь, что строки wcstr и mbstr не перекрываются, и что параметр count


правильно отражает количество преобразуемых многобайтовых символов.

Функция mbstowcs_s использует текущий языковой стандарт для любых аспектов


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

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

mbstowcs_s <stdlib.h>

_mbstowcs_s_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

Локаль

MultiByteToWideChar

Интерпретация последовательностей многобайтовых символов

_mbclen, mblen, _mblen_l

mbtowc, _mbtowc_l

wcstombs, _wcstombs_l

wctomb, _wctomb_l
mbtowc , _mbtowc_l
Статья • 03.04.2023

Преобразует многобайтовый символ в соответствующий расширенный символ.

Синтаксис
C

int mbtowc(

wchar_t *wchar,

const char *mbchar,

size_t count

);

int _mbtowc_l(

wchar_t *wchar,

const char *mbchar,

size_t count,

_locale_t locale

);

Параметры
wchar

Адрес расширенного символа (тип wchar_t ).

mbchar

Адрес последовательности байтов (многобайтовый символ).

count

Число проверяемых байтов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Если mbchar значение не NULL равно , и если mbchar указывает на допустимый
многобайтовый символ, mbtowc возвращает длину многобайтового символа в
байтах. Если mbchar имеет значение NULL или указывает на расширенный символ
NULL (L'\0'), функция возвращает значение 0. Если объект, указывающий mbchar на,
не формирует допустимый многобайтовый символ в первых count символах,
возвращается значение -1.

Комментарии
Функция mbtowc преобразует или меньше байтов count , на которые указывает
mbchar , если mbchar значение не NULL равно , в соответствующий расширенный

символ. mbtowc сохраняет результирующий расширенный символ в wchar, если


wchar не NULL является . mbtowc проверяет не более MB_CUR_MAX байтов. Функция

mbtowc использует текущий языковой стандарт для аспектов поведения,

обусловленных языковыми стандартами; функция _mbtowc_l идентична за


исключением того, что она использует переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

mbtowc <stdlib.h>

_mbtowc_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_mbtowc.c

// Illustrates the behavior of the mbtowc function

#include <stdlib.h>

#include <stdio.h>

int main( void )

int i;

char *pmbc = (char *)malloc( sizeof( char ) );

wchar_t wc = L'a';

wchar_t *pwcnull = NULL;

wchar_t *pwc = (wchar_t *)malloc( sizeof( wchar_t ) );

printf( "Convert a wide character to multibyte character:\n" );

wctomb_s( &i, pmbc, sizeof(char), wc );

printf( " Characters converted: %u\n", i );

printf( " Multibyte character: %x\n\n", *pmbc );

printf( "Convert multibyte character back to a wide "

"character:\n" );

i = mbtowc( pwc, pmbc, MB_CUR_MAX );

printf( " Bytes converted: %u\n", i );

printf( " Wide character: %x\n\n", *pwc );

printf( "Attempt to convert when target is NULL\n" );

printf( " returns the length of the multibyte character:\n" );

i = mbtowc( pwcnull, pmbc, MB_CUR_MAX );

printf( " Length of multibyte character: %u\n\n", i );

printf( "Attempt to convert a NULL pointer to a" );

printf( " wide character:\n" );

pmbc = NULL;

i = mbtowc( pwc, pmbc, MB_CUR_MAX );

printf( " Bytes converted: %u\n", i );

Output

Convert a wide character to multibyte character:

Characters converted: 1

Multibyte character: 61

Convert multibyte character back to a wide character:

Bytes converted: 1

Wide character: 61

Attempt to convert when target is NULL

returns the length of the multibyte character:

Length of multibyte character: 1

Attempt to convert a NULL pointer to a wide character:

Bytes converted: 0

См. также раздел


Преобразование данных

MultiByteToWideChar

Локаль

Интерпретация последовательностей многобайтовых символов

_mbclen, mblen, _mblen_l

wcstombs, _wcstombs_l

wctomb, _wctomb_l
memccpy
Статья • 03.04.2023

Имя memccpy функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _memccpy для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _memccpy . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_memccpy
Статья • 03.04.2023

Копирует символы из буфера.

Синтаксис
C

void *_memccpy(

void *dest,

const void *src,

int c,

size_t count

);

Параметры
dest

Указатель на назначение.

src

Указатель на источник.

Последний символ для копирования.

count

Число символов.

Возвращаемое значение
Если символ c копируется, _memccpy возвращает указатель на символ, который
dest сразу же следует за символом. Если c он не копируется, возвращается NULL .

Комментарии
Функция _memccpy копирует ноль или более символов src dest в, останавливается
при копировании символа c или при count копировании символов, в зависимости
от того, в каком случае он будет первым.
Примечание о безопасности. Убедитесь в том, что буфер назначения равен или
превосходит по размеру исходный буфер. Дополнительные сведения см. в разделе
"Предотвращение переполнения буфера".

Требования
Подпрограмма Обязательный заголовок

_memccpy <memory.h> или <string.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_memccpy.c

#include <memory.h>

#include <stdio.h>

#include <string.h>

char string1[60] = "The quick brown dog jumps over the lazy fox";

int main( void )

char buffer[61];

char *pdest;

printf( "Function: _memccpy 60 characters or to character 's'\n" );

printf( "Source: %s\n", string1 );

pdest = _memccpy( buffer, string1, 's', 60 );

*pdest = '\0';

printf( "Result: %s\n", buffer );

printf( "Length: %d characters\n", strlen( buffer ) );

Выходные данные
Output
Function: _memccpy 60 characters or to character 's'

Source: The quick brown dog jumps over the lazy fox

Result: The quick brown dog jumps


Length: 25 characters

См. также
Операции с буфером

memchr, wmemchr

memcmp, wmemcmp

memcpy, wmemcpy

memset, wmemset
memchr , wmemchr
Статья • 03.04.2023

Выполняет поиск символов в буфере.

Синтаксис
C

void *memchr(

const void *buffer,

int c,

size_t count

); // C only

void *memchr(

void *buffer,

int c,

size_t count

); // C++ only

const void *memchr(

const void *buffer,

int c,

size_t count

); // C++ only

wchar_t *wmemchr(

const wchar_t * buffer,

wchar_t c,

size_t count

); // C only

wchar_t *wmemchr(

wchar_t * buffer,

wchar_t c,

size_t count

); // C++ only

const wchar_t *wmemchr(

const wchar_t * buffer,

wchar_t c,

size_t count

); // C++ only

Параметры
buffer

Указатель на буфер.
c

Символ для поиска.

count

Число проверяемых символов.

Возвращаемое значение
В случае успешного выполнения возвращает указатель на первое расположение
символа c в buffer . В противном случае возвращается значение NULL.

Комментарии
memchr ищите wmemchr первое вхождение c в первых count символах buffer . Он
останавливается при обнаружении c или проверке первых count символов.

В языке C эти функции принимают указатель const в качестве первого аргумента. В


языке C++ доступны две перегрузки. Перегрузка, принимающая указатель на
const , возвращает указатель на const ; версия, которая принимает указатель на не-

const , возвращает указатель на не- const . Макрос _CRT_CONST_CORRECT_OVERLOADS


определяется, если доступны обе const версии этих функций и другие const
версии. Если требуется не-поведение const для обеих перегрузок C++ в C++,
определите символ _CONST_RETURN .

Требования
Подпрограмма Обязательный заголовок

memchr <memory.h> или <string.h>

wmemchr <wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_memchr.c

#include <memory.h>

#include <stdio.h>

int ch = 'r';

char str[] = "lazy";


char string[] = "The quick brown dog jumps over the lazy fox";

char fmt1[] = " 1 2 3 4 5";

char fmt2[] = "12345678901234567890123456789012345678901234567890";

int main( void )

char *pdest;

int result;

printf( "String to be searched:\n %s\n", string );

printf( " %s\n %s\n\n", fmt1, fmt2 );

printf( "Search char: %c\n", ch );

pdest = memchr( string, ch, sizeof( string ) );

result = (int)(pdest - string + 1);

if ( pdest != NULL )
printf( "Result: %c found at position %d\n", ch, result );

else

printf( "Result: %c not found\n" );

Выходные данные
Output

String to be searched:

The quick brown dog jumps over the lazy fox

1 2 3 4 5

12345678901234567890123456789012345678901234567890

Search char: r

Result: r found at position 12

См. также
Операции с буфером

_memccpy

memcmp, wmemcmp

memcpy, wmemcpy

memset, wmemset

strchr, wcschr, _mbschr, _mbschr_l


memcmp , wmemcmp
Статья • 03.04.2023

Сравнивает символы в двух буферах.

Синтаксис
C

int memcmp(

const void *buffer1,


const void *buffer2,
size_t count

);

int wmemcmp(

const wchar_t * buffer1,

const wchar_t * buffer2,

size_t count

);

Параметры
buffer1

Первый буфер.

buffer2

Второй буфер.

count

Число сравниваемых символов. (Сравнивает байты для memcmp , расширенные


символы для wmemcmp .)

Возвращаемое значение
Возвращаемое значение показывает связь между буферами.

Возвращаемое значение Связь первых count символов buf1 и buf2

<0 buffer1 меньше buffer2

0 buffer1 идентично buffer2


Возвращаемое значение Связь первых count символов buf1 и buf2

>0 buffer1 больше buffer2

Комментарии
Сравнивает первые count символов в buffer1 и buffer2 , возвращая значение,
указывающее на соотношение между ними. Знак ненулевого возвращаемого
значения соответствует знаку разности между первой отличающейся парой
значений в буферах. Значения интерпретируются как unsigned char для memcmp и
как wchar_t для wmemcmp .

Требования
Подпрограмма Обязательный заголовок

memcmp <memory.h> или <string.h>

wmemcmp <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_memcmp.c

/* This program uses memcmp to compare

* the strings named first and second. If the first

* 19 bytes of the strings are equal, the program

* considers the strings to be equal.

*/

#include <string.h>

#include <stdio.h>

int main( void )

char first[] = "12345678901234567890";

char second[] = "12345678901234567891";

int int_arr1[] = {1,2,3,4};

int int_arr2[] = {1,2,3,4};

int result;

printf( "Compare '%.19s' to '%.19s':\n", first, second );

result = memcmp( first, second, 19 );

if( result < 0 )

printf( "First is less than second.\n" );

else if( result == 0 )

printf( "First is equal to second.\n" );

else

printf( "First is greater than second.\n" );

printf( "Compare '%d,%d' to '%d,%d':\n", int_arr1[0], int_arr1[1],


int_arr2[0], int_arr2[1]);

result = memcmp( int_arr1, int_arr2, sizeof(int) * 2 );

if( result < 0 )

printf( "int_arr1 is less than int_arr2.\n" );

else if( result == 0 )

printf( "int_arr1 is equal to int_arr2.\n" );

else

printf( "int_arr1 is greater than int_arr2.\n" );

Output

Compare '1234567890123456789' to '1234567890123456789':

First is equal to second.

Compare '1,2' to '1,2':

int_arr1 is equal to int_arr2.

См. также раздел


Операции с буфером

_memccpy

memchr, wmemchr

memcpy, wmemcpy

memset, wmemset

strcmp, wcscmp, _mbscmp

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l


memcpy , wmemcpy
Статья • 03.04.2023

Копирует байты между буферами. Доступны более безопасные версии этих


функций; См. разделmemcpy_s , wmemcpy_s.

Синтаксис
C

void *memcpy(

void *dest,

const void *src,

size_t count

);

wchar_t *wmemcpy(

wchar_t *dest,

const wchar_t *src,

size_t count

);

Параметры
dest

Новый буфер.

src

Буфер, из которого происходит копирование.

count

Число копируемых символов.

Возвращаемое значение
Значение dest .

Комментарии
memcpy копирует байты count из src в dest ; wmemcpy копирует расширенные count
символы. Если исходный и целевой регионы перекрываются, поведение memcpy не
определено. Используйте memmove для обработки перекрывающихся областей.
) Важно!

Убедитесь в том, что буфер назначения равен или превосходит по размеру


исходный буфер. Дополнительные сведения см . в статье Предотвращение
переполнения буфера.

) Важно!

Так как так много переполнений буфера и, следовательно, потенциальных


эксплойтов безопасности были трассированы на неправильное использование
memcpy , эта функция входит в список "запрещенных" функций жизненного

цикла разработки безопасности (SDL). Вы можете заметить, что некоторые


библиотечные классы VC++ по-прежнему используют memcpy . Более того,
можно заметить, что оптимизирующий компилятор VC++ иногда также
вызывает функцию memcpy . Язык Visual C++ разрабатывался в соответствии с
требованиями SDL, поэтому использование этой запрещенной функции
тщательно анализировалось. В случае использования в библиотеке вызовы
были тщательно изучены на предмет того, не могут ли они вызвать
переполнение буфера. В случае с компилятором некоторые шаблоны кода
были признаны идентичными шаблону memcpy и поэтому заменены на вызов
функции. В таких случаях использование функции memcpy не менее безопасно,
чем использование исходных инструкций, поэтому вызов функции memcpy ,
оптимизированной в плане производительности, является более
предпочтительным. Так же, как использование "безопасных" функций CRT не
гарантирует безопасность (они просто усложняют работу с небезопасными),
использование "запрещенных" функций не гарантирует опасность (они просто
требуют большей проверки для обеспечения безопасности).

Так как memcpy использование компилятором и библиотеками VC++ было


тщательно изучено, эти вызовы разрешены в коде, который в противном
случае соответствует SDL. memcpy Вызовы, представленные в исходном коде
приложения, соответствуют SDL только в том случае, если это использование
было проверено экспертами по безопасности.

memcpy Функции и wmemcpy являются устаревшими, только если константа

_CRT_SECURE_DEPRECATE_MEMORY определена перед инструкцией include, как показано


в примере ниже:

C
#define _CRT_SECURE_DEPRECATE_MEMORY

#include <memory.h>

или

#define _CRT_SECURE_DEPRECATE_MEMORY

#include <wchar.h>

Требования
Подпрограмма Обязательный заголовок

memcpy <memory.h> или <string.h>

wmemcpy <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См memmove . пример использования memcpy .

См. также раздел


Операции с буфером

_memccpy

memchr, wmemchr

memcmp, wmemcmp

memmove, wmemmove

memset, wmemset

strcpy_s, wcscpy_s, _mbscpy_s

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l\


memcpy_s , wmemcpy_s
Статья • 03.04.2023

Копирует байты между буферами. Эти функции являются версиями , с


улучшениями memcpyбезопасности, wmemcpy как описано в функциях
безопасности в CRT.

Синтаксис
C

errno_t memcpy_s(

void *dest,

size_t destSize,

const void *src,

size_t count

);

errno_t wmemcpy_s(

wchar_t *dest,

size_t destSize,

const wchar_t *src,

size_t count

);

Параметры
dest

Новый буфер.

destSize

Размер целевого буфера в байтах для memcpy_s и расширенных символов ( wchar_t )


для wmemcpy_s .

src

Буфер, из которого происходит копирование.

count

Число копируемых символов.

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.
Условия ошибок

dest destSize src count Возвращаемое Содержимое


значение dest

any any any 0 0 Без изменений

NULL any any ненулевое EINVAL Без изменений


значение

any any NULL ненулевое EINVAL dest обнуляется


значение

any < count any ненулевое ERANGE dest обнуляется


значение

Комментарии
memcpy_s копирует байты count из src ; dest wmemcpy_s копирует расширенные

count символы. Если исходные и целевые регионы перекрываются, поведение

memcpy_s не определено. Используйте memmove_s для обработки перекрывающихся


областей.

Эти функции проверяют свои параметры. Если count значение не равно нулю и
src dest является пустым указателем или destSize меньше count , эти функции

вызывают обработчик недопустимых параметров, как описано в разделе


"Проверка параметров". Если выполнение разрешено продолжать, эти функции
возвращают EINVAL или ERANGE задают errno возвращаемое значение.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

memcpy_s <memory.h> или <string.h>

wmemcpy_s <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_memcpy_s.c

// Copy memory in a more secure way.

#include <memory.h>

#include <stdio.h>

int main()

int a1[10], a2[100], i;

errno_t err;

// Populate a2 with squares of integers

for (i = 0; i < 100; i++)

a2[i] = i*i;

// Tell memcpy_s to copy 10 ints (40 bytes), giving

// the size of the a1 array (also 40 bytes).

err = memcpy_s(a1, sizeof(a1), a2, 10 * sizeof (int) );

if (err)

printf("Error executing memcpy_s.\n");

else

for (i = 0; i < 10; i++)

printf("%d ", a1[i]);

printf("\n");

Output

0 1 4 9 16 25 36 49 64 81

См. также раздел


Операции с буфером

_memccpy

memchr, wmemchr

memcmp, wmemcmp

memmove, wmemmove

memset, wmemset

strcpy, wcscpy, _mbscpy

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l


memicmp
Статья • 03.04.2023

Имя memicmp функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _memicmp функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _memicmp . Вы также можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен предупреждений и
функций POSIX".
_memicmp , _memicmp_l
Статья • 03.04.2023

Сравнивает символы в двух буферах (без учета регистра).

Синтаксис
C

int _memicmp(

const void *buffer1,


const void *buffer2,
size_t count

);

int _memicmp_l(

const void *buffer1,


const void *buffer2,
size_t count,

_locale_t locale

);

Параметры
buffer1

Первый буфер.

buffer2

Второй буфер.

count

Число символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращаемое значение показывает связь между буферами.

Возвращаемое Отношения между определенным числом начальных байтов


значение буфера 1 и буфера 2
Возвращаемое Отношения между определенным числом начальных байтов
значение буфера 1 и буфера 2

<0 Значение buffer1 меньше значения buffer2 .

0 Значение buffer1 идентично значению buffer2 .

>0 Значение buffer1 больше значения buffer2 .

_NLSCMPERROR Произошла ошибка.

Комментарии
Функция _memicmp сравнивает первые символы ( count ) двух буферов buffer1 и
buffer2 по байтам. Сравнение не учитывает регистр.

Если какой-либо или buffer1 buffer2 является пустым указателем, эта функция
вызывает обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, функция возвращает
_NLSCMPERROR и устанавливает для параметра errno значение EINVAL .

Функция _memicmp использует текущий языковой стандарт для аспектов поведения,


обусловленных языковыми стандартами; функция _memicmp_l идентична за
исключением того, что она использует переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_memicmp <memory.h> или <string.h>

_memicmp_l <memory.h> или <string.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_memicmp.c

// This program uses _memicmp to compare

// the first 29 letters of the strings named first and

// second without regard to the case of the letters.

#include <memory.h>

#include <stdio.h>

#include <string.h>

int main( void )

int result;

char first[] = "Those Who Will Not Learn from History";

char second[] = "THOSE WHO WILL NOT LEARN FROM their mistakes";

// Note that the 29th character is right here ^

printf( "Compare '%.29s' to '%.29s'\n", first, second );

result = _memicmp( first, second, 29 );

if( result < 0 )

printf( "First is less than second.\n" );

else if( result == 0 )

printf( "First is equal to second.\n" );

else if( result > 0 )

printf( "First is greater than second.\n" );

Output

Compare 'Those Who Will Not Learn from' to 'THOSE WHO WILL NOT LEARN FROM'

First is equal to second.

См. также раздел


Операции с буфером

_memccpy

memchr, wmemchr

memcmp, wmemcmp

memcpy, wmemcpy

memset, wmemset

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l


memmove , wmemmove
Статья • 03.04.2023

Перемещает один буфер в другой. Доступны более безопасные версии этих


функций; см. ,memmove_swmemmove_s .

Синтаксис
C

void *memmove(

void *dest,

const void *src,

size_t count

);

wchar_t *wmemmove(

wchar_t *dest,

const wchar_t *src,

size_t count

);

Параметры
dest

Конечный объект.

src

Исходный объект.

count

Число копируемых байтов ( memmove ) или символов ( wmemmove ).

Возвращаемое значение
Значение dest .

Комментарии
Копирует count байтов ( memmove ) или символов ( wmemmove ) из src в dest . Если
некоторые части исходного и целевого регионов перекрываются, обе функции
гарантируют, что исходные байты в перекрывающейся области копируются перед
перезаписью.

Примечание о безопасности. Убедитесь в том, что буфер назначения равен или


превосходит по размеру исходный буфер. Дополнительные сведения см. в разделе
"Предотвращение переполнения буфера".

Функции memmove и wmemmove функции будут нерекомендуемыми, только если


константа _CRT_SECURE_DEPRECATE_MEMORY определена перед инструкцией включения,
чтобы функции были нерекомендуемыми, например в следующем примере:

#define _CRT_SECURE_DEPRECATE_MEMORY

#include <string.h>

или

#define _CRT_SECURE_DEPRECATE_MEMORY

#include <wchar.h>

Требования
Подпрограмма Обязательный заголовок

memmove <string.h>

wmemmove <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_memcpy.c

// Illustrate overlapping copy: memmove

// always handles it correctly; memcpy may handle

// it correctly.

//

#include <memory.h>

#include <string.h>

#include <stdio.h>

char str1[7] = "aabbcc";

int main( void )

printf( "The string: %s\n", str1 );

memcpy( str1 + 2, str1, 4 );

printf( "New string: %s\n", str1 );

strcpy_s( str1, sizeof(str1), "aabbcc" ); // reset string

printf( "The string: %s\n", str1 );

memmove( str1 + 2, str1, 4 );

printf( "New string: %s\n", str1 );

Output

The string: aabbcc

New string: aaaabb

The string: aabbcc

New string: aaaabb

См. также раздел


Операции с буфером

_memccpy

memcpy, wmemcpy

strcpy, wcscpy, _mbscpy

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l\


memmove_s , wmemmove_s
Статья • 03.04.2023

Перемещает один буфер в другой. Эти функции являются версиями , с


улучшениями memmoveбезопасности, wmemmove как описано в функциях
безопасности в CRT.

Синтаксис
C

errno_t memmove_s(

void *dest,

size_t numberOfElements,

const void *src,

size_t count

);

errno_t wmemmove_s(

wchar_t *dest,

size_t numberOfElements,

const wchar_t *src,

size_t count

);

Параметры
dest

Конечный объект.

numberOfElements

Размер буфера назначения.

src

Исходный объект.

count

Число копируемых байтов ( memmove_s ) или символов ( wmemmove_s ).

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи
Условия ошибок

dest numberOfElements src Возвращаемое значение Содержимое dest

NULL any any EINVAL не изменено

any any NULL EINVAL не изменено

any < count any ERANGE не изменено

Комментарии
Копирует count байтов символов из src в dest . Если некоторые части исходного и
целевого регионов перекрываются, memmove_s перед перезаписью копируются
исходные байты в перекрывающейся области.

Если dest или src является пустым указателем или если целевая строка слишком
мала, эти функции вызывают обработчик недопустимых параметров, как описано в
разделе "Проверка параметров ". Если продолжение выполнения разрешено, эти
функции возвращают EINVAL и устанавливают для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

memmove_s <string.h>

wmemmove_s <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_memmove_s.c

//

// The program demonstrates the

// memmove_s function which works as expected

// for moving overlapping regions.

#include <stdio.h>

#include <string.h>

int main()

char str[] = "0123456789";

printf("Before: %s\n", str);

// Move six bytes from the start of the string

// to a new position shifted by one byte. To protect against

// buffer overrun, the secure version of memmove requires the

// the length of the destination string to be specified.

memmove_s((str + 1), strnlen(str + 1, 10), str, 6);

printf_s(" After: %s\n", str);

Выходные данные
Output

Before: 0123456789

After: 0012345789

См. также
Операции с буфером

_memccpy

memcpy, wmemcpy

strcpy_s, wcscpy_s, _mbscpy_s

strcpy, wcscpy, _mbscpy

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l


memset , wmemset
Статья • 03.04.2023

Задает буфер для указанного символа.

Синтаксис
C

void *memset(

void *dest,

int c,

size_t count

);

wchar_t *wmemset(

wchar_t *dest,

wchar_t c,

size_t count

);

Параметры
dest

Указатель на место назначения.

Задаваемый символ.

count

Число символов.

Возвращаемое значение
Значение dest .

Комментарии
Задает для первых count символов dest значение символа c .

Примечание о безопасности. Убедитесь, что буфер назначения имеет достаточно


места по крайней мере для count символов. Дополнительные сведения см. в
разделе "Предотвращение переполнения буфера".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

memset <memory.h> или <string.h>

wmemset <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_memset.c

/* This program uses memset to

* set the first four chars of buffer to "*".

*/

#include <memory.h>

#include <stdio.h>

int main( void )

char buffer[] = "This is a test of the memset function";

printf( "Before: %s\n", buffer );

memset( buffer, '*', 4 );

printf( "After: %s\n", buffer );

В примере получается следующий результат.

Output
Before: This is a test of the memset function

After: **** is a test of the memset function

Ниже приведен пример использования: wmemset

// crt_wmemset.c

/* This program uses memset to

* set the first four chars of buffer to "*".

*/

#include <wchar.h>

#include <stdio.h>

int main( void )

wchar_t buffer[] = L"This is a test of the wmemset function";

wprintf( L"Before: %s\n", buffer );

wmemset( buffer, L'*', 4 );

wprintf( L"After: %s\n", buffer );

В примере получается следующий результат.

Output

Before: This is a test of the wmemset function

After: **** is a test of the wmemset function

См. также раздел


Операции с буфером

_memccpy

memchr, wmemchr

memcmp, wmemcmp

memcpy, wmemcpy

_strnset, _strnset_l, _wcsnset, _wcsnset_l, _mbsnset, _mbsnset_l


__min
Статья • 03.04.2023

Макрос препроцессора, возвращающий меньшее из двух значений.

Синтаксис
C

#define __min(a,b) (((a) < (b)) ? (a) : (b))

Параметры
a, b

Значения любого типа, с которым < работает оператор.

Возвращаемое значение
Меньший из двух аргументов.

Комментарии
Макрос __min сравнивает два значения и возвращает значение меньшего.
Аргументы могут быть любого числового типа данных со знаком или без знака.
Оба аргумента и возвращаемое значение должны принадлежать к одному типу
данных.

Возвращаемый аргумент вычисляется дважды макросом. Двойное вычисление


может привести к непредвиденным результатам, если аргумент является
выражением, которое изменяет его значение при вычислении, например *p++ .

Требования
Подпрограмма Обязательный заголовок

__min <stdlib.h>
Пример
C

// crt_minmax.c

#include <stdlib.h>

#include <stdio.h>

int main( void )

int a = 10;

int b = 21;

printf( "The larger of %d and %d is %d\n", a, b, __max( a, b ) );

printf( "The smaller of %d and %d is %d\n", a, b, __min( a, b ) );

Output

The larger of 10 and 21 is 21

The smaller of 10 and 21 is 10

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
__max
mkdir
Статья • 03.04.2023

Имя mkdir функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом _mkdir для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _mkdir . Или вы можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделах Отключение предупреждений и Имена функций POSIX.
_mkdir , _wmkdir
Статья • 03.04.2023

Создает каталог.

Синтаксис
C

int _mkdir(

const char *dirname

);

int _wmkdir(

const wchar_t *dirname

);

Параметры
dirname

Путь для нового каталога.

Возвращаемое значение
Каждая функция возвращает значение 0, если новый каталог успешно создан. При
ошибке функция возвращает значение -1 и задает errno следующее.

EEXIST Каталог не был создан, так как dirname это имя существующего файла,
каталога или устройства.

ENOENT Путь не найден.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функция _mkdir создает новый каталог с указанным dirname . Функция _mkdir
может создать только один новый каталог для одного вызова, поэтому только
последний компонент dirname может присвоить имя новому каталогу. _mkdir не
преобразует разделители пути. В Windows NT обратная косая черта ( \ ) и косая
черта ( / ) являются допустимыми разделителями пути в символьных строках в
подпрограммах времени выполнения.

_wmkdir — это версия _mkdir с расширенными символами; аргумент dirname для


_wmkdir — строка расширенных символов. Поведение _wmkdir и _mkdir идентично

в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tmkdir _mkdir _mkdir _wmkdir

Требования
Подпрограмма Обязательный заголовок

_mkdir <direct.h>

_wmkdir <direct.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_makedir.c

#include <direct.h>

#include <stdlib.h>

#include <stdio.h>

int main( void )

if( _mkdir( "\\testtmp" ) == 0 )

printf( "Directory '\\testtmp' was successfully created\n" );

system( "dir \\testtmp" );

if( _rmdir( "\\testtmp" ) == 0 )

printf( "Directory '\\testtmp' was successfully removed\n" );

else

printf( "Problem removing directory '\\testtmp'\n" );

else

printf( "Problem creating directory '\\testtmp'\n" );

Пример полученных результатов


Output

Directory '\testtmp' was successfully created

Volume in drive C has no label.

Volume Serial Number is E078-087A

Directory of C:\testtmp

02/12/2002 09:56a <DIR> .

02/12/2002 09:56a <DIR> ..

0 File(s) 0 bytes

2 Dir(s) 15,498,690,560 bytes free

Directory '\testtmp' was successfully removed

См. также раздел


Управление каталогами

_chdir, _wchdir

_rmdir, _wrmdir
_mkgmtime , _mkgmtime32 , _mkgmtime64
Статья • 03.04.2023

Преобразует время в формате UTC, представленное типом struct tm , во время в


формате UTC, представленное типом time_t .

Синтаксис
C

time_t _mkgmtime(

struct tm* timeptr

);

__time32_t _mkgmtime32(

struct tm* timeptr

);

__time64_t _mkgmtime64(

struct tm* timeptr

);

Параметры
timeptr

Указатель на время в формате UTC в виде struct tm для преобразования.

Возвращаемое значение
Значение типа __time32_t или __time64_t , представляющее количество секунд,
истекших после полуночи 1 января 1970 года, в формате UTC. Если дата выходит за
пределы диапазона (см. раздел "Примечания") или входные данные не могут быть
интерпретированы как допустимое время, возвращаемое значение равно -1.

Комментарии
Функции _mkgmtime32 и _mkgmtime64 преобразовывают время в формате UTC в тип
__time32_t или __time64_t , представляющий время в формате UTC. Для
преобразования местного времени во время в формате UTC вместо этого
используйте mktime , _mktime32 и _mktime64 .
_mkgmtime — встроенная функция, которая принимает значение _mkgmtime64 и

time_t эквивалентна __time64_t . Если необходимо, чтобы компилятор


принудительно интерпретировал time_t как старое 32-разрядное значение time_t ,
можно определить _USE_32BIT_TIME_T . Мы не рекомендуем использовать его, так
как приложение может завершиться сбоем после 18 января 2038 г., максимальный
диапазон 32-разрядной версии time_t . Она не допускается на 64-разрядных
платформах.

Структура времени, передаваемая ниже, изменяется так же, как и в _mktime


функциях: tm_wday поля tm_yday задаются для новых значений на основе значений
tm_mday и tm_year . Так как предполагается время в формате UTC, tm_isdst поле

игнорируется.

Диапазон функции _mkgmtime32 — от полуночи 1 января 1970 года, время в


формате UTC, до 23:59:59 18 января 2038 года, время в формате UTC. Диапазон
_mkgmtime64 — от полуночи 1 января 1970 года, время в формате UTC, до 23:59:59
31 декабря 3000 года, время в формате UTC. Дата вне диапазона приводит к
возврату значения -1. Диапазон _mkgmtime зависит от того, определено ли значение
_USE_32BIT_TIME_T . Если значение по умолчанию не определено, диапазон
совпадает _mkgmtime64 со значением . В противном случае диапазон ограничен 32-
разрядным диапазоном _mkgmtime32 .

localtime Используйте gmtime общий статический буфер для преобразования. Если

предоставить этот буфер _mkgmtime , его предыдущее содержимое удаляется.

Примеры
C

// crt_mkgmtime.c

#include <stdio.h>

#include <time.h>

int main()

struct tm t1, t2;

time_t now, mytime, gmtime;

char buff[30];

time( & now );

_localtime64_s( &t1, &now );

_gmtime64_s( &t2, &now );

mytime = mktime(&t1);

gmtime = _mkgmtime(&t2);

printf("Seconds since midnight, January 1, 1970\n");


printf("My time: %I64d\nGM time (UTC): %I64d\n\n", mytime, gmtime);

/* Use asctime_s to display these times. */

_localtime64_s( &t1, &mytime );

asctime_s( buff, sizeof(buff), &t1 );

printf( "Local Time: %s\n", buff );

_gmtime64_s( &t2, &gmtime );

asctime_s( buff, sizeof(buff), &t2 );

printf( "Greenwich Mean Time: %s\n", buff );

Output

Seconds since midnight, January 1, 1970

My time: 1171588492

GM time (UTC): 1171588492

Local Time: Thu Feb 15 17:14:52 2007

Greenwich Mean Time: Fri Feb 16 01:14:52 2007

В следующем примере показано, как заполнена неполной структурой _mkgmtime .


Он вычисляет значения как для дня недели, так и для года.

// crt_mkgmtime2.c

#include <stdio.h>

#include <time.h>

#include <memory.h>

int main()

struct tm t1, t2;

time_t gmtime;

char buff[30];

memset(&t1, 0, sizeof(struct tm));

memset(&t2, 0, sizeof(struct tm));

t1.tm_mon = 1;

t1.tm_isdst = 0;

t1.tm_year = 103;

t1.tm_mday = 12;

// The day of the week and year will be incorrect in the output here.

asctime_s( buff, sizeof(buff), &t1);

printf("Before calling _mkgmtime, t1 = %s t.tm_yday = %d\n",

buff, t1.tm_yday );

gmtime = _mkgmtime(&t1);

// The correct day of the week and year were determined.

asctime_s( buff, sizeof(buff), &t1);

printf("After calling _mkgmtime, t1 = %s t.tm_yday = %d\n",

buff, t1.tm_yday );

Output

Before calling _mkgmtime, t1 = Sun Feb 12 00:00:00 2003

t.tm_yday = 0

After calling _mkgmtime, t1 = Wed Feb 12 00:00:00 2003

t.tm_yday = 42

См. также раздел


Управление временем

asctime, _wasctime

asctime_s, _wasctime_s

gmtime, _gmtime32, _gmtime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime_s, _localtime32_s, _localtime64_s

mktime, _mktime32, _mktime64

time, _time32, _time64


mktemp
Статья • 03.04.2023

Имя mktemp функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _mktemp функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _mktemp функцию с расширенным


уровнем _mktemp_s безопасности. Вы также можете продолжать использовать это
имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен предупреждений и функций POSIX".
_mktemp , _wmktemp
Статья • 03.04.2023

Создает уникальное имя файла. Доступны более безопасные версии этих функций;
См. раздел_mktemp_s , _wmktemp_s.

Синтаксис
C

char *_mktemp(

char *nameTemplate

);

wchar_t *_wmktemp(

wchar_t *nameTemplate

);

template <size_t size>

char *_mktemp(

char (&nameTemplate)[size]

); // C++ only

template <size_t size>

wchar_t *_wmktemp(

wchar_t (&nameTemplate)[size]

); // C++ only

Параметры
nameTemplate

Шаблон имени файла.

Возвращаемое значение
Каждая из этих функций возвращает указатель на измененный объект
nameTemplate. Функция возвращает значение NULL , если nameTemplate имеет
неправильный формат или из заданного имениTemplate невозможно создать более
уникальные имена.

Комментарии
Функция _mktemp создает уникальное имя файла, изменяя аргумент nameTemplate .
Функция _mktemp автоматически требуемым образом обрабатывает аргументы в
виде многобайтовых строк, распознавая многобайтовые последовательности
символов в соответствии с текущей многобайтовой кодовой страницей,
используемой системой времени выполнения. _wmktemp — это версия с
расширенными символами для _mktemp ; аргумент и возвращаемое значение
_wmktemp являются строками с расширенными символами. _wmktemp и _mktemp ведут

себя одинаково, за исключением того, что _wmktemp не обрабатывает


многобайтовые строки символов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tmktemp _mktemp _mktemp _wmktemp

Аргумент nameTemplate имеет форму baseXXXXXX , где base является частью нового
имени файла, который вы указали, а X — это заполнитель для символа, указанного
в _mktemp . Каждый символ заполнителя в функции nameTemplate должен быть
обозначен символом X в верхнем регистре. Функция _mktemp сохраняет base и
заменяет первый конечный символ X на букву. _mktemp заменяет конечные
символы X пятизначным значением. Это значение является уникальным числом,
которое идентифицирует вызывающий процесс или в многопоточных программах
вызывающий поток.

Каждый успешный вызов функции _mktemp изменяет nameTemplate . В каждом


последующем вызове из того же процесса или потока с таким же аргументом
nameTemplate функция _mktemp проверяет имена файлов, совпадающих с именами,

которые были возвращены _mktemp в предыдущих вызовах. Если файл не


существует для указанного имени, функция _mktemp возвращает это имя. Если
файлы существуют для всех ранее возвращенных имен, функция _mktemp создает
новое имя, заменяя букву, которая использовалась в ранее возвращенном имени,
следующей доступной строчной буквой по порядку от "a" до "z". Например, если
base  — это

fn
а пятизначное число, предоставляемое _mktemp , — 12345, то возвращается имя:

fna12345

Если это имя используется для создания файла FNA12345 и этот файл существует, то
следующее имя, возвращаемое из того же процесса или потока с таким же
аргументом base для nameTemplate будет

fnb12345

Если FNA12345 не существует, возвращается следующее имя:

fna12345

_mktemp может создать не более 26 уникальных имен файлов для любого заданного

сочетания значений base и nameTemplate . Таким образом, FNZ12345 является


последним уникальным именем файла, которое может создать функция _mktemp
для значений base и nameTemplate , используемых в этом примере.

В случае сбоя задается значение errno . Если nameTemplate имеет недопустимый


формат (например, менее шести символов X), errno для параметра задано
значение EINVAL . Если _mktemp не удается создать уникальное имя, так как все 26
возможных имен файлов уже существуют, _mktemp присваивает nameTemplate
пустую строку и возвращает . EEXIST

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Требования
Подпрограмма Обязательный заголовок

_mktemp <io.h>

_wmktemp <io.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_mktemp.c

// compile with: /W3

/* The program uses _mktemp to create

* unique filenames. It opens each filename

* to ensure that the next name is unique.

*/

#include <io.h>

#include <string.h>

#include <stdio.h>

#include <errno.h>

char *template = "fnXXXXXX";

char *result;

char names[27][9];

int main( void )

int i;

FILE *fp;

for( i = 0; i < 27; i++ )

strcpy_s( names[i], sizeof( names[i] ), template );

/* Attempt to find a unique filename: */

result = _mktemp( names[i] ); // C4996

// Note: _mktemp is deprecated; consider using _mktemp_s instead

if( result == NULL )

printf( "Problem creating the template\n" );

if (errno == EINVAL)

printf( "Bad parameter\n");

else if (errno == EEXIST)

printf( "Out of unique filenames\n");

else

fopen_s( &fp, result, "w" );

if( fp != NULL )

printf( "Unique filename is %s\n", result );


else

printf( "Cannot open %s\n", result );

fclose( fp );

Output

Unique filename is fna03912

Unique filename is fnb03912

Unique filename is fnc03912

Unique filename is fnd03912

Unique filename is fne03912

Unique filename is fnf03912

Unique filename is fng03912

Unique filename is fnh03912

Unique filename is fni03912

Unique filename is fnj03912

Unique filename is fnk03912

Unique filename is fnl03912

Unique filename is fnm03912

Unique filename is fnn03912

Unique filename is fno03912

Unique filename is fnp03912

Unique filename is fnq03912

Unique filename is fnr03912

Unique filename is fns03912

Unique filename is fnt03912

Unique filename is fnu03912

Unique filename is fnv03912

Unique filename is fnw03912

Unique filename is fnx03912

Unique filename is fny03912

Unique filename is fnz03912

Problem creating the template.

Out of unique filenames.

См. также раздел


Обработка файлов

fopen, _wfopen

_getmbcp

_getpid

_open, _wopen

_setmbcp

_tempnam, _wtempnam, tmpnam, _wtmpnam

tmpfile
_mktemp_s , _wmktemp_s
Статья • 03.04.2023

Создает уникальное имя файла. Эти функции являются версиями , с улучшениями


_mktempбезопасности, _wmktemp как описано в функциях безопасности в CRT.

Синтаксис
C

errno_t _mktemp_s(

char *nameTemplate,

size_t sizeInChars

);

errno_t _wmktemp_s(

wchar_t *nameTemplate,

size_t sizeInChars

);

template <size_t size>

errno_t _mktemp_s(

char (&nameTemplate)[size]

); // C++ only

template <size_t size>

errno_t _wmktemp_s(

wchar_t (&nameTemplate)[size]

); // C++ only

Параметры
nameTemplate

Шаблон имени файла.

sizeInChars

Размер буфера в однобайтовых символах в _mktemp_s , в расширенных символах в


_wmktemp_s , включая знак завершения NULL.

Возвращаемое значение
Обе этих функции возвращают нулевое значение в случае успешного выполнения;
код ошибки — в случае сбоя.

Условия ошибок
nameTemplate sizeInChars Возвращаемое Новое
значение значение в
nameTemplate

NULL any EINVAL NULL

Неправильный формат (см. раздел any EINVAL пустая строка


"Примечания" для правильного формата)

any <= число EINVAL пустая строка


символов X

Если возникает какое-либо из указанных выше условий ошибки, вызывается


обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, для параметра errno
устанавливается значение EINVAL , и функция возвращает значение EINVAL .

Комментарии
Функция _mktemp_s создает уникальное имя файла, изменяя аргумент nameTemplate
таким образом, чтобы после вызова указатель nameTemplate ссылался на строку,
содержащую имя нового файла. Функция _mktemp_s автоматически требуемым
образом обрабатывает аргументы в виде многобайтовых строк, распознавая
многобайтовые последовательности символов в соответствии с текущей
многобайтовой кодовой страницей, используемой системой времени выполнения.
Функция _wmktemp_s — это версия _mktemp_s с расширенными символами; аргумент
_wmktemp_s — строка расширенных символов. _wmktemp_s и _mktemp_s ведут себя

одинаково в противном случае, за исключением того, что _wmktemp_s не


обрабатывает многобайтовые строки.

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

Аргумент nameTemplate имеет форму baseXXXXXX , где base является частью нового
имени файла, который вы указали, а X — это заполнитель для символа, указанного
в _mktemp_s . Каждый символ заполнителя в функции nameTemplate должен быть
обозначен символом X в верхнем регистре. Функция _mktemp_s сохраняет base и
заменяет первый конечный символ X на букву. _mktemp_s заменяет символы X,
которые следуют за пятизначным значением. Это значение является уникальным
числом, которое идентифицирует вызывающий процесс или в многопоточных
программах.

Каждый успешный вызов функции _mktemp_s изменяет nameTemplate . В каждом


последующем вызове из того же процесса или потока с таким же аргументом
nameTemplate функция _mktemp_s проверяет имена файлов, совпадающих с
именами, которые были возвращены _mktemp_s в предыдущих вызовах. Если файл
не существует для указанного имени, функция _mktemp_s возвращает это имя. Если
файлы существуют для всех ранее возвращенных имен, функция _mktemp_s создает
новое имя, заменяя букву, которая использовалась в ранее возвращенном имени,
следующей доступной строчной буквой по порядку от "a" до "z". Например, если
base  — это

fn

а пятизначное число, предоставляемое _mktemp_s , — 12345, то возвращается имя:

fna12345

Если это имя используется для создания файла FNA12345 и этот файл существует, то
следующее имя, возвращаемое из того же процесса или потока с таким же
аргументом base для nameTemplate будет

fnb12345

Если FNA12345 не существует, возвращается следующее имя:

fna12345
_mktemp_s может создавать не более 26 уникальных имен файлов для любого

заданного сочетания и nameTemplate значений base . Таким образом, FNZ12345


является последним уникальным именем файла, которое может создать функция
_mktemp_s для значений base и nameTemplate , используемых в этом примере.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Требования
Подпрограмма Обязательный заголовок

_mktemp_s <io.h>

_wmktemp_s <io.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_mktemp_s.cpp

/* The program uses _mktemp to create

* five unique filenames. It opens each filename

* to ensure that the next name is unique.

*/

#include <io.h>

#include <string.h>

#include <stdio.h>

char *fnTemplate = "fnXXXXXX";

char names[5][9];

int main()

int i, err, sizeInChars;

FILE *fp;

for( i = 0; i < 5; i++ )

strcpy_s( names[i], sizeof(names[i]), fnTemplate );

/* Get the size of the string and add one for the null terminator.*/

sizeInChars = strnlen(names[i], 9) + 1;

/* Attempt to find a unique filename: */

err = _mktemp_s( names[i], sizeInChars );

if( err != 0 )

printf( "Problem creating the template" );

else

if( fopen_s( &fp, names[i], "w" ) == 0 )

printf( "Unique filename is %s\n", names[i] );

else

printf( "Cannot open %s\n", names[i] );

fclose( fp );

return 0;

Пример полученных результатов


Output

Unique filename is fna03188

Unique filename is fnb03188

Unique filename is fnc03188

Unique filename is fnd03188

Unique filename is fne03188

См. также раздел


Обработка файлов

fopen, _wfopen

_getmbcp

_getpid

_open, _wopen

_setmbcp

_tempnam, _wtempnam, tmpnam, _wtmpnam

tmpfile_s
mktime , _mktime32 , _mktime64
Статья • 03.04.2023

Преобразуют локальное время в календарное значение.

Синтаксис
C

time_t mktime(

struct tm *timeptr

);

__time32_t _mktime32(

struct tm *timeptr

);

__time64_t _mktime64(

struct tm *timeptr

);

Параметры
timeptr

Указатель на структуру времени; См. раздел asctime.

Возвращаемое значение
_mktime32 возвращает указанное время календаря, закодированное как значение
типа time_t. Если timeptr ссылка на дату до полуночи, 1 января 1970 г., или если
календарное время не может быть представлено, возвращает значение -1
приведения _mktime32 к типу time_t . При использовании _mktime32 и при timeptr
ссылке на дату после 23:59:59 18 января 2038 г. в формате UTC возвращается
значение -1 приведения к типу time_t .

_mktime64 возвращает -1 приведение к типу __time64_t , если timeptr ссылается на

дату после 23:59:59, 31 декабря 3000 года в формате UTC.

Комментарии
Функции mktime , _mktime32 и _mktime64 преобразуют предоставленную структуру
времени (возможно, незавершенную), на которую указывает timeptr , в полностью
определенную структуру с нормализованными значениями, а затем преобразует ее
в значение календарного time_t времени. Преобразованное время имеет ту же
кодировку, что и значения, возвращаемые функцией time . Исходные значения
tm_wday компонентов timeptr и tm_yday структуры игнорируются, а исходные
значения других компонентов не ограничиваются их обычными диапазонами.

mktime является встроенной функцией, эквивалентной _mktime64 , если

_USE_32BIT_TIME_T не определен. В этом случае это эквивалентно _mktime32 .

После корректировки в соответствии с форматом UTC _mktime32 обрабатывает


даты с полуночи 1 января 1970 г. до 23:59:59 18 января 2038 г. _mktime64
обрабатывает даты с полуночи 1 января 1970 г. до 23:59:59 31 декабря 3000 г. Этот
аргумент может вызывать возвращение данными функциями значения -1
(приведенного к time_t , __time32_t или __time64_t ), даже если указанная дата
находится в пределах диапазона. Например, если вы находитесь в Каире, Египет,
что на два часа раньше UTC, два часа сначала вычитаются из даты, указанной в
timeptr ; вычитание может вывести дату за пределы диапазона.

Эти функции можно использовать для проверки и заполнения tm структуры. В


случае успешного выполнения функции задают значения для tm_wday и tm_yday и
настраивают другие компоненты для отображения указанного календарного
времени (однако значения принудительно задаются в их нормальных диапазонах).
Окончательное значение tm_mday не устанавливается до тех пор, пока tm_mon не
будут определены и tm_year . При указании времени структуры tm задайте для
поля tm_isdst значение:

нуль (0), чтобы указать, что действует стандартное время;

значение больше нуля, чтобы указать, что действует переход на зимнее время;

значение меньше нуля, чтобы указать, что код библиотеки времени


выполнения языка C должен вычислить, действует ли стандартное время или
переход на зимнее время.

Библиотека времени выполнения C определяет поведение летнего времени из


переменной TZ среды. Если TZ параметр не задан, вызов GetTimeZoneInformation
API Win32 используется для получения сведений о летнем времени из
операционной системы. Если вызов завершается сбоем, библиотека предполагает,
что используются правила США для реализации вычисления летнего времени.
tm_isdst — это обязательное поле. Если оно не задано, его значение является

неопределенным, а возвращаемые значения этих функций — непредсказуемыми.


Если timeptr указывает на структуру, возвращенную tm предыдущим вызовом
asctime, gmtimeили localtime (или вариантов этих функций), tm_isdst поле
содержит правильное значение.

Функции gmtime и localtime (и _gmtime32 , _gmtime64 , _localtime32 и _localtime64 )


используют один буфер для каждого потока для преобразования. Если вы
предоставляете этот буфер mktime , _mktime32 или _mktime64 , предыдущее
содержимое удаляется.

Эти функции проверяют свои параметры. Если timeptr является пустым


указателем, вызывается обработчик недопустимых параметров, как описано в
разделе Проверка параметров. Если продолжение выполнения разрешено,
функции возвращают значение -1 и задают для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

mktime <time.h>

_mktime32 <time.h>

_mktime64 <time.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_mktime.c

/* The example takes a number of days

* as input and returns the time, the current

* date, and the specified number of days.

*/

#include <time.h>

#include <stdio.h>

int main( void )

struct tm when;

__time64_t now, result;

int days;

char buff[80];

time( &now );

_localtime64_s( &when, &now );


asctime_s( buff, sizeof(buff), &when );

printf( "Current time is %s\n", buff );

days = 20;

when.tm_mday = when.tm_mday + days;

if( (result = mktime( &when )) != (time_t)-1 ) {

asctime_s( buff, sizeof(buff), &when );

printf( "In %d days the time will be %s\n", days, buff );

} else

perror( "mktime failed" );

Пример полученных результатов


Output

Current time is Fri Apr 25 13:34:07 2003

In 20 days the time will be Thu May 15 13:34:07 2003

См. также раздел


Управление временем

asctime, _wasctime

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

_mkgmtime, _mkgmtime32, _mkgmtime64

time, _time32, _time64


modf , modff , modfl
Статья • 03.04.2023

Разбивает значение с плавающей запятой на дробную и целую части.

Синтаксис
C

double modf( double x, double * intptr );

float modff( float x, float * intptr );

long double modfl( long double x, long double * intptr );

C++

float modf( float x, float * intptr ); // C++ only

long double modf( long double x, long double * intptr ); // C++ only

Параметры
x

Значение с плавающей запятой.

intptr

Указатель на сохраненное значение целой части числа.

Возвращаемое значение
Эта функция возвращает дробную часть x со знаком . Ошибка не возвращается.

Комментарии
Функции modf разбивают значение с плавающей запятой x на дробную и целую
части, каждая из которых имеет тот же знак, что и x . Возвращается дробная часть
числа x со знаком. Целочисленная часть хранится в виде значения с плавающей
запятой. intptr

Функция modf содержит реализацию, которая использует Streaming SIMD Extensions


2 (SSE2). See _set_SSE2_enable for information and restrictions on using the SSE2
implementation.

C++ допускает перегрузку, поэтому можно вызывать перегрузки modf , которые


принимают и возвращают параметры float или long double . В программе на
языке C modf всегда принимает два двойных значения и возвращает двойное
значение.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

modf , modff , modfl C: <math.h>

C++: <cmath> или <math.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_modf.c

#include <math.h>

#include <stdio.h>

int main( void )

double x, y, n;

x = -14.87654321; /* Divide x into its fractional */

y = modf( x, &n ); /* and integer parts */

printf( "For %f, the fraction is %f and the integer is %.f\n",

x, y, n );

Output

For -14.876543, the fraction is -0.876543 and the integer is -14

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
frexp

ldexp
_msize
Статья • 03.04.2023

Возвращает размер блока памяти, выделенного в куче.

Синтаксис
C

size_t _msize(

void *memblock

);

Параметры
memblock

Указатель на блок памяти.

Возвращаемое значение
Функция _msize возвращает размер (в байтах) как целое число без знака.

Комментарии
Функция _msize возвращает размер блока памяти (в байтах), выделенного вызовом
функции calloc , malloc или realloc .

Если приложение связано с отладочной версией библиотек времени выполнения


C, _msize разрешается в _msize_dbg. Дополнительные сведения об управлении
кучей в процессе отладки см. в разделе Куча отладки CRT.

Эта функция проверяет свои параметры. Если memblock является указателем NULL ,
_msize вызывает обработчик недопустимого параметра, как описано в разделе

Проверка параметров. Если ошибка обработана, функция задает для параметра


errno значение EINVAL и возвращает -1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма Обязательный заголовок

_msize <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
См. пример для realloc.

См. также раздел


Выделение памяти

calloc

_expand

malloc

realloc
_msize_dbg
Статья • 03.04.2023

Вычисляет размер блока памяти в куче (только в отладочной версии).

Синтаксис
C

size_t _msize_dbg(

void *userData,

int blockType

);

Параметры
userData

Указатель на блок памяти, размер которого необходимо определить.

blockType

Тип указанного блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

Возвращаемое значение
При успешном завершении _msize_dbg возвращает размер (в байтах) указанного
блока памяти; в противном случае возвращается NULL .

Комментарии
_msize_dbg — отладочная версия функции _msize . Если _DEBUG параметр не
определен, каждый вызов _msize_dbg сводится к вызову _msize . Обе функции
_msize и _msize_dbg вычисляют размер блока памяти в основной куче, однако
_msize_dbg добавляет две функции отладки: одна функция включает в

возвращаемый размер буферы по обеим сторонам пользовательской части блока


памяти, вторая позволяет рассчитать размер определенных типов блоков.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и отладочными версиями см. в разделе Отладка версий функций выделения
кучи.

Эта функция проверяет свои параметры. Если memblock является пустым


указателем, _msize_dbg вызывает обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если ошибка обработана, функция задает
для параметра errno значение EINVAL и возвращает -1.

Требования
Подпрограмма Обязательный заголовок

_msize_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
C

// crt_msize_dbg.c

// compile with: /MTd

/*

* This program allocates a block of memory using _malloc_dbg

* and then calls _msize_dbg to display the size of that block.

* Next, it uses _realloc_dbg to expand the amount of

* memory used by the buffer and then calls _msize_dbg again to

* display the new amount of memory allocated to the buffer.

*/

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <crtdbg.h>

int main( void )

long *buffer, *newbuffer;


size_t size;

/*

* Call _malloc_dbg to include the filename and line number

* of our allocation request in the header

*/

buffer = (long *)_malloc_dbg( 40 * sizeof(long), _NORMAL_BLOCK,


__FILE__, __LINE__ );

if( buffer == NULL )

exit( 1 );

/*

* Get the size of the buffer by calling _msize_dbg

*/

size = _msize_dbg( buffer, _NORMAL_BLOCK );

printf( "Size of block after _malloc_dbg of 40 longs: %u\n", size );

/*

* Reallocate the buffer using _realloc_dbg and show the new size

*/

newbuffer = _realloc_dbg( buffer, size + (40 * sizeof(long)),


_NORMAL_BLOCK, __FILE__, __LINE__ );

if( newbuffer == NULL )

exit( 1 );

buffer = newbuffer;

size = _msize_dbg( buffer, _NORMAL_BLOCK );

printf( "Size of block after _realloc_dbg of 40 more longs: %u\n",


size );

free( buffer );

exit( 0 );

Выходные данные
Output

Size of block after _malloc_dbg of 40 longs: 160

Size of block after _realloc_dbg of 40 more longs: 320

См. также
Подпрограммы отладки

_malloc_dbg
nan , nanf , nanl
Статья • 03.04.2023

Возвращает несигнальное значение NaN (QNaN).

Синтаксис
C

double nan( const char* input );

float nanf( const char* input );

long double nanl( const char* input );

Параметры
input

Строковое значение.

Возвращаемое значение
Функции nan возвращают несигнальное значение NaN (QNaN).

Комментарии
Функции nan возвращают значение с плавающей запятой, которое соответствует
несигнальному значению NaN (QNaN). Значение параметра input игнорируется.
Сведения о том, как naN представлено для выходных данных, см. в разделе printf, ,
_printf_lwprintf. _wprintf_l

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Заголовок C Заголовок C++

nan , nanf , nanl <math.h> <cmath> или <math.h>


См. также раздел
Поддержка математических функций для чисел с плавающей запятой
fpclassify

_fpclass, _fpclassf

isfinite, _finite, _finitef

isinf

isnan, _isnan, _isnanf

isnormal
nearbyint , nearbyintf , nearbyintl
Статья • 03.04.2023

Округляет заданное значение с плавающей запятой до целого числа и возвращает


это значение в формате с плавающей запятой.

Синтаксис
C

double nearbyint( double x );

float nearbyintf( float x );

long double nearbyintl( long double x );

#define nearbyint( X ) // Requires C11 or higher

float nearbyint( float x ); //C++ only

long double nearbyint( long double x ); //C++ only

Параметры
x

Округляемое значение.

Возвращаемое значение
В случае успешного выполнения возвращает x , округленное до ближайшего
целого числа, используя текущий формат округления, как сообщает .fegetround В
противном случае функция может вернуть одно из следующих значений:

Проблема Возвращает

x = ±INFINITY ±INFINITY, неизмененные

x = ±0 ±0, без изменений

x = не число не число

Сообщения об ошибках не передаются через _matherr; в частности, эта функция не


сообщает об FE_INEXACT исключениях.

Комментарии
Основное различие между этой функцией и rint заключается в том, что эта функция
не создает исключение неточной с плавающей запятой.

Так как максимальные значения с плавающей запятой являются точными целыми


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

C++ допускает перегрузку, поэтому можно вызывать перегрузки nearbyint ,


которые принимают и возвращают параметры float или long double . В программе
на языке C, если вы не используете <макрос tgmath.h> для вызова этой функции,
nearbyint всегда принимает два значения double и возвращает двойное значение.

Если вы используете <макрос tgmath.h> nearbyint() , тип аргумента определяет,


какая версия функции выбрана. Дополнительные сведения см. в статье
Обобщенная математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

nearbyint , nearbyintf , nearbyintl <math.h> <cmath> или <math.h>

nearbyint Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

Поддержка математических функций для чисел с плавающей запятой


nextafter , nextafterf , nextafterl ,
_nextafter , _nextafterf , nexttoward ,
nexttowardf , nexttowardl
Статья • 03.04.2023

Возвращает следующее представимое значение с плавающей запятой.

Синтаксис
C

double nextafter( double x, double y );

float nextafterf( float x, float y );

long double nextafterl( long double x, long double y );

double _nextafter( double x, double y );

float _nextafterf( float x, float y ); /* x64 only */

#define nextafter(X, Y) // Requires C11 or higher

double nexttoward( double x, long double y );

float nexttowardf( float x, long double y );

long double nexttowardl( long double x, long double y );

#define nexttoward(X, Y) // Requires C11 or higher

float nextafter( float x, float y ); /* C++ only, requires <cmath> */

long double nextafter( long double x, long double y ); /* C++ only, requires
<cmath> */

float nexttoward( float x, long double y ); /* C++ only, requires <cmath> */

long double nexttoward( long double x, long double y ); /* C++ only,


requires <cmath> */

Параметры
x

Начальное значение с плавающей запятой.

Следующее значение с плавающей запятой.


Возвращаемое значение
Возвращает следующее представимое значение с плавающей запятой
возвращаемого типа, следующее за значением x в направлении значения y . Если
x и y равны, функция возвращает y , преобразованный в тип возвращаемого
значения без исключения. Если x значение не равно y , а результат является
денормальным или нулевым, FE_UNDERFLOW задаются состояния исключения и
FE_INEXACT с плавающей запятой и возвращается правильный результат. Если

параметр x или y имеет значение NAN, то возвращаемое значение является


одним из входных значений NaN. Если x имеет конечное значение и результат
является бесконечным или не представляется в типе, возвращается правильно
подписанная бесконечность или NAN, FE_OVERFLOW задаются состояния исключения
с FE_INEXACT плавающей запятой и , а errno для устанавливается значение ERANGE .

Комментарии
Семейства функций nextafter и nexttoward эквивалентны за исключением типа
параметра y . Если значения x и y равны, возвращается значение y ,
преобразованное в возвращаемый тип.

Так как C++ допускает перегрузку, при включении <cmath> можно вызывать
перегрузки nextafter и nexttoward , возвращающие float и long double типы. В
программе C, если вы не используете <tgmath.h> макрос для вызова этой функции
и nextafter nexttoward всегда возвращаете double .

Если вы используете nextafter макрос или nexttoward из <tgmath.h> , тип аргумента


определяет, какая версия функции выбрана. Дополнительные сведения см. в статье
Обобщенная математика типов.

Функции _nextafter и _nextafterf относятся к корпорации Майкрософт. Функция


_nextafterf доступна только при компиляции для x64.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный Обязательный
заголовок (C) заголовок (C++)
Подпрограмма Обязательный Обязательный
заголовок (C) заголовок (C++)

nextafter , nextafterf , nextafterl , _nextafterf , <math.h> <math.h> или


nexttoward , nexttowardf , nexttowardl <cmath>

_nextafter <float.h> <float.h> или


<cfloat>

nextafter макрос, nexttoward макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
isnan, _isnan, _isnanf
norm , normf , norml
Статья • 03.04.2023

Возвращает абсолютное значение комплексного числа в квадрате.

Синтаксис
C

double norm( _Dcomplex z );

float normf( _Fcomplex z );

long double norml( _Lcomplex z );

C++

float norm( _Fcomplex z ); // C++ only

long double norm( _Lcomplex z ); // C++ only

Параметры
z

Комплексное число.

Возвращаемое значение
Абсолютное значение z в квадрате.

Комментарии
Так как C++ допускает перегрузку, можно вызывать перегрузки norm , которые
принимают значения _Fcomplex или _Lcomplex и возвращают значения float или
long double . В программе на языке C norm всегда принимает значение _Dcomplex и
возвращает значение double .

Требования
Подпрограмма Заголовок C Заголовок C++
Подпрограмма Заголовок C Заголовок C++

norm , normf , norml <complex.h> <complex.h>

_Fcomplex _Dcomplex Типы и _Lcomplex типы, относящиеся к Корпорации


Майкрософт, эквиваленты неисправных собственных типов C99 с плавающей
запятой _Complex, двойные _Complex и длинные двойные _Complex
соответственно. Дополнительные сведения о совместимости см. в разделе
Compatibility.

См. также раздел


Алфавитный указатель функций

creal, crealf, creall

cproj, cprojf, cprojl

conj, conjf, conjl

cimag, cimagf, cimagl

carg, cargf, cargl

cabs, cabsf, cabsl


not
Статья • 03.04.2023

Альтернатива оператору ! .

Синтаксис
C

#define not !

Remarks
Макрос возвращает оператор ! .

Пример
C++

// iso646_not.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 0;

if (!a)

cout << "a is zero" << endl;

if (not(a))

cout << "a is zero" << endl;

Output

a is zero

a is zero

Требования
Заголовка:< iso646.h>
not_eq
Статья • 03.04.2023

Альтернатива оператору != .

Синтаксис
C

#define not_eq !=

Remarks
Макрос возвращает оператор != .

Пример
C++

// iso646_not_eq.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 0, b = 1;

if (a != b)

cout << "a is not equal to b" << endl;

if (a not_eq b)

cout << "a is not equal to b" << endl;

Output

a is not equal to b

a is not equal to b

Требования
Заголовка:< iso646.h>
Макрос offsetof
Статья • 03.04.2023

Возвращает смещение члена относительно начала его родительской структуры.

Синтаксис
C

size_t offsetof(

structName,

memberName

);

Параметры
structName

Имя родительской структуры данных.

memberName

Имя члена в родительской структуре данных, для которого определяется


смещение.

Возвращаемое значение
offsetof возвращает смещение в байтах указанного члена относительно начала

его родительской структуры данных. Он не определен для битового поля.

Комментарии
Макрос offsetof возвращает смещение в байтах memberName от начала структуры,
заданной параметром structName , как значение типа size_t . С помощью
ключевого слова struct можно указывать типы.

7 Примечание

Макрос offsetof не является функцией и не может быть описан с помощью


прототипа C.
Требования
Подпрограмма Обязательный заголовок

offsetof <stddef.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Выделение памяти
_onexit , _onexit_m
Статья • 03.04.2023

Регистрирует подпрограмму, вызываемую во время выхода.

Синтаксис
C

_onexit_t _onexit(

_onexit_t function

);

_onexit_t_m _onexit_m(

_onexit_t_m function

);

Параметры
function

Указатель на функцию, которая должна вызываться при выходе.

Возвращаемое значение
_onexit возвращает указатель на функцию в случае успешного выполнения или
NULL если нет места для хранения указателя функции.

Комментарии
Функции _onexit передается адрес функции ( function ), которую требуется
вызывать при завершении программы в обычном режиме. Последовательные
вызовы функции _onexit создают регистр функций, которые выполняются в
порядке LIFO (последним поступил — первым обслужен). Передаваемые функции
_onexit не могут принимать параметры.

В случае, когда _onexit вызывается из библиотеки DLL, подпрограммы,


зарегистрированные при _onexit выгрузке библиотеки DLL, после DllMain вызова
с DLL_PROCESS_DETACH помощью .
_onexit является расширением Майкрософт. Для переносимости ANSI используйте

atexit. Версия _onexit_m этой функции предназначена для использования


смешанного режима.

Требования
Подпрограмма Обязательный заголовок

_onexit <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_onexit.c

#include <stdlib.h>

#include <stdio.h>

/* Prototypes */

int fn1(void), fn2(void), fn3(void), fn4 (void);

int main( void )

_onexit( fn1 );

_onexit( fn2 );

_onexit( fn3 );

_onexit( fn4 );

printf( "This is executed first.\n" );

int fn1()

printf( "next.\n" );

return 0;

int fn2()

printf( "executed " );

return 0;

int fn3()

printf( "is " );

return 0;

int fn4()

printf( "This " );

return 0;

Выходные данные
Output

This is executed first.

This is executed next.

См. также
Управление процессами и средой

atexit

exit, _Exit, _exit

__dllonexit
open
Статья • 03.04.2023

Имя open функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _open для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _open . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_open , _wopen
Статья • 03.04.2023

Открывает файл. Эти функции являются устаревшими, так как доступны более
безопасные версии; see _sopen_s, _wsopen_s.

Синтаксис
C

int _open(

const char *filename,

int oflag [,

int pmode]

);

int _wopen(

const wchar_t *filename,

int oflag [,

int pmode]

);

Параметры
filename

Имя файла.

oflag

Разрешенные типы операций.

pmode

Режим разрешений.

Возвращаемое значение
Каждая из этих функций возвращает дескриптор файла для открытого файла.
Возвращаемое значение -1 указывает на ошибку; в этом случае для errno задается
одно из следующих значений.

Значение Условие
errno
Значение Условие
errno

EACCES Попытка открыть файл только для чтения для записи, режим общего доступа к
файлу не разрешает указанные операции, или заданный путь является
каталогом.

EEXIST Указаны флаги _O_CREAT и _O_EXCL , однако filename уже существует.

EINVAL Недопустимый аргумент oflag или pmode .

EMFILE Больше нет доступных дескрипторов файлов (открыто слишком много файлов).

ENOENT Файл или путь не найден.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Функция _open открывает файл, указанный параметром filename , и готовит его к
чтению или записи, как задано параметром oflag . _wopen — это версия _open с
расширенными символами; аргумент filename для _wopen — строка расширенных
символов. Поведение _wopen и _open идентично в противном случае.

Сопоставления подпрограмм универсального текста

<tchar.h> _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_topen _open _open _wopen

oflag — это целочисленное выражение, сформированное из одной или

нескольких из следующих констант манифеста или констант, определенных в


<fcntl.h> .

константа Поведение
oflag ;

_O_APPEND Перемещает указатель файла в конец файла перед каждой операцией


записи.

_O_BINARY Открывает файл в двоичном режиме (без преобразования). (См fopen .


описание двоичного режима.)
константа Поведение
oflag ;

_O_CREAT Создает файл и открывает его для записи. Не действует, если существует
файл, указанный параметром filename . Аргумент pmode обязателен, если
указан флаг _O_CREAT .

_O_CREAT | Создает файл как временный и, если это возможно, не сбрасывает на диск.
_O_SHORT_LIVED Аргумент pmode обязателен, если указан флаг _O_CREAT .

_O_CREAT | Создает файл в качестве временного файла; файл удаляется при закрытии
_O_TEMPORARY последнего дескриптора файла. Аргумент pmode обязателен, если указан
флаг _O_CREAT . Чтобы сохранить устаревшее поведение для совместимости
приложений, другие процессы не препятствуют удалению этого файла.

_O_CREAT | Возвращает значение ошибки, если файл, указанный параметром filename ,


_O_EXCL существует. Применяется только при использовании с _O_CREAT .

_O_NOINHERIT Предотвращает создание общего дескриптора файла.

_O_RANDOM Указывает, что кэширование оптимизировано для случайного доступа с


диска, но не ограничивается им.

_O_RDONLY Открывает файл только для чтения. Не удается указать с _O_RDWR помощью
или _O_WRONLY .

_O_RDWR Открывает файл для чтения и записи. Не удается указать с _O_RDONLY


помощью или _O_WRONLY .

_O_SEQUENTIAL Указывает, что кэширование оптимизировано для последовательного


доступа с диска, но не ограничивается им.

_O_TEXT Открывает файл в текстовом режиме (с преобразованием).


(Дополнительные сведения см. в разделе "Текстовый и двоичный режим
ввода-вывода" иfopen.)

_O_TRUNC Открывает файл и обрезает его до нулевой длины; необходимо разрешение


на запись в файл. Не удается указать с помощью _O_RDONLY . _O_TRUNC при
использовании с _O_CREAT открывает существующий файл или создает
новый. Примечание: Флаг _O_TRUNC уничтожает содержимое указанного
файла.

_O_WRONLY Открывает файл только для записи. Не удается указать с _O_RDONLY


помощью или _O_RDWR .

_O_U16TEXT Открывает файл в режиме Юникода UTF-16.

_O_U8TEXT Открывает файл в режиме Юникода UTF-8.

_O_WTEXT Открывает файл в режиме Юникода.


Чтобы указать режим доступа к файлу, необходимо задать _O_RDONLY , _O_RDWR или
_O_WRONLY . Значение по умолчанию для режима доступа отсутствует.

Если для открытия файла для чтения используется флаг _O_WTEXT , _open считывает
начало файла и проверяет наличие метки порядка байтов (BOM). Если существует
BOM, файл обрабатывается как UTF-8 или UTF-16LE в зависимости от BOM. Если
метка порядка байтов есть, файл обрабатывается как ANSI. Если файл открыт для
записи с помощью флага _O_WTEXT , используется кодировка UTF-16. Независимо от
любых предыдущих параметров или метки порядка байтов, если используется флаг
_O_U8TEXT , файл всегда открывается в кодировке UTF-8; если используется флаг
_O_U16TEXT , файл всегда открывается в кодировке UTF-16.

Если файл открывается в режиме Юникода с помощью флагов _O_WTEXT , _O_U8TEXT


или _O_U16TEXT , функции ввода преобразуют данные, считываемые из файла в
данные UTF-16, хранимые с типом wchar_t . Затем функции, которые выполняют
запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие
данные UTF-16, хранимые с типом wchar_t . Если файл закодирован как UTF-8,
данные UTF-16 превратятся в UTF-8 при записи. Содержимое в кодировке UTF-8
преобразуется в UTF-16 при чтении. Попытка чтения или записи нечетного числа
байт в режиме Юникода приводит к возникновению ошибки проверки параметра.
Для чтения или записи данных, хранимых в программе в кодировке UTF-8,
используйте режим текстового или двоичного файла вместо режима Юникода. Вы
несете ответственность за любой требуемый перевод кодировки.

Если _open вызывается с флагами _O_WRONLY | _O_APPEND (режим добавления) и


_O_WTEXT , _O_U16TEXT или _O_U8TEXT , сначала выполняется попытка открыть файл

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

Если несколько констант манифеста используются для формирования аргумента


oflag , константы объединяются с помощью битового оператора ИЛИ ( | ).
Обсуждение двоичных и текстовых режимов см. в разделе "Текстовый и двоичный
режим ввода-вывода файлов".

Аргумент pmode обязателен, только если указан флаг _O_CREAT . Если файл уже
существует, pmode игнорируется. В противном случае аргумент pmode задает
параметры разрешений файла, которые настраиваются при первом закрытии
нового файла. _open применяет текущую маску разрешений файла к pmode до
настройки разрешений. (Дополнительные сведения см. в разделе _umask.) pmode
представляет собой целочисленное выражение, содержащее одну или обе
следующие константы манифеста, определенные в <sys\stat.h> .

pmode Значение

_S_IREAD Разрешено только чтение.

_S_IWRITE Разрешена запись. (Если действует, разрешает чтение и запись.)

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

При указании обеих констант они объединяются с побитовой оператором OR ( | ).


В Windows все файлы доступны для чтения; Разрешение только для записи
недоступно. Поэтому режимы _S_IWRITE и _S_IREAD | _S_IWRITE эквивалентны.

Если значение, отличное от определенного сочетания _S_IREAD и _S_IWRITE


указанного для pmode (даже если оно указывает допустимое pmode в другой
операционной системе) или если указано любое значение, отличное от
допустимых oflag значений, функция создает утверждение в режиме отладки и
вызывает обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, функция возвращает -1 и
устанавливает errno в значение EINVAL .

Требования
Компонент Обязательный заголовок Необязательный заголовок

_open <io.h> <fcntl.h> , <sys\types.h> , <sys\stat.h>

_wopen <io.h> или <wchar.h> <fcntl.h> , <sys\types.h> , <sys\stat.h>

_open и _wopen являются расширениями Майкрософт. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C
// crt_open.c

// compile with: /W3

/* This program uses _open to open a file

* named CRT_OPEN.C for input and a file named CRT_OPEN.OUT

* for output. The files are then closed.

*/

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

int main( void )

int fh1, fh2;

fh1 = _open( "CRT_OPEN.C", _O_RDONLY ); // C4996

// Note: _open is deprecated; consider using _sopen_s instead

if( fh1 == -1 )

perror( "Open failed on input file" );

else

printf( "Open succeeded on input file\n" );

_close( fh1 );

fh2 = _open( "CRT_OPEN.OUT",

_O_WRONLY | _O_CREAT,

_S_IREAD | _S_IWRITE ); // C4996

if( fh2 == -1 )

perror( "Open failed on output file" );

else

printf( "Open succeeded on output file\n" );

_close( fh2 );

Выходные данные
Output

Open succeeded on input file

Open succeeded on output file

См. также
Низкоуровневый ввод-вывод

_chmod, _wchmod

_close

_creat, _wcreat

_dup, _dup2

fopen, _wfopen

_sopen, _wsopen
_open_osfhandle
Статья • 03.04.2023

Связывает дескриптор файла времени выполнения C с существующим


дескриптором файла операционной системы.

Синтаксис
C++

int _open_osfhandle (

intptr_t osfhandle,

int flags

);

Параметры
osfhandle

Дескриптор файла операционной системы.

flags

Разрешенные типы операций.

Возвращаемое значение
В случае успешного выполнения функция _open_osfhandle возвращает дескриптор
файла времени выполнения C. Иначе возвращается значение -1.

Комментарии
Функция _open_osfhandle выделяет дескриптор файла времени выполнения C. Он
связывает дескриптор файла с дескриптором операционной системы, указанным в
параметре osfhandle . Чтобы избежать предупреждения компилятора, приведите
osfhandle аргумент из HANDLE intptr_t . Аргумент flags представляет собой
целочисленное выражение, сформированное из одной или нескольких констант
манифеста, определенных в <fcntl.h> . Оператор bitwise or ( | ) можно
использовать для объединения двух или более констант манифеста для
формирования аргумента flags .
Эти константы манифеста определены в <fcntl.h> следующих значениях:

Константа Описание

_O_APPEND Помещает указатель файла в конец файла перед каждой операцией записи.

_O_RDONLY Открывает файл только для чтения.

_O_TEXT Открывает файл в текстовом режиме (с преобразованием).

_O_WTEXT Открывает файл в режиме Юникода (с преобразованием UTF-16).

Вызов _open_osfhandle передает права владения дескриптором файла Win32


дескриптору файла. Чтобы закрыть файл, открытый с помощью ,
_open_osfhandle вызовите _close. Базовый дескриптор файла ОС также закрывается
вызовом _close . Не вызывайте функцию CloseHandle Win32 в исходном
дескрипторе. Если дескриптор файла принадлежит потоку FILE * , вызов fclose
закрытия дескриптора файла и базового дескриптора. В этом случае не вызывайте
_close дескриптор файла или CloseHandle исходный дескриптор.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_open_osfhandle <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Обработка файлов

_get_osfhandle
or_eq
Статья • 03.04.2023

Альтернатива оператору |= .

Синтаксис
C

#define or_eq |=

Remarks
Макрос возвращает оператор |= .

Пример
C++

// iso646_oreq.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 3, b = 2, result;

result= a |= b;

cout << result << endl;

result= a or_eq b;

cout << result << endl;

Output

Требования
Заголовка:< iso646.h>
or
Статья • 03.04.2023

Альтернатива оператору || .

Синтаксис
C

#define or ||

Remarks
Макрос возвращает оператор || .

Пример
C++

// iso646_or.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

bool a = true, b = false, result;

boolalpha(cout);

result= a || b;

cout << result << endl;

result= a or b;

cout << result << endl;

Output

true

true

Требования
Заголовка:< iso646.h>
_pclose
Статья • 03.04.2023

Ожидает новый обработчик команд и закрывает поток по связанному каналу.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _pclose(

FILE *stream

);

Параметры
stream

Возвращаемое значение из предыдущего вызова функции _popen .

Возвращаемое значение
Возвращает состояние выхода завершающего обработчика команд или -1 при
возникновении ошибки. Формат возвращаемого значения совпадает _cwait с
форматом, за исключением байтов низкого и высокого порядка. Если поток имеет
значение NULL , _pclose задает EINVAL errno значение -1 и возвращает значение -1.

Сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Функция _pclose ищет идентификатор процесса обработчика команд (Cmd.exe),
запущенного связанным вызовом, выполняет _cwait вызов нового обработчика
команд и закрывает поток в связанном _popen канале.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_pclose <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Управление процессами и средой

_pipe

_popen, _wpopen
perror , _wperror
Статья • 03.04.2023

Выводит сообщение об ошибке.

Синтаксис
C

void perror(

const char *message

);

void _wperror(

const wchar_t *message

);

Параметры
message

Строковое сообщение для вывода.

Комментарии
Функция perror выводит сообщение об ошибке в stderr . _wperror — это версия
_perror с расширенными символами; аргумент message для _wperror — строка

расширенных символов. Поведение _wperror и _perror идентично в противном


случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tperror perror perror _wperror


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

Номер ошибки хранится в переменной errno (определенной в ERRNO. H). Доступ к


системным сообщениям об ошибках осуществляется через переменную _sys_errlist,
которая представляет собой массив сообщений, упорядоченных по номеру
ошибки. Функция perror выводит соответствующее сообщение об ошибке,
используя значение errno в качестве индекса для _sys_errlist . Значение
переменной _sys_nerr определяется как максимальное число элементов в массиве
_sys_errlist .

Для получения точных результатов вызовите perror сразу после того, как
подпрограмма библиотеки возвращает ошибку. В противном случае последующие
вызовы могут перезаписать значение errno .

В операционной системе Windows некоторые значения errno , указанные в файле


ERRNO.H, не используются. Эти значения зарезервированы для использования
операционной системой UNIX. Список значений, используемых errno
операционной системой Windows, смerrno. в разделе , _doserrno_sys_errlist, и
_sys_nerr . Функция perror выводит пустую строку для любого значения errno ,
которое не используется для этих платформ.

Требования
Подпрограмма Обязательный заголовок

perror <stdio.h> или <stdlib.h>

_wperror <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_perror.c

// compile with: /W3

/* This program attempts to open a file named

* NOSUCHF.ILE. Because this file probably doesn't exist,

* an error message is displayed. The same message is

* created using perror, strerror, and _strerror.

*/

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <share.h>

int main( void )

int fh;

if( _sopen_s( &fh, "NOSUCHF.ILE", _O_RDONLY, _SH_DENYNO, 0 ) != 0 )

/* Three ways to create error message: */

perror( "perror says open failed" );

printf( "strerror says open failed: %s\n",

strerror( errno ) ); // C4996

printf( _strerror( "_strerror says open failed" ) ); // C4996

// Note: strerror and _strerror are deprecated; consider

// using strerror_s and _strerror_s instead.

else

printf( "open succeeded on input file\n" );

_close( fh );

Output

perror says open failed: No such file or directory

strerror says open failed: No such file or directory

_strerror says open failed: No such file or directory

См. также раздел


Управление процессами и средой

clearerr

ferror

strerror, _strerror, _wcserror, __wcserror


_pipe
Статья • 03.04.2023

Создает канал для чтения и записи.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _pipe(

int *pfds,

unsigned int psize,

int textmode

);

Параметры
pfds

Указатель на массив из двух int для хранения дескрипторов файлов чтения и


записи.

psize

Объем памяти, который необходимо зарезервировать.

textmode

Файловый режим.

Возвращаемое значение
Возвращает 0 в случае успеха. Возвращает значение -1, указывающее на ошибку.
При возникновении ошибки параметру errno присваивается одно из следующих
значений:
EMFILE , которое означает, что больше нет доступных дескрипторов файлов.

ENFILE , которое указывает на переполнение системной таблицы файлов.

EINVAL , которое означает, что либо массив pfds является указателем NULL,

либо передано недопустимое значение для textmode .

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция _pipe создает искусственный канал ввода-вывода, который программа
использует для передачи сведений другим программам. Канал напоминает файл,
так как он имеет указатель на файл, дескриптор файла или оба файла. Кроме того,
его можно считывать из стандартной библиотеки или записывать в него с
помощью функций ввода и вывода стандартной библиотеки. Однако канал не
представляет конкретный файл или устройство. Вместо этого он представляет
временное хранилище в памяти, которое не зависит от собственной памяти
программы и полностью контролируется операционной системой.

Функция _pipe похожа на функцию _open , но открывает канал для чтения и записи
и возвращает два дескриптора файла, а не один. Программа может использовать
обе стороны канала или закрыть ту сторону, которая не используется. Например,
обработчик команд в Windows создает канал во время выполнения команды, такой
как PROGRAM1 | PROGRAM2 .

Дескриптор стандартного вывода PROGRAM1 присоединен к дескриптору записи


канала. Стандартный дескриптор ввода PROGRAM2 присоединен к дескриптору
чтения канала. Это вложение устраняет необходимость создания временных
файлов для передачи информации в другие программы.

Функция _pipe возвращает два дескриптора файлов для канала в аргументе pfds .
Элемент pfds [0] содержит дескриптор чтения, а элемент pfds [1] содержит
дескриптор записи. Дескрипторы файлов канала используются точно так же, как и
другие дескрипторы файлов. (Низкоуровневые функции _read ввода и вывода,
которые _write могут считывать и записывать данные в канал.) Чтобы определить
условие завершения канала, проверьте _read запрос, возвращающий значение 0 в
виде числа прочитанных байтов.

Аргумент psize указывает объем памяти в байтах, который необходимо


зарезервировать для канала. Аргумент textmode определяет режим
преобразования для канала. Константа манифеста _O_TEXT задает текстовое
преобразование, а константа _O_BINARY задает двоичное преобразование.
(Смfopen_wfopen. описание текстовых и двоичных режимов.) textmode Если
аргумент равен 0, использует режим перевода по умолчанию, _pipe заданный
переменной _fmodeв режиме по умолчанию.

В многопоточных программах блокировки не выполняются. Возвращаемые


дескрипторы файлов открываются и не должны ссылаться ни на один поток до
_pipe завершения вызова.

Чтобы использовать функцию _pipe для обмена данными между родительским и


дочерним процессами, каждый процесс должен иметь только один открытый
дескриптор в канале. Дескрипторы должны быть противоположными: если
родительский процесс имеет доступ на чтение, то дочерний процесс должен иметь
открытый дескриптор записи. Проще всего использовать побитовое "или" ( | ) для
флага _O_NOINHERIT с textmode . Затем с помощью функции _dup или _dup2 создать
наследуемую копию дескриптора канала, который требуется передать дочернему
процессу. Закройте исходный дескриптор, затем создайте дочерний процесс.
После возвращения из вызова spawn закройте дублирующий дескриптор в
родительском процессе. Дополнительные сведения смотрите в примере 2 ниже в
данном разделе.

В операционной системе Windows при закрытии всех дескрипторов канала он


уничтожается. (Если все дескрипторы чтения в канале закрыты, запись в канал
вызывает ошибку.) Все операции чтения и записи в канале ожидают, пока не будет
достаточно данных или достаточно буферного пространства для выполнения
запроса ввода-вывода.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

1 2
_pipe <io.h> <fcntl.h> <errno.h>

1
Для _O_BINARY и _O_TEXT определений.

2
errno определения.
Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример 1
C

// crt_pipe.c

/* This program uses the _pipe function to pass streams of

* text to spawned processes.

*/

#include <stdlib.h>

#include <stdio.h>

#include <io.h>

#include <fcntl.h>

#include <process.h>

#include <math.h>

enum PIPES { READ, WRITE }; /* Constants 0 and 1 for READ and WRITE */

#define NUMPROBLEM 8

int main( int argc, char *argv[] )

int fdpipe[2];

char hstr[20];

int pid, problem, c;


int termstat;

/* If no arguments, this is the spawning process */

if( argc == 1 )

setvbuf( stdout, NULL, _IONBF, 0 );

/* Open a set of pipes */

if( _pipe( fdpipe, 256, O_BINARY ) == -1 )

exit( 1 );

/* Convert pipe read descriptor to string and pass as argument

* to spawned program. Program spawns itself (argv[0]).

*/

_itoa_s( fdpipe[READ], hstr, sizeof(hstr), 10 );

if( ( pid = _spawnl( P_NOWAIT, argv[0], argv[0],

hstr, NULL ) ) == -1 )

printf( "Spawn failed" );

/* Put problem in write pipe. Since spawned program is

* running simultaneously, first solutions may be done

* before last problem is given.

*/

for( problem = 1000; problem <= NUMPROBLEM * 1000; problem += 1000)

printf( "Son, what is the square root of %d?\n", problem );

_write( fdpipe[WRITE], (char *)&problem, sizeof( int ) );

/* Wait until spawned program is done processing. */

_cwait( &termstat, pid, WAIT_CHILD );

if( termstat & 0x0 )

printf( "Child failed\n" );

_close( fdpipe[READ] );

_close( fdpipe[WRITE] );

/* If there is an argument, this must be the spawned process. */

else

/* Convert passed string descriptor to integer descriptor. */

fdpipe[READ] = atoi( argv[1] );

/* Read problem from pipe and calculate solution. */

for( c = 0; c < NUMPROBLEM; c++ )

_read( fdpipe[READ], (char *)&problem, sizeof( int ) );

printf( "Dad, the square root of %d is %3.2f.\n",

problem, sqrt( ( double )problem ) );

Output

Son, what is the square root of 1000?

Son, what is the square root of 2000?

Son, what iDad, the square root of 1000 is 31.62.

Dad, the square root of 2000 is 44.72.

s the square root of 3000?

Dad, the square root of 3000 is 54.77.

Son, what is the square root of 4000?

Dad, the square root of 4000 is 63.25.

Son, what is the square root of 5000?

Dad, the square root of 5000 is 70.71.

Son, what is the square root of 6000?

SonDad, the square root of 6000 is 77.46.

, what is the square root of 7000?

Dad, the square root of 7000 is 83.67.

Son, what is the square root of 8000?

Dad, the square root of 8000 is 89.44.

Пример 2
Пример кода — это базовое приложение фильтра. Он создает приложение
crt_pipe_beeper после создания канала, который направляет созданное

приложение stdout в фильтр. Фильтр удаляет символ ASCII 7 (звуковой сигнал).

// crt_pipe_beeper.c

#include <stdio.h>

#include <string.h>

int main()

int i;

for(i=0;i<10;++i)

printf("This is speaker beep number %d...\n\7", i+1);

return 0;

Само фильтрующее приложение:

// crt_pipe_BeepFilter.C

// arguments: crt_pipe_beeper.exe

#include <windows.h>

#include <process.h>

#include <memory.h>

#include <string.h>

#include <stdio.h>

#include <fcntl.h>

#include <io.h>

#define OUT_BUFF_SIZE 512

#define READ_FD 0

#define WRITE_FD 1

#define BEEP_CHAR 7

char szBuffer[OUT_BUFF_SIZE];

int Filter(char* szBuff, ULONG nSize, int nChar)

char* szPos = szBuff + nSize -1;

char* szEnd = szPos;

int nRet = nSize;

while (szPos > szBuff)

if (*szPos == nChar)

memmove(szPos, szPos+1, szEnd - szPos);

--nRet;

--szPos;

return nRet;

int main(int argc, char** argv)

int nExitCode = STILL_ACTIVE;

if (argc >= 2)

HANDLE hProcess;

int fdStdOut;

int fdStdOutPipe[2];

// Create the pipe

if(_pipe(fdStdOutPipe, 512, O_NOINHERIT) == -1)

return 1;

// Duplicate stdout file descriptor (next line will close original)

fdStdOut = _dup(_fileno(stdout));

// Duplicate write end of pipe to stdout file descriptor

if(_dup2(fdStdOutPipe[WRITE_FD], _fileno(stdout)) != 0)

return 2;

// Close original write end of pipe

_close(fdStdOutPipe[WRITE_FD]);

// Spawn process

hProcess = (HANDLE)_spawnvp(P_NOWAIT, argv[1],

(const char* const*)&argv[1]);

// Duplicate copy of original stdout back into stdout

if(_dup2(fdStdOut, _fileno(stdout)) != 0)

return 3;

// Close duplicate copy of original stdout

_close(fdStdOut);

if(hProcess)

int nOutRead;

while (nExitCode == STILL_ACTIVE)

nOutRead = _read(fdStdOutPipe[READ_FD],

szBuffer, OUT_BUFF_SIZE);

if(nOutRead)

nOutRead = Filter(szBuffer, nOutRead, BEEP_CHAR);

fwrite(szBuffer, 1, nOutRead, stdout);

if(!GetExitCodeProcess(hProcess,(unsigned long*)&nExitCode))

return 4;

return nExitCode;

Output

This is speaker beep number 1...

This is speaker beep number 2...

This is speaker beep number 3...

This is speaker beep number 4...

This is speaker beep number 5...

This is speaker beep number 6...

This is speaker beep number 7...

This is speaker beep number 8...

This is speaker beep number 9...

This is speaker beep number 10...

См. также раздел


Управление процессами и средой

_open, _wopen
_popen , _wpopen
Статья • 03.04.2023

Создает канал и выполняет команду.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

FILE *_popen(

const char *command,

const char *mode

);

FILE *_wpopen(

const wchar_t *command,

const wchar_t *mode


);

Параметры
command

Команда для выполнения.

mode

Режим возвращенного потока.

Возвращаемое значение
Возвращает поток, связанный с одним концом созданного канала. Другой конец
канала связан со стандартным инициированным потоком ввода и вывода команд.
Функции возвращают ошибку NULL . Если ошибка вызвана недопустимым
параметром, errno для параметра задано значение EINVAL . Сведения о допустимых
режимах см. в разделе "Примечания".
Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция _popen создает канал. Затем он асинхронно выполняет порожденную
копию командного процессора и использует в command качестве командной строки.
Символьная строка mode указывает тип запрошенного доступа, как показано ниже.

Режим Описание
доступа

"r" Вызывающий процесс может считывать инициируемый поток вывода команд с


помощью возвращенного потока.

"w" Вызывающий процесс может записывать инициируемый поток ввода команд с


помощью возвращенного потока.

"b" Открыть в двоичном режиме.

"t" Открыть в текстовом режиме.

7 Примечание

При использовании в программе Windows функция _popen возвращает


недопустимый указатель на файл, в результате чего программа перестает
отвечать на запросы в течение неограниченного времени. Функция _popen
работает соответствующим образом в консольном приложении. Сведения о
создании приложения Windows, которое перенаправляет входные и выходные
данные, см. в статье Создание дочернего процесса с перенаправленными
входными и выходными данными в Windows SDK.

_wpopen — это версия _popen с расширенными символами; аргумент path для

_wpopen — строка расширенных символов. Поведение _wpopen и _popen идентично


в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом
Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tpopen _popen _popen _wpopen

Требования
Подпрограмма Обязательный заголовок

_popen <stdio.h>

_wpopen <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// popen.c

/* This program uses _popen and _pclose to receive a

* stream of text from a system process.

*/

#include <stdio.h>

#include <stdlib.h>

int main(void)

char psBuffer[128];
FILE* pPipe;

/* Run DIR so that it writes its output to a pipe. Open this

* pipe with read text attribute so that we can read it

* like a text file.

*/

if ((pPipe = _popen("dir *.c /on /p", "rt")) == NULL)

exit(1);

/* Read pipe until end of file, or an error occurs. */

while (fgets(psBuffer, 128, pPipe))

puts(psBuffer);

int endOfFileVal = feof(pPipe);

int closeReturnVal = _pclose(pPipe);

if (endOfFileVal)

printf("\nProcess returned %d\n", closeReturnVal);

else

printf("Error: Failed to read the pipe to the end.\n");

В выходных данных предполагается, что в текущем каталоге есть только один файл
с расширением .c имени файла.

Output

Volume in drive C is CDRIVE

Volume Serial Number is 0E17-1702

Directory of D:\proj\console\test1

07/17/98 07:26p 780 popen.c

1 File(s) 780 bytes

86,597,632 bytes free

Process returned 0

См. также раздел


Управление процессами и средой

_pclose

_pipe
pow , powf , powl
Статья • 03.04.2023

Вычисляет значение x , возведенное в степень y .

Синтаксис
C

double pow( double x, double y );

float powf( float x, float y );

long double powl( long double x, long double y );

define pow(X, Y) // Requires C11 or higher

double pow( double x, int y ); // C++ only

float pow( float x, float y ); // C++ only

float pow( float x, int y ); // C++ only

long double pow( long double x, long double y ); // C++ only

long double pow( long double x, int y ); // C++ only

Параметры
x

База.

Экспонента.

Возвращаемое значение
Возвращает значение x y . Сообщение об ошибке не выводится в случае
переполнения или потери значимости.

x Значения и y Возвращаемое значение pow

x != 0,0 и y == 0,0 1

x == 0,0 и y == 0,0 1

x == 0,0 и y < 0 INF


Комментарии
pow не распознает целочисленные значения с плавающей запятой больше 264

(например, 1.0E100).

Функция pow содержит реализацию, которая использует Streaming SIMD Extensions


2 (SSE2). Сведения и ограничения по использованию реализации SSE2 см. в
разделе _set_SSE2_enable.

Так как C++ допускает перегрузку, можно вызывать любые перегрузки pow . В
программе C, если вы не используете <tgmath.h> макрос для вызова этой функции,
pow всегда принимает два double значения и возвращает double значение.

Если вы используете pow макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

Перегрузка pow(int, int) более не доступна. При использовании этой перегрузки


компилятор может выдавать C2668. Чтобы избежать этой проблемы, необходимо
привести параметр к типу double , float или long double .

Первоначально перегрузки pow(T, int) раскрутили pow вызов в


последовательность встроенных операций умножения. Хотя это было быстрее, он
также был гораздо менее точным. Эта реализация была удалена в Visual Studio
2015 с обновлением 1. Дополнительные сведения см. в статье Улучшения
соответствия в Visual Studio 2015 с обновлением 1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

pow , powf , powl <math.h> <math.h> или <cmath>

pow Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_pow.c

#include <math.h>

#include <stdio.h>

int main( void )

double x = 2.0, y = 3.0, z;

z = pow( x, y );

printf( "%.1f to the power of %.1f is %.1f\n", x, y, z );

Output

2.0 to the power of 3.0 is 8.0

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
exp, expf, expl

log, logf, log10, log10f

sqrt, sqrtf, sqrtl

_CIpow
printf , _printf_l , wprintf , _wprintf_l
Статья • 03.04.2023

Выводит форматированные выходные данные в стандартный поток вывода.


Доступны более безопасные версии этих функций; see printf_s, _printf_s_l,
wprintf_s_wprintf_s_l.

Синтаксис
C

int printf(

const char *format [,

argument]...

);

int _printf_l(

const char *format,

_locale_t locale [,

argument]...

);

int wprintf(

const wchar_t *format [,

argument]...

);

int _wprintf_l(

const wchar_t *format,

_locale_t locale [,

argument]...

);

Параметры
format

Формат объекта.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает число выведенных символов или отрицательное значение в случае
ошибки. В противном format случае NULL вызывается обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, функция возвращает -1 и устанавливает errno в значение
EINVAL . Если EOF (0xFFFF) встречается в argument , функция возвращает -1.

Сведения о кодах ошибок и см. в errno разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Функция printf форматирует и выводит последовательность символов и значений
в стандартный поток вывода, stdout . Если за строкой format следуют аргументы,
строка format должна содержать спецификации, которые определяют формат
вывода для аргументов. printf и fprintf ведут себя одинаково, за исключением
того, что printf выходные данные записываются stdout вместо назначения типа
FILE .

Функция wprintf — это версия printf с расширенными символами; format  —


строка расширенных символов. wprintf и printf ведут себя одинаково, если поток
открыт в режиме ANSI. Функция printf на данный момент не поддерживает вывод
данных в поток в кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Аргумент format состоит из обычных символов, escape-последовательностей и


(если за format следуют аргументы) спецификаций формата. Обычные символы и
escape-последовательности копируются в stdout в порядке их отображения.
Например, в строке

printf("Line one\n\t\tLine two\n");

выводятся следующие выходные данные:

Output

Line one

Line two

Спецификации формата всегда начинаются со знака процента (%) и читаются слева


направо. Когда функция printf обнаруживает первую спецификацию формата
(если таковые имеются), она преобразует значение первого после format
аргумента и выводит его соответствующим образом. Вторая спецификация
формата вызывает преобразование второго аргумента и его вывод и т. д. Если
число аргументов превышает количество спецификаций формата, лишние
аргументы игнорируются. Результаты не определены, если для всех спецификаций
формата недостаточно аргументов.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tprintf printf printf wprintf

_tprintf_l _printf_l _printf_l _wprintf_l

Требования
Подпрограмма Обязательный заголовок

printf , _printf_l <stdio.h>

wprintf , _wprintf_l <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью, stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

) Важно!
Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций
выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округляются до
ближайшей четной цифры (также известной как "Округление банкира").
Например, оба printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны
округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до 3. Это
изменение влияет только на точно представляемые числа. Например, 2.35
(который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Пример
C

// crt_printf.c

// This program uses the printf and wprintf functions

// to produce formatted output.

#include <stdio.h>

int main( void )

char ch = 'h',

*string = "computer";

wchar_t wch = L'w',

*wstring = L"Unicode";

int count = -9234;

double fp = 251.7366;

// Display integers

printf( "Integer formats:\n"

" Decimal: %d Justified: %.6d "

"Unsigned: %u\n",

count, count, count, count );

// Display decimals

printf( "Decimal %d as:\n Hex: %Xh "

"C hex: 0x%x Octal: %o\n",

count, count, count, count );

// Display in different radixes

printf( "Digits 10 equal:\n Hex: %i "

"Octal: %i Decimal: %i\n",

0x10, 010, 10 );

// Display characters

printf("Characters in field (1):\n"

"%10c%5hc%5C%5lc\n",

ch, ch, wch, wch);

wprintf(L"Characters in field (2):\n"

L"%10C%5hc%5c%5lc\n",

ch, ch, wch, wch);

// Display strings

printf("Strings in field (1):\n%25s\n"

"%25.4hs\n %S%25.3ls\n",

string, string, wstring, wstring);

wprintf(L"Strings in field (2):\n%25S\n"

L"%25.4hs\n %s%25.3ls\n",

string, string, wstring, wstring);

// Display real numbers

printf("Real numbers:\n %f %.2f %e %E\n",

fp, fp, fp, fp );

// Display pointer

printf( "\nAddress as: %p\n", &count);

Пример полученных результатов


Output

Integer formats:

Decimal: -9234 Justified: -009234 Unsigned: 4294958062

Decimal -9234 as:

Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756

Digits 10 equal:

Hex: 16 Octal: 8 Decimal: 10


Characters in field (1):

h h w w

Characters in field (2):

h h w w

Strings in field (1):

computer

comp

Unicode Uni

Strings in field (2):

computer

comp

Unicode Uni

Real numbers:

251.736600 251.74 2.517366e+002 2.517366E+002

Address as: 0012FF3C

См. также раздел


Синтаксис спецификации формата: printf и wprintf функции

Поддержка математических функций для чисел с плавающей запятой


Потоковый ввод-вывод

Локаль

fopen, _wfopen

_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l

scanf, _scanf_l, wscanf, _wscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

Функции vprintf

_set_output_format
_printf_p , _printf_p_l , _wprintf_p ,
_wprintf_p_l
Статья • 03.04.2023

Выводит форматированные выходные данные в стандартный поток вывода и


обеспечивает задание порядка, в котором параметры используются в строке
форматирования.

Синтаксис
C

int _printf_p(

const char *format [,

argument]...

);

int _printf_p_l(

const char *format,

_locale_t locale [,

argument]...

);

int _wprintf_p(

const wchar_t *format [,

argument]...

);

int _wprintf_p_l(

const wchar_t *format,

_locale_t locale [,

argument]...

);

Параметры
format

Формат объекта.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.


Возвращаемое значение
Возвращает число выведенных символов или отрицательное значение в случае
ошибки.

Комментарии
Функция _printf_p форматирует и выводит последовательность символов и
значений в стандартный поток вывода, stdout . Если за строкой format следуют
аргументы, строка format должна содержать спецификации, которые определяют
формат вывода для аргументов (см. раздел Позиционные параметры printf_p).

Различие между функциями _printf_p и printf_s заключается в том, что функция


_printf_p поддерживает позиционные параметры, позволяющие определить

порядок, в котором аргументы используются в строке форматирования.


Дополнительные сведения см. в разделе Позиционные параметры printf_p.

Функция _wprintf_p является версией функции _printf_p для расширенных


символов; они ведут себя одинаково, если поток открыт в режиме ANSI. Функция
_printf_p на данный момент не поддерживает вывод данных в поток в кодировке

Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Если format или argument нет NULL , либо строка формата содержит недопустимые
символы форматирования, _printf_p а _wprintf_p функции вызывают обработчик
недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, функция возвращает -1 и устанавливает
errno в значение EINVAL .

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_tprintf_p _printf_p _printf_p _wprintf_p

_tprintf_p_l _printf_p_l _printf_p_l _wprintf_p_l

Требования
Подпрограмма Обязательный заголовок

_printf_p , _printf_p_l <stdio.h>

_wprintf_p , _wprintf_p_l <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью, stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округляются до
ближайшей четной цифры (также известной как "Округление банкира").
Например, оба printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны
округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до 3. Это
изменение влияет только на точно представляемые числа. Например, 2.35
(который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.
Пример
C

// crt_printf_p.c

// This program uses the _printf_p and _wprintf_p

// functions to choose the order in which parameters

// are used.

#include <stdio.h>

int main( void )

// Positional arguments

_printf_p( "Specifying the order: %2$s %3$s %1$s %4$s %5$s.\n",

"little", "I'm", "a", "tea", "pot");

// Resume arguments

_wprintf_p( L"Reusing arguments: %1$d %1$d %1$d %1$d\n", 10);

// Width argument

_printf_p("Width specifiers: %1$*2$s", "Hello\n", 10);

Output

Specifying the order: I'm a little tea pot.

Reusing arguments: 10 10 10 10

Width specifiers: Hello

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Потоковый ввод-вывод

Локаль

fopen, _wfopen

_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l

scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l

Функции vprintf
printf_s , _printf_s_l , wprintf_s ,
_wprintf_s_l
Статья • 03.04.2023

Выводит форматированные выходные данные в стандартный поток вывода. Эти


версии printf, _printf_l, wprintf_wprintf_l имеют улучшения безопасности, как
описано в разделе Функции безопасности в CRT.

Синтаксис
C

int printf_s(

const char *format [,

argument]...

);

int _printf_s_l(

const char *format,

_locale_t locale [,

argument]...

);

int wprintf_s(

const wchar_t *format [,

argument]...

);

int _wprintf_s_l(

const wchar_t *format,

_locale_t locale [,

argument]...

);

Параметры
format

Формат объекта.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.


Возвращаемое значение
Возвращает число выведенных символов или отрицательное значение в случае
ошибки.

Комментарии
Функция printf_s форматирует и выводит последовательность символов и
значений в стандартный поток вывода, stdout . Если за строкой format следуют
аргументы, строка format должна содержать спецификации, которые определяют
формат вывода для аргументов.

Основное различие между printf_s и printf заключается в том, что printf_s


проверяет строку форматирования на наличие допустимых символов
форматирования, тогда как printf только проверяет, является ли строка
форматирования пустым указателем. Если не удается выполнить проверку,
вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если выполнение может быть продолжено, функция
возвращает -1 и устанавливает errno в значение EINVAL .

Сведения о кодах ошибок и см. в errno разделах errno, _doserrno, _sys_errlistи


_sys_nerr.

printf_s и fprintf_s ведут себя одинаково, за исключением того, что printf_s


записывает выходные данные в stdout , а не в назначение типа FILE .
Дополнительные сведения см. в разделе fprintf_s, _fprintf_s_l, fwprintf_s, ,
_fwprintf_s_l.

Функция wprintf_s — это версия printf_s с расширенными символами; format  —


строка расширенных символов. wprintf_s и printf_s ведут себя одинаково, если
поток открыт в режиме ANSI. Функция printf_s на данный момент не
поддерживает вывод данных в поток в кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста


TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tprintf_s printf_s printf_s wprintf_s

_tprintf_s_l _printf_s_l _printf_s_l _wprintf_s_l

Аргумент format состоит из обычных символов, escape-последовательностей и


(если за format следуют аргументы) спецификаций формата. Обычные символы и
escape-последовательности копируются в stdout в порядке их отображения.
Например, в строке

printf_s("Line one\n\t\tLine two\n");

выводятся следующие выходные данные

Output

Line one

Line two

Спецификации формата всегда начинаются со знака процента ( % ) и читаются слева


направо. Когда функция printf_s обнаруживает первую спецификацию формата
(если таковые имеются), она преобразует значение первого после format
аргумента и выводит его соответствующим образом. Вторая спецификация
формата вызывает преобразование второго аргумента и его вывод и т. д. Если
число аргументов превышает количество спецификаций формата, лишние
аргументы игнорируются. Результаты не определены, если для всех спецификаций
формата недостаточно аргументов.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


печатает точно представленные числа с плавающей запятой в соответствии с
правилами округления IEEE 754. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 гласит, что они должны округлиться до ближайшей
четной цифры (также известный как "Округление банкира"). Например, и
printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до 2. Ранее

значение 1,5 округлялось до 2, а 2,5 округлялось до 3. Это изменение влияет


только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,350000000000000008) продолжает
округление до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Требования
Подпрограмма Обязательный заголовок

printf_s , _printf_s_l <stdio.h>

wprintf_s , _wprintf_s_l <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C

смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C

смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_printf_s.c

/* This program uses the printf_s and wprintf_s functions

* to produce formatted output.

*/

#include <stdio.h>

int main( void )

char ch = 'h', *string = "computer";

int count = -9234;

double fp = 251.7366;

wchar_t wch = L'w', *wstring = L"Unicode";

/* Display integers. */

printf_s( "Integer formats:\n"


" Decimal: %d Justified: %.6d Unsigned: %u\n",

count, count, count );

printf_s( "Decimal %d as:\n Hex: %Xh C hex: 0x%x Octal: %o\n",

count, count, count, count );

/* Display in different radixes. */

printf_s( "Digits 10 equal:\n Hex: %i Octal: %i Decimal: %i\n",

0x10, 010, 10 );

/* Display characters. */

printf_s("Characters in field (1):\n%10c%5hc%5C%5lc\n", ch, ch, wch,


wch);

wprintf_s(L"Characters in field (2):\n%10C%5hc%5c%5lc\n", ch, ch, wch,


wch);

/* Display strings. */

printf_s("Strings in field (1):\n%25s\n%25.4hs\n %S%25.3ls\n",

string, string, wstring, wstring);

wprintf_s(L"Strings in field (2):\n%25S\n%25.4hs\n %s%25.3ls\n",

string, string, wstring, wstring);

/* Display real numbers. */

printf_s( "Real numbers:\n %f %.2f %e %E\n", fp, fp, fp, fp );

/* Display pointer. */

printf_s( "\nAddress as: %p\n", &count);

Пример полученных результатов


Output

Integer formats:

Decimal: -9234 Justified: -009234 Unsigned: 4294958062

Decimal -9234 as:

Hex: FFFFDBEEh C hex: 0xffffdbee Octal: 37777755756

Digits 10 equal:

Hex: 16 Octal: 8 Decimal: 10


Characters in field (1):

h h w w

Characters in field (2):

h h w w

Strings in field (1):

computer

comp

Unicode Uni

Strings in field (2):

computer

comp

Unicode Uni

Real numbers:

251.736600 251.74 2.517366e+002 2.517366E+002

Address as: 0012FF78

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Потоковый ввод-вывод

Локаль

fopen, _wfopen

fprintf, _fprintf_l, fwprintf, _fwprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

Функции vprintf
_purecall
Статья • 03.04.2023

Обработчик ошибок вызовов чистой виртуальной функции по умолчанию. При


вызове чистой виртуальной функции-члена компилятор создает код для вызова
этой функции.

Синтаксис
C

extern "C" int __cdecl _purecall();

Remarks
Эта _purecall функция представляет собой сведения о реализации компилятора
Microsoft C++. Эта функция не предназначена для непосредственного вызова кода
и не имеет открытого объявления заголовка. Он описан здесь, так как он является
общедоступным экспортом библиотеки среды выполнения C.

Вызов чистой виртуальной функции является ошибкой, так как она не имеет
реализации. При вызове чистой виртуальной функции компилятор создает код для
вызова этой функции обработчика ошибок _purecall . По умолчанию _purecall
завершает программу. _purecall Перед завершением работы функции она
вызывает _purecall_handler функцию, если она была задана для процесса. Можно
установить собственный обработчик ошибок для вызовов чистых виртуальных
функций, который будет перехватывать их в целях отладки или ведения отчетности.
Чтобы использовать собственный обработчик ошибок, создайте функцию с
сигнатурой _purecall_handler , а затем с помощью _set_purecall_handler установите
ее в качестве текущего обработчика.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Функция _purecall не имеет объявления заголовка. Typedef _purecall_handler
определяется в <stdlib.h>.

См. также раздел


Алфавитный указатель функций

_get_purecall_handler, _set_purecall_handler
putc , putwc
Статья • 03.04.2023

Записывает символ в поток.

Синтаксис
C

int putc(

int c,

FILE *stream

);

wint_t putwc(

wchar_t c,

FILE *stream

);

Параметры
c

Символ, который требуется записать.

stream

Указатель на структуру FILE .

Возвращаемое значение
Возвращает записанный символ. Чтобы указать ошибку или условие окончания
файла, putc putchar возвращается EOF ; putwc и putwchar возвращается WEOF . Для
всех четырех подпрограмм используйте ferror или feof , чтобы проверить наличие
ошибки или конца файла. Если передается пустой указатель для stream , вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение разрешено продолжать, эти функции возвращают
EOF или WEOF и устанавливают для значение . EINVAL errno

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Подпрограмма putc записывает отдельный символ c в выходные данные stream в
текущей позиции. Любое целое число может быть передано для putc , но
записываются только младшие 8 битов. Подпрограмма putchar идентична putc( c,
stdout ) . Если возникает ошибка чтения, то в каждой подпрограмме для каждого
потока устанавливается индикатор ошибки. putc и putchar похожи на и
_fputchar соответственно, но реализуются как функции и макросы (см. статью

Рекомендации по выбору fputc между функциями и макросами). putwc и putwchar


— это версии putc и putchar с расширенными символами. putwc и putc ведут себя
одинаково, если поток открыт в режиме ANSI. Функция putc на данный момент не
поддерживает вывод данных в поток в кодировке Юникод.

Версии с суффиксом _nolock идентичны, за исключением того, что они не


защищены от помех со стороны других потоков. Дополнительные сведения см. в
разделе _putc_nolock, _putwc_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_puttc putc putc putwc

Требования
Подпрограмма Обязательный заголовок

putc <stdio.h>

putwc <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.
Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_putc.c

/* This program uses putc to write buffer

* to a stream. If an error occurs, the program

* stops before writing the entire buffer.

*/

#include <stdio.h>

int main( void )

FILE *stream;

char *p, buffer[] = "This is the line of output\n";

int ch;

ch = 0;

/* Make standard out the stream and write to it. */

stream = stdout;

for( p = buffer; (ch != EOF) && (*p != '\0'); p++ )

ch = putc( *p, stream );

Выходные данные
Output

This is the line of output

См. также
Потоковый ввод-вывод

fputc, fputwc

getc, getwc
_putc_nolock , _putwc_nolock
Статья • 03.04.2023

Записывает символ в поток без блокировки потока.

Синтаксис
C

int _putc_nolock(

int c,

FILE *stream

);

wint_t _putwc_nolock(

wchar_t c,

FILE *stream

);

Параметры
c

Символ, который требуется записать.

stream

Указатель на структуру FILE .

Возвращаемое значение
См. putc, putwc.

Комментарии
_putc_nolock и _putwc_nolock идентичны версиям без суффикса _nolock , за
исключением того, что они не защищены от помех со стороны других потоков. Они
могут выполняться быстрее, так как они не несут накладных расходов, связанных с
блокировкой других потоков. Используйте эти функции только в потокобезопасных
контекстах, например в однопоточных приложениях или если вызываемая область
уже обрабатывает изоляцию потоков.
Функция _putwc_nolock является версией функции _putc_nolock с расширенными
символами; обе функции ведут себя одинаково, если поток открыт в режиме ANSI.
Функция _putc_nolock на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_puttc_nolock _putc_nolock _putc_nolock _putwc_nolock

Требования
Подпрограмма Обязательный заголовок

_putc_nolock <stdio.h>

_putwc_nolock <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_putc_nolock.c

/* This program uses putc to write buffer

* to a stream. If an error occurs, the program

* stops before writing the entire buffer.

*/

#include <stdio.h>

int main( void )

FILE *stream;

char *p, buffer[] = "This is the line of output\n";

int ch;

ch = 0;

/* Make standard out the stream and write to it. */

stream = stdout;

for( p = buffer; (ch != EOF) && (*p != '\0'); p++ )

ch = _putc_nolock( *p, stream );

Выходные данные
Output

This is the line of output

См. также
Потоковый ввод-вывод

fputc, fputwc

getc, getwc
putch
Статья • 03.04.2023

Имя putch функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _putch функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _putch . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_putch , _putwch
Статья • 03.04.2023

Записывает символ в строку.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _putch(

int c

);

wint_t _putwch(

wchar_t c

);

Параметры
c

Символ, который требуется вывести.

Возвращаемое значение
Возвращает значение c в случае успешного выполнения. Если _putch ошибка
завершается ошибкой, она возвращается EOF ; в _putwch случае сбоя возвращается
WEOF .

Комментарии
Эти функции записывают символ c напрямую в консоль (без буферизации). В
Windows NT _putwch записывает символы Юникода с помощью текущего
параметра языкового стандарта консоли.

Версии с суффиксом _nolock идентичны, за исключением того, что они не


защищены от помех другими потоками. Дополнительные сведения см. в разделе
_putch_nolock, _putwch_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_puttch _putch _putch _putwch

Требования
Подпрограмма Обязательный заголовок

_putch <conio.h>

_putwch <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
См. пример для _getch.

См. также раздел


Ввод-вывод на консоль и порт

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

_getch, _getwch
_putch_nolock , _putwch_nolock
Статья • 03.04.2023

Записывает символ в консоль без блокировки потока.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _putch_nolock(

int c

);

wint_t _putwch_nolock(

wchar_t c

);

Параметры
c

Символ, который требуется вывести.

Возвращаемое значение
Возвращает значение c в случае успешного выполнения. В случае _putch_nolock
сбоя возвращается EOF ; в случае _putwch_nolock сбоя возвращается WEOF .

Комментарии
_putch_nolock и _putwch_nolock идентичны _putch и _putwch соответственно, за
исключением того, что они не защищены от помех со стороны других потоков. Они
могут выполняться быстрее, так как они не несут накладных расходов, связанных с
блокировкой других потоков. Используйте эти функции только в потокобезопасных
контекстах, например в однопоточных приложениях или если вызываемая область
уже обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_puttch_nolock _putch_nolock _putch_nolock _putwch_nolock

Требования
Подпрограмма Обязательный заголовок

_putch_nolock <conio.h>

_putwch_nolock <conio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Ввод-вывод на консоль и порт

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

_getch, _getwch
putchar , putwchar
Статья • 03.04.2023

Записывает символ в поток stdout .

Синтаксис
C

int putchar(

int c

);

wint_t putwchar(

wchar_t c

);

Параметры
c

Символ, который требуется записать.

Возвращаемое значение
Возвращает записанный символ. Чтобы указать ошибку или условие завершения
файла, putc возвратить EOF putchar и putwc putwchar вернуть . WEOF Для всех
четырех подпрограмм используйте ferror или feof проверьте наличие ошибки или
окончания файла. При передаче указателя NULL для stream этих функций создается
исключение недопустимого параметра, как описано в разделе "Проверка
параметров". Если выполнение разрешено продолжать, они возвращают EOF или
WEOF задают значение errno EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Подпрограмма putc записывает отдельный символ c в выходные данные stream в
текущей позиции. Любое целое число может быть передано для putc , но
записываются только младшие 8 битов. Подпрограмма putchar идентична putc( c,
stdout ) . Если возникает ошибка чтения, то в каждой подпрограмме для каждого

потока устанавливается индикатор ошибки. putc и аналогичны и соответственно,


но реализуются как функции, так и как макросы (см. рекомендации по выбору
между функциями и макросами). _fputchar fputc putchar putwc и putwchar — это
версии putc и putchar с расширенными символами.

Версии с суффиксом _nolock идентичны, за исключением того, что они не


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

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_puttchar putchar putchar putwchar

Требования
Подпрограмма Обязательный заголовок

putchar <stdio.h>

putwchar <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью, stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
C

// crt_putchar.c

/* This program uses putc to write buffer

* to a stream. If an error occurs, the program

* stops before writing the entire buffer.

*/

#include <stdio.h>

int main( void )

FILE *stream;

char *p, buffer[] = "This is the line of output\n";

int ch;

ch = 0;

for( p = buffer; (ch != EOF) && (*p != '\0'); p++ )

ch = putchar( *p );

Выходные данные
Output

This is the line of output

См. также
Потоковый ввод-вывод

fputc, fputwc

getc, getwc
_putchar_nolock , _putwchar_nolock
Статья • 03.04.2023

Записывает символ в , stdout не блокируя поток.

Синтаксис
C

int _putchar_nolock(

int c

);

wint_t _putwchar_nolock(

wchar_t c

);

Параметры
c

Символ, который требуется записать.

Возвращаемое значение
См. описание функций putchar, putwchar.

Комментарии
putchar_nolock и _putwchar_nolock идентичны версиям без суффикса _nolock , за
исключением того, что они не защищены от помех со стороны других потоков. Они
могут выполняться быстрее, так как они не несут накладных расходов, связанных с
блокировкой других потоков. Используйте эти функции только в потокобезопасных
контекстах, например в однопоточных приложениях или если вызываемая область
уже обрабатывает изоляцию потоков.

Сопоставления подпрограмм с универсальным


текстом
Процедура _UNICODE и _MBCS не _MBCS _UNICODE
Tchar.h определены Определенные Определенные

_puttchar_nolock _putchar_nolock _putchar_nolock _putwchar_nolock

Требования
Подпрограмма Обязательный заголовок

_putchar_nolock <stdio.h>

_putwchar_nolock <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_putchar_nolock.c

/* This program uses putchar to write buffer

* to stdout. If an error occurs, the program

* stops before writing the entire buffer.

*/

#include <stdio.h>

int main( void )

FILE *stream;

char *p, buffer[] = "This is the line of output\n";

int ch;

ch = 0;

for( p = buffer; (ch != EOF) && (*p != '\0'); p++ )

ch = _putchar_nolock( *p );
}

Выходные данные
Output

This is the line of output

См. также
Потоковый ввод-вывод

fputc, fputwc

fgetc, fgetwc
putenv
Статья • 03.04.2023

Имя putenv функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _putenv для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _putenv или функцию с повышенным


_putenv_s уровнем безопасности. Кроме того, вы можете продолжать использовать
это имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен функций предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_putenv , _wputenv
Статья • 03.04.2023

Создает, изменяет или удаляет переменные среды. Доступны более безопасные


версии этих функций; См. раздел_putenv_s , _wputenv_s.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _putenv(

const char *envstring

);

int _wputenv(

const wchar_t *envstring

);

Параметры
envstring

Определение строки среды.

Возвращаемое значение
Функции возвращают 0 в случае успешного выполнения или -1 при наличии
ошибки.

Комментарии
Функция _putenv добавляет новые переменные среды или изменяет значения
существующих переменных среды. Переменные среды определяют среду, в
которой выполняется процесс (например, путь поиска по умолчанию для
библиотек, связываемых с программой). _wputenv — это версия _putenv с
расширенными символами; аргумент envstring для _wputenv — строка
расширенных символов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Tchar.h _UNICODE and _MBCS не _MBCS _UNICODE


Обычной определено Определенные Определенные

_tputenv _putenv _putenv _wputenv

Аргумент envstring должен быть указателем на строку вида varname=value_string ,


где varname  — имя добавляемой или изменяемой переменной среды, а
value_string  — значение переменной. Если переменная varname уже существует в

среде, ее значение заменяется значением value_string ; в противном случае в эту


среду добавляются новая переменная varname и ее значение value_string . Вы
можете удалить переменную из среды, указав пустой value_string или, другими
словами, указав только varname =.

_putenv и _wputenv влияют только на локальную среду текущего процесса. Их


нельзя использовать для изменения среды на уровне команд. То есть эти функции
работают только со структурами данных, доступными для библиотеки времени
выполнения. Они не работают с сегментом среды, созданным для процесса
операционной системой. При завершении текущего процесса среда возвращается
на уровень вызывающего процесса (в большинстве случаев — на уровень
операционной системы). Однако измененную среду можно передать любым
новым процессам, создаваемым функцией _spawn , _exec или system , и эти новые
процессы получают все новые элементы, добавленные функциями _putenv и
_wputenv .

Не изменяйте запись среды напрямую: вместо этого используйте _putenv или


_wputenv , чтобы изменить ее. В частности, непосредственное освобождение

элементов глобального массива _environ[] может привести к адресации


недопустимой памяти.

Функции _getenv и _putenv используют глобальную переменную _environ для


доступа к таблице среды; функции _wgetenv и _wputenv используют таблицу
_wenviron . _putenv и _wputenv может изменить значение _environ и _wenviron , что

делает недопустимым _envp аргумент на main , а аргумент — _wenvp на wmain .


Поэтому безопаснее использовать _environ или _wenviron для доступа к
информации о среде. Дополнительные сведения об отношении _putenv и _wputenv
к глобальным переменным см. в разделе_environ , _wenviron.

7 Примечание

Семейства функций _putenv и _getenv не являются потокобезопасными.


Функция _getenv может вернуть указатель строки, в то время как функция
_putenv изменяет строку, вызывая случайные сбои. Убедитесь, что вызовы этих
функций синхронизированы.

Требования
Подпрограмма Обязательный заголовок

_putenv <stdlib.h>

_wputenv <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Пример использования _putenv см. в разделе getenv, _wgetenv.

См. также раздел


Управление процессами и средой

getenv, _wgetenv

_searchenv, _wsearchenv
_putenv_s , _wputenv_s
Статья • 03.04.2023

Создает, изменяет или удаляет переменные среды. Эти функции являются версиями
_putenv, _wputenv которые имеют улучшения безопасности, как описано в разделе
Функции безопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _putenv_s(

const char *varname,


const char *value_string

);

errno_t _wputenv_s(

const wchar_t *varname,

const wchar_t *value_string

);

Параметры
varname

Имя переменной среды.

value_string

Значение, которое будет задано для переменной среды.

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

Условия ошибок
varname value_string Возвращаемое значение

NULL any EINVAL

any NULL EINVAL

Если возникает одно из условий ошибки, эти функции вызывают обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, эти функции возвращают EINVAL и
устанавливают для errno значение EINVAL .

Комментарии
Функция _putenv_s добавляет новые переменные среды или изменяет значения
существующих переменных среды. Переменные среды определяют среду, в
которой выполняется процесс (например, путь поиска по умолчанию для
библиотек, связываемых с программой). _wputenv_s — это версия _putenv_s с
расширенными символами; аргумент envstring для _wputenv_s — строка
расширенных символов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tputenv_s _putenv_s _putenv_s _wputenv_s

varname — это имя добавляемой или изменяемой переменной среды, а

value_string — это значение переменной. Если переменная varname уже


существует в среде, ее значение заменяется значением value_string ; в противном
случае в среду добавляется новая переменная varname и ее значение value_string .
Можно удалить переменную из среды, указав пустую строку (т. е "" . ) для
value_string .

_putenv_s и _wputenv_s влияют только на локальную среду текущего процесса. Их


нельзя использовать для изменения среды на уровне команд. Эти функции
работают только в структурах данных, доступных библиотеке времени выполнения,
а не в "сегменте" среды, созданном для процесса операционной системой. По
завершении текущего процесса среда возвращается на уровень вызывающего
процесса; в большинстве случаев это уровень операционной системы. Однако
измененную среду можно передать любым новым процессам, созданным
функциями _spawn , _exec или system , и эти новые процессы получат все новые
элементы, добавленные функциями _putenv_s и _wputenv_s .

Не изменяйте запись среды напрямую; вместо этого используйте _putenv_s или


_wputenv_s , чтобы изменить его. В частности, непосредственное освобождение

элементов глобального массива _environ[] может привести к адресации


недопустимого участка памяти.

Функции getenv и _putenv_s используют глобальную переменную _environ для


доступа к таблице среды; функции _wgetenv и _wputenv_s используют таблицу
_wenviron . Функции _putenv_s и _wputenv_s могут изменить значение _environ и

_wenviron и тем самым сделать недействительным аргумент envp для main и


аргумент _wenvp для wmain . Поэтому безопаснее использовать _environ или
_wenviron для доступа к информации о среде. Дополнительные сведения о связи и

_wputenv_s с глобальными _putenv_s переменными см. в разделе _environ.


_wenviron

7 Примечание

Семейства функций _putenv_s и _getenv_s не являются потокобезопасными.


Функция _getenv_s может возвратить строковый указатель в то время как
_putenv_s изменяет строку, что может вызвать случайные сбои. Убедитесь, что

вызовы этих функций синхронизированы.

Требования
Подпрограмма Обязательный заголовок

_putenv_s <stdlib.h>

_wputenv_s <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Пример использования см. в разделе , _wgetenv_s.getenv_s _putenv_s

См. также раздел


Управление процессами и средой

getenv, _wgetenv

_searchenv, _wsearchenv
puts , _putws
Статья • 03.04.2023

Записывает строку stdout в .

Синтаксис
C

int puts(

const char *str

);

int _putws(

const wchar_t *str

);

Параметры
str

Выходная строка.

Возвращаемое значение
Возвращает неотрицательное значение в случае успешного выполнения. В случае
puts сбоя возвращается EOF ; в случае _putws сбоя возвращается WEOF . Если str

является пустым указателем, вызывается обработчик недопустимых параметров,


как описано в разделе Проверка параметров. Если выполнение разрешено
продолжать, функции присваивают значение errno EINVAL и возвращают EOF или
WEOF .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция puts записывает str данные в стандартный выходной поток stdout ,
заменяя завершающий пустой символ строки ('\0') символом новой строки ('\n') в
выходном потоке.
Функция _putws является версией функции puts с расширенными символами; обе
функции ведут себя одинаково, если поток открыт в режиме ANSI. Функция puts на
данный момент не поддерживает вывод данных в поток в кодировке Юникод.

_putwch записывает символы Юникода с помощью текущего параметра CONSOLE


LOCALE.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_putts puts puts _putws

Требования
Подпрограмма Обязательный заголовок

puts <stdio.h>

_putws <stdio.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C
// crt_puts.c

// This program uses puts to write a string to stdout.

#include <stdio.h>

int main( void )

puts( "Hello world from puts!" );

Выходные данные
Output

Hello world from puts!

См. также
Потоковый ввод-вывод

fputs, fputws

fgets, fgetws
putw
Статья • 03.04.2023

Имя putw функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _putw функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _putw . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_putw
Статья • 03.04.2023

Записывает целое число в поток.

Синтаксис
C

int _putw(

int binint,

FILE *stream

);

Параметры
binint

Двоичное целое число, которое требуется вывести.

stream

Указатель на структуру FILE .

Возвращаемое значение
Возвращает записанное значение. Возвращаемое значение EOF может указывать на
ошибку. Так как EOF также является допустимым целочисленным значением,
используйте ferror для подтверждения ошибки. Если stream это пустой указатель,
вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если выполнение может быть продолжено, эта функция
задает для errno значение EINVAL и возвращает EOF .

Сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Функция _putw записывает двоичное значение типа int в текущее положение
потока. _putw Не влияет на выравнивание элементов в потоке и не предполагает
специального выравнивания. Функция _putw предназначена в основном для
обеспечения совместимости с предыдущими библиотеками. При использовании
функции _putw могут возникнуть проблемы переносимости, связанные с размером
int и порядком байтов в int в разных системах.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_putw <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_putw.c

/* This program uses _putw to write a

* word to a stream, then performs an error check.

*/

#include <stdio.h>

#include <stdlib.h>

int main( void )

FILE *stream;

unsigned u;

if( fopen_s( &stream, "data.out", "wb" ) )

exit( 1 );

for( u = 0; u < 10; u++ )

_putw( u + 0x2132, stream ); /* Write word to stream. */

if( ferror( stream ) ) /* Make error check. */

printf( "_putw failed" );

clearerr_s( stream );

exit( 1 );

printf( "Wrote ten words\n" );

fclose( stream );

Выходные данные
Output

Wrote ten words

См. также
Потоковый ввод-вывод

_getw
_query_new_handler
Статья • 03.04.2023

Возвращает адрес текущей new подпрограммы обработчика.

Синтаксис
C

_PNH _query_new_handler(

void

);

Возвращаемое значение
Возвращает адрес текущей new подпрограммы обработчика, заданный
параметром _set_new_handler .

Комментарии
Функция C++ _query_new_handler возвращает адрес текущей функции обработки
исключений, заданной функцией C++ _set_new_handler . _set_new_handler
используется для указания функции обработки исключений, которая позволяет
получить контроль, если new оператору не удается выделить память.
Дополнительные сведения см. в описании new и delete операторах в справочнике
по языку C++.

Требования
Подпрограмма Обязательный заголовок

_query_new_handler <new.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.
См. также раздел
Выделение памяти

free
_query_new_mode
Статья • 03.04.2023

Возвращает целое число, указывающее режим обработчика new , заданный


параметром _set_new_mode для malloc .

Синтаксис
C

int _query_new_mode(

void

);

Возвращаемое значение
Возвращает текущий new режим обработчика, а именно 0 или 1 для malloc .
Возвращаемое значение 1 указывает, что при сбое выделения памяти вызывает
подпрограмму new обработчика; возвращаемое значение 0 указывает на то, malloc
что это не так.

Комментарии
Функция C++ _query_new_mode возвращает целое число, указывающее new режим
обработчика, заданный функцией C++ _set_new_mode для malloc. Режим new
обработчика указывает, вызывает ли подпрограмму new обработчика при сбое
выделения памяти, malloc как задано параметром _set_new_handler. По умолчанию
malloc не вызывает подпрограмму обработчика new при сбое. Вы можете

использовать для _set_new_mode переопределения этого поведения, чтобы при


сбое malloc вызывать подпрограмму new обработчика так же, как new оператор
делает, когда ему не удается выделить память. Дополнительные сведения см. в
разделе о новых и удаленных операторах справочника по языку C++.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_query_new_mode <new.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


Выделение памяти

calloc

free

realloc

_query_new_handler
quick_exit
Статья • 03.04.2023

Приводит к завершению работы программы в обычном режиме.

Синтаксис
C

__declspec(noreturn) void quick_exit(

int status

);

Параметры
status

Код состояния, возвращаемый средой размещения.

Возвращаемое значение
Функция quick_exit не может вернуться к вызывающей объекту.

Комментарии
Функция quick_exit приводит к завершению работы программы в обычном
режиме. Она не вызывает функции, зарегистрированные atexit , _onexit или
обработчики сигналов, зарегистрированные функцией signal . Поведение не
определено, если quick_exit вызывается несколько раз или если также вызывается
функция exit .

Функция quick_exit вызывает в порядке поступления (LIFO) функции,


зарегистрированные at_quick_exit , за исключением функций, которые уже были
вызваны на тот момент, когда функция была зарегистрирована. Поведение не
определено, если longjmp вызов выполняется во время вызова
зарегистрированной функции, которая завершает вызов функции.

После вызова зарегистрированных функций quick_exit вызывает _Exit с


использованием значения status , чтобы вернуть управление среде размещения.
Требования
Подпрограмма Обязательный заголовок

quick_exit <process.h> или <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

См. также раздел


Управление процессами и средой

abort

atexit

_execФункции , _wexec

exit, _Exit, _exit

_onexit, _onexit_m

_spawnФункции , _wspawn

system, _wsystem
qsort
Статья • 03.04.2023

Выполняет быструю сортировку. Доступна более безопасная версия этой функции;


см. раздел qsort_s.

Синтаксис
C

void qsort(

void *base,

size_t number,

size_t width,

int (__cdecl *compare )(const void *, const void *)

);

Параметры
base

Начало целевого массива.

number

Размер массива в элементах.

width

Размер элементов в байтах.

compare

Указатель на пользовательскую подпрограмму, которая сравнивает два элемента


массива и возвращает значение, показывающее, как соотносятся их значения.

Комментарии
Функция qsort реализует алгоритм быстрой сортировки для сортировки массива
из number элементов, каждый из которых имеет размер width байт. Аргумент base
является указателем на начало сортируемого массива. Функция qsort
перезаписывает этот массив с использованием отсортированных элементов.

Во время сортировки функция qsort вызывает подпрограмму compare один или


несколько раз и передает указатели на два элемента массива при каждом вызове.
Если compare указано, что два элемента одинаковы, их порядок в результирующем
отсортированном массиве не указан.

compare( (void *) & elem1, (void *) & elem2 );

Подпрограмма сравнивает элементы и возвращает одно из следующих значений.

Сравнение возвращаемого значения функции Описание

<0 elem1 меньше elem2

0 elem1 эквивалентен elem2

>0 elem1 больше elem2

Массив сортируется по возрастанию, как определено функцией сравнения. Для


сортировки массива по убыванию измените смысл значений "больше" и "меньше"
на противоположный в функции сравнения.

Эта функция проверяет свои параметры. Если compare или number нет NULL , или
base если ненулевое NULL number значение или width меньше нуля, вызывается

обработчик недопустимых параметров, как описано в разделе "Проверка


параметров". Если выполнение разрешено продолжать, функция возвращает и
errno имеет значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

qsort <stdlib.h> и <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_qsort.c

// arguments: every good boy deserves favor

/* This program reads the command-line

* parameters and uses qsort to sort them. It

* then displays the sorted arguments.

*/

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

int compare( const void *arg1, const void *arg2 );

int main( int argc, char **argv )

int i;

/* Eliminate argv[0] from sort: */

argv++;

argc--;

/* Sort remaining args using Quicksort algorithm: */

qsort( (void *)argv, (size_t)argc, sizeof( char * ), compare );

/* Output sorted list: */

for( i = 0; i < argc; ++i )

printf( " %s", argv[i] );

printf( "\n" );

int compare( const void *arg1, const void *arg2 )

/* Compare all of both strings: */

return _stricmp( * ( char** ) arg1, * ( char** ) arg2 );

Output

boy deserves every favor good

См. также раздел


Сортировка и поиск

bsearch

_lsearch
qsort_s
Статья • 03.04.2023

Выполняет быструю сортировку. Версия qsort с усовершенствованиями


безопасности, как описано в функциях безопасности в CRT.

Синтаксис
C

void qsort_s(

void *base,

size_t num,

size_t width,

int (__cdecl *compare )(void *, const void *, const void *),

void * context

);

Параметры
base

Начало целевого массива.

number

Размер массива в элементах.

width

Размер элементов в байтах.

compare

Функция сравнения. Первый аргумент — это указатель context . Второй аргумент


— указатель на ключ key для поиска. Третий аргумент — указатель на элемент
массива, который будет сравниваться со значением key .

context

Указатель на контекст, который может быть любым объектом, доступ к которому


необходим подпрограмме compare .

Комментарии
Функция qsort_s реализует алгоритм быстрой сортировки для сортировки массива
из number элементов, каждый из которых имеет размер width байт. Аргумент base
является указателем на начало сортируемого массива. Функция qsort_s
перезаписывает этот массив отсортированными элементами. Аргумент compare
является указателем на пользовательскую подпрограмму, которая сравнивает два
элемента массива и возвращает значение, показывающее, как соотносятся их
значения. Во время сортировки функция qsort_s вызывает подпрограмму compare
один или несколько раз, передавая указатели на два элемента массива при каждом
вызове:

compare( context, (void *) & elem1, (void *) & elem2 );

Подпрограмма должна сравнивать элементы, а затем возвращать одно из


следующих значений:

Возвращаемое значение Описание

<0 элемент 1 меньше, чем элемент 2

0 элемент 1 , эквивалентный элементу 2

>0 элемент 1 больше элемента 2

Массив сортируется по возрастанию, как определено функцией сравнения. Для


сортировки массива по убыванию измените смысл значений "больше" и "меньше"
на противоположный в функции сравнения.

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


недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение разрешено продолжать, функция возвращается и errno имеет
значение EINVAL . Дополнительные сведения см. в разделе errno, а
_doserrno_sys_errlistтакже ._sys_nerr

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Условия ошибок

ключ base; compare num width errno


ключ base; compare num width errno

NULL any any any any EINVAL

any NULL any != 0 any EINVAL

any any any any <= 0 EINVAL

any any NULL any any EINVAL

Функция qsort_s действует так же, как и функция qsort , но имеет параметр
context и задает значение параметра errno . Параметр context позволяет
функциям сравнения использовать указатель объекта для доступа к
функциональным возможностям объекта или другим сведениям, недоступным
через указатель элемента. Добавление параметра делает qsort_s более
безопасным, так как context его можно использовать, чтобы избежать ошибок
повторного context входа, введенных с помощью статических переменных, чтобы
сделать общую информацию доступной compare для функции.

Требования
Подпрограмма Обязательный заголовок

qsort_s <stdlib.h> и <search.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Все версии библиотек среды выполнения C.

Пример
В следующем примере показано, как использовать context параметр в qsort_s
функции. Параметр context упрощает выполнение потокобезопасных сортировок.
Вместо статических переменных, которые необходимо синхронизировать для
обеспечения потокобезопасности, можно передавать разные параметры context
для каждой сортировки. В этом примере в качестве параметра context
используется объект языкового стандарта.

C++

// crt_qsort_s.cpp

// compile with: /EHsc /MT

#include <stdlib.h>

#include <stdio.h>

#include <search.h>

#include <process.h>

#include <locale.h>

#include <locale>

#include <windows.h>

using namespace std;

// The sort order is dependent on the code page. Use 'chcp' at the

// command line to change the codepage. When executing this application,

// the command prompt codepage must match the codepage used here:

#define CODEPAGE_850

#ifdef CODEPAGE_850

// Codepage 850 is the OEM codepage used by the command line,

// so \x00e1 is the German Sharp S in that codepage and \x00a4

// is the n tilde.

char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",

"weit" };

char *array2[] = { "Espa\x00a4ol", "Espa\x00a4" "a", "espantado" };

char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.850"

#define SPANISH_LOCALE "Spanish_Spain.850"

#define ENGLISH_LOCALE "English_US.850"

#endif

#ifdef CODEPAGE_1252

// If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df

// for the German Sharp S and \x001f for the n tilde.

char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",

"weit" };

char *array2[] = { "Espa\x00f1ol", "Espa\x00f1" "a", "espantado" };

char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.1252"

#define SPANISH_LOCALE "Spanish_Spain.1252"

#define ENGLISH_LOCALE "English_US.1252"

#endif

// The context parameter lets you create a more generic compare.

// Without this parameter, you would have stored the locale in a

// static variable, thus making sort_array vulnerable to thread

// conflicts.

int compare( void *pvlocale, const void *str1, const void *str2)

char s1[256];

char s2[256];

strcpy_s(s1, 256, *(char**)str1);

strcpy_s(s2, 256, *(char**)str2);

_strlwr_s( s1, sizeof(s1) );

_strlwr_s( s2, sizeof(s2) );

locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

return use_facet< collate<char> >(loc).compare(s1,

&s1[strlen(s1)], s2, &s2[strlen(s2)]);

void sort_array(char *array[], int num, locale &loc)

qsort_s(array, num, sizeof(char*), compare, &loc);

void print_array(char *a[], int c)

for (int i = 0; i < c; i++)

printf("%s ", a[i]);

printf("\n");

void sort_german(void * Dummy)

sort_array(array1, 6, locale(GERMAN_LOCALE));

void sort_spanish(void * Dummy)

sort_array(array2, 3, locale(SPANISH_LOCALE));

void sort_english(void * Dummy)

sort_array(array3, 3, locale(ENGLISH_LOCALE));

int main( )

int i;

HANDLE threads[3];

printf("Unsorted input:\n");

print_array(array1, 6);

print_array(array2, 3);

print_array(array3, 3);

// Create several threads that perform sorts in different

// languages at the same time.

threads[0] = reinterpret_cast<HANDLE>(

_beginthread( sort_german , 0, NULL));

threads[1] = reinterpret_cast<HANDLE>(

_beginthread( sort_spanish, 0, NULL));

threads[2] = reinterpret_cast<HANDLE>(

_beginthread( sort_english, 0, NULL));

for (i = 0; i < 3; i++)

if (threads[i] == reinterpret_cast<HANDLE>(-1))

printf("Error creating threads.\n");

exit(1);

// Wait until all threads have terminated.

WaitForMultipleObjects(3, threads, true, INFINITE);

printf("Sorted output: \n");

print_array(array1, 6);

print_array(array2, 3);

print_array(array3, 3);

Пример полученных результатов


Output

Unsorted input:

weiß weis annehmen weizen Zeit weit

Español España espantado

table tableux tablet

Sorted output:

annehmen weiß weis weit weizen Zeit

España Español espantado

table tablet tableux

См. также раздел


Сортировка и поиск

bsearch_s

_lsearch_s

qsort
raise
Статья • 03.04.2023

Отправляет сигнал выполняемой программе.

7 Примечание

Не используйте этот метод для завершения работы приложения Microsoft


Store, за исключением сценариев тестирования или отладки. Программные
или пользовательские способы закрытия приложения Из Магазина не
допускаются в соответствии с политиками Microsoft Store. Дополнительные
сведения см. в статье Жизненный цикл приложения UWP.

Синтаксис
C

int raise(

int sig

);

Параметры
sig

Сигнал, который требуется инициализировать.

Возвращаемое значение
В случае успеха raise возвращает 0. В противном случае возвращается ненулевое
значение.

Комментарии
Функция raise отправляет sig выполняющейся программе. Если в предыдущем
вызове была signal установлена функция обработки сигналов для sig , raise эта
функция выполняется. Если функция обработчика не установлена, выполняется
действие по умолчанию, связанное со значением sig сигнала, как показано ниже.
Сигнал Описание Поведение по умолчанию

SIGABRT Аварийное завершение Завершает вызывающую программу с


кодом выхода 3

SIGFPE Ошибка с плавающей запятой Завершает вызывающую программу

SIGILL Недопустимая инструкция Завершает вызывающую программу

SIGINT Прерывание CTRL+C Завершает вызывающую программу

SIGSEGV Недопустимый доступ к хранилищу Завершает вызывающую программу

SIGTERM Запрос на прекращение, Игнорирует сигнал


отправленный в программу

Если аргумент не является допустимым сигналом, как указано выше, вызывается


обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если ошибка не обработана, функция задает для параметра errno
значение EINVAL и возвращает ненулевое значение.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

raise <signal.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Управление процессами и средой

abort

signal
rand
Статья • 03.04.2023

Создает псевдослучайное число. Доступна более программная безопасная версия


этой функции; см. раздел rand_s. Числа, rand созданные не являются
криптографически безопасными. Для более криптографически безопасного
создания случайных чисел используйте rand_s или функции, объявленные в
стандартной библиотеке C++.<random>

Синтаксис
C

int rand(void);

Возвращаемое значение
Функция rand возвращает псевдослучайное число, как описано выше. Ошибка не
возвращается.

Комментарии
Функция rand возвращает псевдослучайное целое число в диапазоне от 0 до
RAND_MAX (32767). srand Используйте функцию для заполнения генератора

псевдослучайных чисел перед вызовом rand .

Функция rand создает известную последовательность и не подходит для


использования в качестве криптографической функции. Для более
криптографически безопасного создания случайных чисел используйте rand_s или
функции, объявленные в стандартной библиотеке C++.<random>

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

rand <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_rand.c

// This program seeds the random-number generator

// with a fixed seed, then exercises the rand function

// to demonstrate generating random numbers, and

// random numbers in a specified range.

#include <stdlib.h> // rand(), srand()

#include <stdio.h> // printf()

void SimpleRandDemo(int n)

// Print n random numbers.

for (int i = 0; i < n; i++)

printf(" %6d\n", rand());

void RangedRandDemo(int range_min, int range_max, int n)

// Generate random numbers in the interval [range_min, range_max],


inclusive.

for (int i = 0; i < n; i++)

// Note: This method of generating random numbers in a range isn't


suitable for

// applications that require high quality random numbers.

// rand() has a small output range [0,32767], making it unsuitable


for

// generating random numbers across a large range using the method


below.

// The approach below also may result in a non-uniform distribution.

// More robust random number functionality is available in the C++


<random> header.

// See https://learn.microsoft.com/cpp/standard-library/random

int r = ((double)rand() / RAND_MAX) * (range_max - range_min) +


range_min;

printf(" %6d\n", r);

int main(void)

// Seed the random-number generator with a fixed seed so that

// the numbers will be the same every time we run.

srand(1792);

printf("Simple random number demo ====\n\n");

SimpleRandDemo(10);

printf("\nRandom number in a range demo ====\n\n");

RangedRandDemo(-100, 100, 100000);

}```

```Output

Simple random number demo ====

5890

1279

19497

1207

11420

3377

15317

29489

9716

23323

Random number in a range demo ====

-82

-46

50

77

-47

32

76

-13

-58

90

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
srand

rand_s

Библиотека C++ <random>


rand_s
Статья • 03.04.2023

Создает псевдослучайное число. Эта функция является более безопасной версией


функции randс улучшениями безопасности, описанными в разделе Функции
безопасности в CRT.

Синтаксис
C

errno_t rand_s(unsigned int* randomValue);

Параметры
randomValue

Указатель на целое число для хранения созданного значения.

Возвращаемое значение
Ноль в случае успешного выполнения; в противном случае — код ошибки. Если
входной указатель _randomValue_ является указателем NULL , функция вызывает
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, функция возвращает
EINVAL и устанавливает для параметра errno значение EINVAL . Если функция

завершается сбоем по какой-либо другой причине, *_randomValue_ устанавливается


значение 0.

Комментарии
Функция rand_s записывает псевдослучайное целое число в диапазоне от 0 до
UINT_MAX в указатель ввода. Функция rand_s использует операционную систему для

создания криптографически безопасных случайных чисел. Он не использует


начальное значение, созданное функцией srand , и не влияет на
последовательность случайных чисел, используемую rand.

Константа _CRT_RAND_S должна быть определена перед включением stdlib.h


заголовка rand_s функции, как показано в следующем примере:
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

#define _CRT_RAND_S

#include <stdlib.h>

rand_s RtlGenRandom зависит от API, который доступен только в Windows XP и

более поздних версиях.

Требования
Подпрограмма Обязательный заголовок

rand_s <stdlib.h>

Дополнительные сведения см. в разделе Совместимость.

Пример
C

// crt_rand_s.c

// This program illustrates how to generate random

// integer or floating point numbers in a specified range.

// Remember to define _CRT_RAND_S before you include

// stdlib.h.

#define _CRT_RAND_S

#include <stdlib.h>

#include <stdio.h>

#include <limits.h>

int main( void )

int i;

unsigned int number;

double max = 100.0;

errno_t err;

// Display 10 random integers in the range [ 1,10 ].

for( i = 0; i < 10;i++ )

err = rand_s( &number );

if (err != 0)

printf_s("The rand_s function failed!\n");

printf_s( " %u\n", (unsigned int) ((double)number /

((double) UINT_MAX + 1 ) * 10.0) + 1);

printf_s("\n");

// Display 10 random doubles in [0, max).

for (i = 0; i < 10;i++ )

err = rand_s( &number );

if (err != 0)

printf_s("The rand_s function failed!\n");

printf_s( " %g\n", (double) number /

((double) UINT_MAX + 1) * max );

Пример полученных результатов


Output

10

32.6617

29.4471

11.5413

6.41924

20.711

60.2878

61.0094

20.1222

80.9192

65.0712

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
rand

srand
read
Статья • 03.04.2023

Имя read функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _read функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _read . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_read
Статья • 03.04.2023

Считывает данные из файла.

Синтаксис
C

int _read(

int const fd,

void * const buffer,


unsigned const buffer_size

);

Параметры
fd

Дескриптор файла, ссылающийся на открытый файл.

buffer

Место хранения данных.

buffer_size

Максимальное число байтов для чтения.

Возвращаемое значение
_read возвращает число прочитанных байтов, которое может быть меньше, чем

buffer_size buffer_size если в файле осталось меньше байтов или файл был
открыт в текстовом режиме. В текстовом режиме каждая пара \r\n веб-канала
возврата каретки заменяется одним символом \n веб-канала строки. В
возвращаемом значении учитывается только символ однострочного веб-канала.
Замена не влияет на указатель файла.

Если функция пытается прочитать конечную часть файла, она возвращает 0. Если
fd недопустимый, файл не открыт для чтения или заблокирован, вызывается

обработчик недопустимых параметров, как описано в разделе "Проверка


параметров". Если выполнение может быть продолжено, функция возвращает -1 и
устанавливает errno в значение EBADF .
Если buffer имеет значение NULL или если buffer_size > INT_MAX вызывается
обработчик недопустимых параметров. Если продолжение выполнения разрешено,
функции возвращают значение −1 и задают для errno значение EINVAL .

Дополнительные сведения об этом и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция _read считывает максимум байтов buffer_size из buffer файла,
связанного с fd . Операция чтения начинается с текущего положения указателя
файла, связанного с данным файлом. После операции чтения указатель файла
указывает на следующий непрочитанный символ.

Если файл был открыт в текстовом режиме, чтение завершается, когда _read
встречает символ CTRL + Z, который интерпретируется как индикатор конца файла.
Используется для _lseek очистки индикатора конца файла.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_read <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_read.c

/* This program opens a file named crt_read.txt

* and tries to read 60,000 bytes from

* that file using _read. It then displays the

* actual number of bytes read.

*/

#include <fcntl.h> /* Needed only for _O_RDWR definition */

#include <io.h>

#include <stdlib.h>

#include <stdio.h>

#include <share.h>

char buffer[60000];

int main( void )

int fh, bytesread;

unsigned int nbytes = 60000;

/* Open file for input: */

if ( _sopen_s( &fh, "crt_read.txt", _O_RDONLY, _SH_DENYNO, 0 ))

perror( "open failed on input file" );

exit( 1 );

/* Read in input: */

if (( bytesread = _read( fh, buffer, nbytes )) <= 0 )

perror( "Problem reading file" );

else

printf( "Read %u bytes from file\n", bytesread );

_close( fh );

Входные данные: crt_read.txt


Input

Line one.

Line two.

Вывод
Output

Read 19 bytes from file

См. также
Низкоуровневый ввод-вывод

_creat, _wcreat

fread

_open, _wopen

_write\
realloc
Статья • 03.04.2023

Повторное выделение блоков памяти.

Синтаксис
C

void *realloc(

void *memblock,

size_t size

);

Параметры
memblock

Указатель на ранее выделенный блок памяти.

size

Новый размер в байтах.

Возвращаемое значение
realloc возвращает указатель void в перераспределенном (и, возможно,
перемещенном) блоке памяти.

Если доступной памяти недостаточно для расширения блока до заданного размера,


исходный блок остается без изменений и NULL возвращается.

Если size равен нулю, то блок, на который указывает memblock , освобождается;


возвращается значение NULL , memblock по-прежнему указывает на освобожденный
блок.

Возвращаемое значение указывает на дисковое пространство, подходящее для


хранения объектов любого типа. Чтобы получить указатель на тип, отличный от
void , используйте приведение типов для возвращаемого значения.

Комментарии
7 Примечание

realloc Не был обновлен для реализации поведения C17, так как новое
поведение несовместимо с операционной системой Windows.

Функция realloc изменяет размер выделенного блока памяти. Аргумент memblock


указывает на начало блока памяти. Если параметр memblock имеет значение NULL ,
функция realloc ведет себя так же, как и функция malloc , выделяя новый блок
размером size байтов. Если memblock параметр не NULL имеет значение , это
должен быть указатель, возвращенный предыдущим вызовом calloc , malloc или
realloc .

Аргумент size указывает новый размер блока в байтах. Содержимое блока в


пределах наименьшего из нового и старого размеров остается неизменным, хотя
новый блок может находиться в другом расположении. Так как новый блок может
находиться в новом расположении памяти, указатель, возвращаемый параметром
realloc , не гарантируется, что он будет указателем, передаваемым memblock через

аргумент . realloc не обнуляет только что выделенную память при росте буфера.

Функция realloc задает для параметра errno значение ENOMEM , если выделение
памяти завершается сбоем или количество запрошенной памяти превышает
_HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделе errno,

_doserrno, _sys_errlistи _sys_nerr.

realloc вызывает malloc , чтобы использовать функцию C++ _set_new_mode для


установки нового режима обработчика. Новый режим обработки указывает,
должна ли функция malloc при сбое вызывать новую подпрограмму обработчика,
заданную функцией _set_new_handler. По умолчанию malloc не вызывает новую
подпрограмму обработчика при сбое выделения памяти. Можно переопределить
это поведение по умолчанию, чтобы в случае сбоя предоставления памяти
функцией realloc функция malloc вызывала новую подпрограмму обработчика
таким же образом, как это делает оператор new при сбое по той же причине.
Чтобы переопределить значение по умолчанию, вызовите

_set_new_mode(1);

в начале программы, или связать с NEWMODE. OBJ (см. раздел Параметры ссылки).
Если приложение связано с отладочной версией библиотек времени выполнения
C, realloc разрешается в _realloc_dbg. Дополнительные сведения об управлении
кучей в процессе отладки см. в разделе Куча отладки CRT.

realloc помечается __declspec(noalias) и __declspec(restrict) означает, что


функция гарантированно не будет изменять глобальные переменные, а
возвращаемый указатель не является псевдонимом. Дополнительные сведения см.
в разделах noalias и restrict.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

realloc <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_realloc.c

// This program allocates a block of memory for

// buffer and then uses _msize to display the size of that

// block. Next, it uses realloc to expand the amount of

// memory used by buffer and then calls _msize again to

// display the new amount of memory allocated to buffer.

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

int main( void )

long *buffer, *oldbuffer;

size_t size;

if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )

exit( 1 );

size = _msize( buffer );

printf_s( "Size of block after malloc of 1000 longs: %u\n", size );

// Reallocate and show new size:

oldbuffer = buffer; // save pointer in case realloc fails

if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))

== NULL )

free( oldbuffer ); // free original block

exit( 1 );

size = _msize( buffer );

printf_s( "Size of block after realloc of 1000 more longs: %u\n",

size );

free( buffer );

exit( 0 );

Output

Size of block after malloc of 1000 longs: 4000

Size of block after realloc of 1000 more longs: 8000

См. также раздел


Выделение памяти

calloc

free

malloc
_realloc_dbg
Статья • 03.04.2023

Перераспределяет указанный блок памяти в куче, перемещая его и (или) изменяя


его размер (только для отладочной версии).

Синтаксис
C

void *_realloc_dbg(

void *userData,

size_t newSize,

int blockType,

const char *filename,

int linenumber

);

Параметры
userData

Указатель на ранее выделенный блок памяти.

newSize

Запрошенный размер повторно выделенного блока (в байтах).

blockType

Запрошенный тип повторно выделенного блока (в байтах): _CLIENT_BLOCK или


_NORMAL_BLOCK .

filename

Указатель на имя исходного файла, запрашивающего realloc операцию, или NULL .

linenumber

Номер строки в исходном файле, в котором была запрошена realloc операция,


или NULL .

Параметры filename и linenumber доступны только при _realloc_dbg явном вызове


или определении _CRTDBG_MAP_ALLOC константы препроцессора.

Возвращаемое значение
При успешном завершении эта функция возвращает указатель на пользовательную
часть перераспределенного блока памяти, вызывает новую функцию обработчика
или возвращает . NULL Полное описание поведения возвращения см. в следующем
разделе "Примечания". Дополнительные сведения об использовании новой
функции обработчика см. в realloc этой функции.

Комментарии
_realloc_dbg — отладочная версия realloc функции. Если _DEBUG параметр не

определен, каждый вызов _realloc_dbg сводится к вызову realloc . И realloc , и


_realloc_dbg выполняют перераспределение блока памяти в основной куче,
однако _realloc_dbg включает различные возможности отладки: буферы на обеих
сторонах пользовательской части блока для тестирования утечек, параметр типа
блока для отслеживания конкретных типов выделения, а также сведения о
filename / linenumber для определения источника запросов на выделение.

_realloc_dbg повторно выделяет указанный блок памяти, добавив немного больше


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

_realloc_dbg задает для errno значение ENOMEM в случае сбоя выделения памяти

или если необходимый объем памяти (включая ранее упомянутую нагрузку)


превышает _HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделе
errno, _doserrno, _sys_errlistи _sys_nerr.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о типах блоков выделения и их использовании см. в разделе Типы
блоков в отладочной куче. Сведения о различиях между стандартными функциями
кучи и отладочными версиями см. в разделе Отладка версий функций выделения
кучи.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_realloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Пример
См. пример в _msize_dbg статье.

См. также раздел


Подпрограммы отладки

_malloc_dbg
_recalloc
Статья • 03.04.2023

Комбинация realloc  и calloc . Перераспределяет массив в памяти и


инициализирует его элементы значением 0.

Синтаксис
C

void *_recalloc(

void *memblock

size_t num,

size_t size

);

Параметры
memblock

Указатель на ранее выделенный блок памяти.

number

Число элементов.

size

Длина каждого элемента в байтах.

Возвращаемое значение
_recalloc возвращает указатель void в перераспределенном (и, возможно,
перемещенном) блоке памяти.

Если доступной памяти недостаточно для расширения блока до заданного размера,


исходный блок остается без изменений и NULL возвращается.

Если запрошенный размер равен нулю, то блок, на который указывает memblock ,


освобождается; возвращается значение NULL , memblock по-прежнему указывает на
освобожденный блок.

Возвращаемое значение указывает на дисковое пространство, подходящее для


хранения объектов любого типа. Чтобы получить указатель на тип, отличный от
void , используйте приведение типов для возвращаемого значения.

Комментарии
Функция _recalloc изменяет размер выделенного блока памяти. Аргумент memblock
указывает на начало блока памяти. Если memblock имеет значение NULL , _recalloc
то ведет себя так же, как calloc и и выделяет новый блок байтов number * size .
Каждый элемент инициализируется значением 0. Если memblock параметр не
NULL имеет значение , это должен быть указатель, возвращенный предыдущим

вызовом calloc , mallocили realloc.

Так как новый блок может находиться в новом расположении памяти, указатель,
возвращаемый параметром _recalloc , не гарантируется, что он будет указателем,
передаваемым memblock через аргумент .

Функция _recalloc задает для параметра errno значение ENOMEM , если выделение
памяти завершается сбоем или количество запрошенной памяти превышает
_HEAP_MAXREQ . Сведения об этом и других кодах ошибок см. в разделе errno,
_doserrno, _sys_errlistи _sys_nerr.

recalloc вызывает realloc , чтобы использовать функцию C++ _set_new_mode для


установки нового режима обработчика. Новый режим обработки указывает,
должна ли функция realloc при сбое вызывать новую подпрограмму обработчика,
заданную функцией _set_new_handler. По умолчанию realloc не вызывает новую
подпрограмму обработчика при сбое выделения памяти. Можно переопределить
это поведение по умолчанию, чтобы в случае сбоя предоставления памяти
функцией _recalloc функция realloc вызывала новую подпрограмму обработчика
таким же образом, как это делает оператор new при сбое по той же причине.
Чтобы переопределить значение по умолчанию, вызовите

_set_new_mode(1);

на ранних этапах программы или компонуйте с использованием NEWMODE.OBJ.

Если приложение связано с отладочной версией библиотек времени выполнения


C, _recalloc разрешается в _recalloc_dbg. Дополнительные сведения об управлении
кучей в процессе отладки см. в разделе Куча отладки CRT.
_recalloc помечается __declspec(noalias) и __declspec(restrict) означает, что

функция гарантированно не будет изменять глобальные переменные, а


возвращаемый указатель не является псевдонимом. Дополнительные сведения см.
в разделах noalias и restrict.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_recalloc <stdlib.h> и <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Выделение памяти

_recalloc_dbg

_aligned_recalloc

_aligned_offset_recalloc

free

Параметры ссылок
_recalloc_dbg
Статья • 03.04.2023

Повторно выделяет массив и инициализирует его элементы нулями (только


отладочная версия).

Синтаксис
C

void *_recalloc_dbg(

void *userData,

size_t num,

size_t size,

int blockType,

const char *filename,

int linenumber

);

Параметры
userData

Указатель на ранее выделенный блок памяти.

number

Запрошенное число блоков памяти.

size

Запрошенный размер каждого блока памяти (байт).

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

Сведения о типах блоков выделения и их использовании см. в разделе Типы


блоков в отладочной куче.

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Параметры filename и linenumber доступны только при _recalloc_dbg явном


вызове или определении _CRTDBG_MAP_ALLOC константы препроцессора.

Возвращаемое значение
При успешном завершении эта функция возвращает указатель на пользовательную
часть перераспределенного блока памяти, вызывает новую функцию обработчика
или возвращает . NULL Полное описание поведения возвращения см. в следующем
разделе "Примечания". Дополнительные сведения об использовании новой
функции обработчика см. в _recalloc этой функции.

Комментарии
_recalloc_dbg — отладочная версия _recalloc функции. Если _DEBUG параметр не
определен, каждый вызов _recalloc_dbg сводится к вызову _recalloc . И _recalloc ,
и _recalloc_dbg выполняют перераспределение блока памяти в основной куче,
однако _recalloc_dbg включает различные возможности отладки: буферы на обеих
сторонах пользовательской части блока для тестирования утечек, параметр типа
блока для отслеживания конкретных типов выделения, а также сведения о
filename / linenumber для определения источника запросов на выделение.

_recalloc_dbg перераспределяет указанный блок памяти, добавив немного больше


пространства, чем запрошено ( number * size ), что может быть больше или меньше
размера первоначально выделенного блока памяти. Дополнительное пространство
используется диспетчером кучи отладки для связывания блоков памяти отладки и
предоставления приложению сведений о заголовке отладки и перезаписи
буферов. Перераспределение может привести как к перемещению исходного
блока памяти в другое место в куче, так и к изменению размера блока памяти.
Пользовательская часть блока заполняется значением 0xCD, а все буферы
перезаписи — значением 0xFD.

_recalloc_dbg задает для errno значение ENOMEM в случае сбоя выделения памяти;

значение EINVAL возвращается, если необходимый объем памяти (включая ранее


упомянутую нагрузку) превышает _HEAP_MAXREQ . Сведения об этом и других кодах
ошибок см. в разделе errno, _doserrno, _sys_errlistи _sys_nerr.

Сведения о выделении, инициализации и управлении блоками памяти в


отладочной версии базовой кучи см. в разделе Сведения об отладочной куче CRT.
Сведения о различиях между стандартными функциями кучи и отладочными
версиями см. в разделе Отладка версий функций выделения кучи.

Требования
Подпрограмма Обязательный заголовок

_recalloc_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

См. также раздел


Подпрограммы отладки
remainder , remainderf , remainderl
Статья • 03.04.2023

Вычисляет остаток от частного двух чисел с плавающей запятой, округленного до


ближайшего целого значения.

Синтаксис
C

double remainder( double x, double y );

float remainderf( float x, float y );

long double remainderl( long double x, long double y );

#define remainder(X, Y) // Requires C11 or higher

float remainder( float x, float y ); /* C++ only */

long double remainder( long double x, long double y ); /* C++ only */

Параметры
x

Числитель.

Знаменатель.

Возвращаемое значение
Остаток от деления x / y в виде числа с плавающей запятой. Если значение y
равно 0,0, функция remainder возвращает NaN (не число) без вызова прерывания.
Сведения о представлении спокойного NaN printf семьей см. в разделе printf, ,
_printf_l, wprintf_wprintf_l.

Комментарии
Функции remainder вычисляют оставшуюся часть r x / y с плавающей запятой
таким образом, что x = n * y + r , где n находится целое число, ближайшее к
значению x / y и n даже когда |n - x / y| = 1/2 . Если r = 0 имеет тот же знак, r
что и x .
Поскольку C++ допускает перегрузку, можно вызывать перегрузки remainder ,
которые принимают и возвращают значения float или long double . В программе
C, если для вызова этой функции не используется <макрос tgmath.h> , remainder
всегда принимает два double аргумента и возвращает значение double .

При использовании <макроса tgmath.h> remainder() тип аргумента определяет,


какая версия функции выбрана. Дополнительные сведения см. в разделе
"Универсальный тип".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок Обязательный заголовок
(C) (C++)

remainder , remainderf , <math.h> <cmath> или <math.h>


remainderl

remainder Макрос <tgmath.h>

Сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_remainder.c

// This program displays a floating-point remainder.

#include <math.h>

#include <stdio.h>

int main( void )

double w = -10.0, x = 3.0, z;

z = remainder(w, x);

printf("The remainder of %.2f / %.2f is %f\n", w, x, z);

Output
The remainder of -10.00 / 3.00 is -1.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ldiv, lldiv

imaxdiv

fmod, fmodf

remquo, remquof, remquol


remove , _wremove
Статья • 03.04.2023

Удалите файл.

Синтаксис
C

int remove(

const char *path

);

int _wremove(

const wchar_t *path

);

Параметры
path

Путь к файлу, который требуется удалить.

Возвращаемое значение
Каждая из этих функций возвращает 0, если файл был успешно удален. В
противном случае возвращается значение -1 и задает errno значение ,
указывающее EACCES , что путь указывает файл, доступный только для чтения,
указывает каталог или файл открыт, или указывает ENOENT , что имя файла или путь
не найдены.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrnoи


_sys_nerr_sys_errlist.

Комментарии
Функция remove удаляет файл, указанный параметром path . _wremove является
версией _remove расширенных символов; path аргументом _wremove является
строка расширенных символов. Поведение _wremove и _remove идентично в
противном случае. Чтобы можно было удалить файл, все дескрипторы файлов
должны быть закрыты.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tremove remove remove _wremove

Требования
Подпрограмма Обязательный заголовок

remove <stdio.h> или <io.h>

_wremove <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_remove.c

/* This program uses remove to delete crt_remove.txt */

#include <stdio.h>

int main( void )

if( remove( "crt_remove.txt" ) == -1 )

perror( "Could not delete 'CRT_REMOVE.TXT'" );

else

printf( "Deleted 'CRT_REMOVE.TXT'\n" );

Вход: crt_remove.txt
Input

This file will be deleted.

Пример полученных результатов


Output

Deleted 'CRT_REMOVE.TXT'

См. также раздел


Обработка файлов

_unlink, _wunlink
remquo , remquof , remquol
Статья • 03.04.2023

Вычисляет оставшуюся часть двух целых значений и сохраняет целочисленное


значение со знаком и приблизительной величиной кворента в параметре.

Синтаксис
C

double remquo( double numer, double denom, int* quo );

float remquof( float numer, float denom, int* quo );

long double remquol( long double numer, long double denom, int* quo );

#define remquo(X, Y, INT_PTR) // Requires C11 or higher

float remquo( float numer, float denom, int* quo ); /* C++ only */

long double remquo( long double numer, long double denom, int* quo ); /* C++
only */

Параметры
numer

Числитель.

denom

Знаменатель.

quo

Указатель на целое число для хранения значения, которое имеет знак и


приблизительное абсолютное значение частного.

Возвращаемое значение
Функция remquo возвращает остаток от деления x / y в виде числа с плавающей
запятой. Если значение y равно 0,0, функция remquo возвращает NaN (не число)
без вызова прерывания. Сведения о представлении спокойного NaN printf
семьей см. в разделе printf, , _printf_l, wprintf_wprintf_l.

Комментарии
Функция remquo вычисляет остаток x / y f с плавающей запятой таким образом,
что *, где n является целым числом, имеет тот же знак x , f что y * = + n f x и
абсолютное значение f меньше абсолютного y значения .

Поскольку C++ допускает перегрузку, можно вызывать перегрузки remquo , которые


принимают и возвращают значения типов float или long double . В программе C,
если для вызова этой функции не используется <макрос tgmath.h> , remquo всегда
принимает два double аргумента и возвращает значение double .

При использовании <макроса tgmath.h> remquo() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе "Универсальный
тип".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Компонент Обязательный заголовок (C) Обязательный заголовок (C++)

remquo , remquof , remquol <math.h> <cmath> или <math.h>

remquo Макрос <tgmath.h>

Сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_remquo.c

// This program displays a floating-point remainder.

#include <math.h>

#include <stdio.h>

int main( void )

double w = -10.0, x = 3.0, z;

int quo = 0;

z = remquo(w, x, &quo);

printf("The remainder of %.2f / %.2f is %f\n", w, x, z);

printf("Approximate signed quotient is %d\n", quo);

Output

The remainder of -10.00 / 3.00 is -1.000000

Approximate signed quotient is -3

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ldiv, lldiv

imaxdiv

fmod, fmodf

remainder, remainderf, remainderl


rename , _wrename
Статья • 03.04.2023

Переименовывает файл или каталог.

Синтаксис
C

int rename(

const char *oldname,


const char *newname

);

int _wrename(

const wchar_t *oldname,

const wchar_t *newname

);

Параметры
oldname

Указатель на старое имя.

newname

Указатель на новое имя.

Возвращаемое значение
Каждая из этих функций возвращает значение 0 в случае успешного выполнения.
При возникновении ошибки функция возвращает ненулевое значение и задает для
errno одно из следующих значений:

Значение Условие
errno

EACCES Файл или каталог, указанный параметром newname , уже существует или не
может быть создан (недопустимый путь); или oldname является каталогом и
newname указывает другой путь.

ENOENT Файл или путь, указанный параметром oldname не найден.

EINVAL Имя содержит недопустимые символы.


Другие возможные возвращаемые значения см. в разделе _doserrno, _errno,
syserrlistи _sys_nerr.

Комментарии
Функция rename переименовывает файл или каталог, указанный параметром
oldname , на имя, заданное параметром newname . Старое имя должно быть путем к

существующему файлу или каталогу. Новое имя не должно быть путем к


существующему файлу или каталогу. Вы можете использовать для rename
перемещения файла из одного каталога или устройства в другой, указав другой
путь в аргументе newname . Однако нельзя использовать для rename перемещения
каталога. Каталоги можно переименовать, но нельзя перемещать.

_wrename — это двухбайтовая версия _rename ; аргументы для _wrename


представляют собой двухбайтовые строки. Поведение _wrename и _rename
идентично в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_trename rename rename _wrename

Требования
Подпрограмма Обязательный заголовок

rename <io.h> или <stdio.h>

_wrename <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_renamer.c

/* This program attempts to rename a file named

* CRT_RENAMER.OBJ to CRT_RENAMER.JBO. For this operation

* to succeed, a file named CRT_RENAMER.OBJ must exist and

* a file named CRT_RENAMER.JBO must not exist.

*/

#include <stdio.h>

int main( void )

int result;

char old[] = "CRT_RENAMER.OBJ", new[] = "CRT_RENAMER.JBO";

/* Attempt to rename file: */

result = rename( old, new );

if( result != 0 )

printf( "Could not rename '%s'\n", old );

else

printf( "File '%s' renamed to '%s'\n", old, new );

Выходные данные
Output

File 'CRT_RENAMER.OBJ' renamed to 'CRT_RENAMER.JBO'

См. также
Обработка файлов
_resetstkoflw
Статья • 03.04.2023

Выполняет восстановление после переполнения стека.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _resetstkoflw( void );

Возвращаемое значение
Ненулевое значение, если функция завершается успешно; в противном случае —
ноль.

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

Если поток в приложении вызывает EXCEPTION_STACK_OVERFLOW исключение, поток


оставил свой стек в поврежденном состоянии. Это исключение отличается от
других исключений, таких как EXCEPTION_ACCESS_VIOLATION или
EXCEPTION_INT_DIVIDE_BY_ZERO , где стек не поврежден. При первой загрузке

программы для стека задается произвольная небольшая величина. Затем стек


увеличивается по требованию, чтобы отвечать потребностям потока. Рост по
запросу реализуется путем размещения страницы с PAGE_GUARD доступом в конце
текущего стека. Дополнительные сведения см. в разделе Создание страниц защиты.

Если код приводит к тому, что указатель стека указывает на адрес на этой странице,
возникает исключение и система выполняет три указанных ниже действия.

Снимает PAGE_GUARD защиту на странице защиты, чтобы поток смог считывать


и записывать данные в память.

Создает новую защитную страницу, расположенную на одну страницу ниже


последней.

Повторно выполняет инструкцию, которая вызвала исключение.

Таким образом система может увеличивать размер стека для потока


автоматически. Каждый поток в процессе имеет максимальный размер стека.
Размер стека задается во время компиляции параметром /STACK (Выделение стека)
или инструкцией STACKSIZE в .def файле проекта.

Если превышен максимальный размер стека, система выполняет три указанные


ниже действия.

Удаляет защиту PAGE_GUARD на защитной странице, как описано выше.

Пытается выделить новую защитную страницу после последней. Однако


выделение завершается сбоем, так как превышен максимальный размер
стека.

Создает исключение, чтобы поток смог его обработать в блоке исключения.

На этом этапе у стека больше нет страницы защиты. В следующий раз, когда
программа увеличивает стек до того места, где она записывает за пределы стека,
это приводит к нарушению доступа.

Во время восстановления после исключения переполнения стека вызовите


функцию _resetstkoflw для восстановления защитной страницы. Эту функцию
можно вызывать из основного тела __except блока или за его пределами __except .
Однако существуют некоторые ограничения на момент ее использования.
_resetstkoflw Не следует вызывать из:

выражения фильтра;

функции фильтра;

функции, вызываемой из функции фильтра;


блока catch .

блока __finally .

В этих точках стек еще недостаточно раскручен.

Исключения переполнения стека создаются как структурированные исключения, а


не исключения C++, поэтому _resetstkoflw не являются полезными в обычном
catch блоке, так как они не перехватывают исключение переполнения стека.

Однако если _set_se_translator используется для реализации структурированного


переводчика исключений, который создает исключения C++ (как показано во
втором примере), исключение переполнения стека приводит к возникновению
исключения C++, которое может обрабатываться блоком перехвата C++.

Небезопасно вызывать _resetstkoflw в блоке перехвата C++, который достигается


из исключения, создаваемого функцией структурированного переводчика
исключений. В этом случае пространство стека не освобождается, и указатель стека
не сбрасывается до тех пор, пока не находится за пределами блока catch, несмотря
на то, что деструкторы были вызваны для всех разрушаемых объектов перед
блоком catch. Эту функцию не следует вызывать, пока пространство стека не будет
освобождено и указатель стека не будет сброшен. Следовательно, она должна
вызываться только после выхода из блока catch. В блоке catch следует
использовать как можно меньше места в стеке. Переполнение стека, возникающее
в блоке catch, который сам пытается восстановиться после предыдущего
переполнения стека, невозможно восстановить. Это может привести к тому, что
программа перестанет отвечать, так как переполнение в блоке catch вызывает
исключение, которое само по себе обрабатывается тем же блоком catch.

Бывают ситуации, когда _resetstkoflw может завершиться сбоем даже при


использовании в правильном расположении, например в блоке __except . Может
не хватать места на стеке, чтобы выполнить без _resetstkoflw записи на
последнюю страницу стека, даже после очистки стека. _resetstkoflw Затем не
удается сбросить последнюю страницу стека в качестве страницы защиты и
возвращает 0, указывая на сбой. Безопасное использование этой функции должно
включать проверку возвращаемого значения, а не предполагать, что стек является
безопасным для использования.

Структурированная обработка исключений STATUS_STACK_OVERFLOW не


перехватывает исключение при компиляции приложения с /clr помощью (см.
раздел (компиляция/clr СРЕДЫ CLR)).
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_resetstkoflw <malloc.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки: Все версии функций библиотеки CRT.

Пример
В следующем примере показано рекомендуемое использование функции
_resetstkoflw .

// crt_resetstkoflw.c

// Launch program with and without arguments to observe

// the difference made by calling _resetstkoflw.

#include <malloc.h>

#include <stdio.h>

#include <windows.h>

void recursive(int recurse)

_alloca(2000);

if (recurse)

recursive(recurse);

// Filter for the stack overflow exception.

// This function traps the stack overflow exception, but passes

// all other exceptions through.

int stack_overflow_exception_filter(int exception_code)

if (exception_code == EXCEPTION_STACK_OVERFLOW)

// Do not call _resetstkoflw here, because

// at this point, the stack isn't yet unwound.

// Instead, signal that the handler (the __except block)

// is to be executed.

return EXCEPTION_EXECUTE_HANDLER;

else

return EXCEPTION_CONTINUE_SEARCH;

int main(int ac)

int i = 0;

int recurse = 1, result = 0;

for (i = 0 ; i < 10 ; i++)

printf("loop #%d\n", i + 1);

__try

recursive(recurse);

__except(stack_overflow_exception_filter(GetExceptionCode()))

// Here, it is safe to reset the stack.

if (ac >= 2)

puts("resetting stack overflow");

result = _resetstkoflw();

// Terminate if _resetstkoflw failed (returned 0)

if (!result)

return 3;

return 0;

Пример выходных данных без аргументов программы:

Output

loop #1

Программа перестает отвечать без выполнения дальнейших итераций.

С аргументами программы:

Output

loop #1

resetting stack overflow

loop #2

resetting stack overflow

loop #3

resetting stack overflow

loop #4

resetting stack overflow

loop #5

resetting stack overflow

loop #6

resetting stack overflow

loop #7

resetting stack overflow

loop #8

resetting stack overflow

loop #9

resetting stack overflow

loop #10

resetting stack overflow

Описание
В следующем примере показано рекомендуемое использование функции
_resetstkoflw в программе, в которой структурированные исключения

преобразуются в исключения C++.

Код
C++

// crt_resetstkoflw2.cpp

// compile with: /EHa

// _set_se_translator requires the use of /EHa

#include <malloc.h>

#include <stdio.h>

#include <windows.h>

#include <eh.h>

class Exception { };

class StackOverflowException : Exception { };

// Because the overflow is deliberate, disable the warning that

// this function will cause a stack overflow.

#pragma warning (disable: 4717)

void CauseStackOverflow (int i)

// Overflow the stack by allocating a large stack-based array

// in a recursive function.

int a[10000];

printf("%d ", i);

CauseStackOverflow (i + 1);

void __cdecl SEHTranslator (unsigned int code, _EXCEPTION_POINTERS*)

// For stack overflow exceptions, throw our own C++

// exception object.

// For all other exceptions, throw a generic exception object.


// Use minimal stack space in this function.

// Do not call _resetstkoflw in this function.

if (code == EXCEPTION_STACK_OVERFLOW)

throw StackOverflowException ( );

else

throw Exception( );

int main ( )

bool stack_reset = false;

bool result = false;

// Set up a function to handle all structured exceptions,

// including stack overflow exceptions.

_set_se_translator (SEHTranslator);

try

CauseStackOverflow (0);

catch (StackOverflowException except)

// Use minimal stack space here.

// Do not call _resetstkoflw here.

printf("\nStack overflow!\n");

stack_reset = true;

catch (Exception except)

// Do not call _resetstkoflw here.

printf("\nUnknown Exception!\n");

if (stack_reset)

result = _resetstkoflw();
// If stack reset failed, terminate the application.

if (result == 0)

exit(1);

void* pv = _alloca(100000);

printf("Recovered from stack overflow and allocated 100,000 bytes"

" using _alloca.");

return 0;

Output

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Stack overflow!

Recovered from stack overflow and allocated 100,000 bytes using _alloca.

См. также раздел


_alloca
rewind
Статья • 03.04.2023

Перемещает файловый указатель на начало файла.

Синтаксис
C

void rewind(

FILE *stream

);

Параметры
stream

Указатель на структуру FILE .

Комментарии
Функция rewind перемещает указатель файла, связанный с stream , в начало файла.
Вызов похож rewind на

(void) fseek(stream, 0L, SEEK_SET );

Однако, в отличие от fseek, rewind очищает как индикаторы ошибок для потока,
так и индикатор конца файла. Кроме того, в отличие от fseek, rewind не возвращает
значение, указывающее, был ли указатель успешно перемещен.

Чтобы очистить буфер клавиатуры, используйте rewind с потоком stdin , который


по умолчанию связан с клавиатурой.

Если stream является указателем NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если выполнение
разрешено продолжать, эта функция возвращает и errno имеет значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

rewind <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_rewind.c

/* This program first opens a file named

* crt_rewind.out for input and output and writes two

* integers to the file. Next, it uses rewind to

* reposition the file pointer to the beginning of

* the file and reads the data back in.

*/

#include <stdio.h>

int main( void )

FILE *stream;

int data1, data2;

data1 = 1;

data2 = -37;

fopen_s( &stream, "crt_rewind.out", "w+" );

if( stream != NULL )


{

fprintf( stream, "%d %d", data1, data2 );

printf( "The values written are: %d and %d\n", data1, data2 );

rewind( stream );

fscanf_s( stream, "%d %d", &data1, &data2 );

printf( "The values read are: %d and %d\n", data1, data2 );

fclose( stream );

Выходные данные
Output

The values written are: 1 and -37


The values read are: 1 and -37

См. также
Потоковый ввод-вывод
rint , rintf , rintl
Статья • 03.04.2023

Округляет значение с плавающей запятой до ближайшего целого числа в формате


с плавающей запятой.

Синтаксис
C

double rint( double x );

float rintf( float x );


long double rintl( long double x );

#define rint(X) // Requires C11 or higher

float rint( float x ); // C++ only

long double rint( long double x ); // C++ only

Параметры
x

Округляемое значение с плавающей запятой.

Возвращаемое значение
Функции rint возвращают значение с плавающей запятой, которое представляет
целое число, ближайшее к x . Промежуточные значения округляются согласно
текущей настройке режима округления чисел с плавающей запятой (аналогично
функциям nearbyint ). В отличие от функций nearbyint функции rint могут
вызывать исключение числа с плавающей запятой FE_INEXACT , если значение
результата отличается от аргумента. Ошибка не возвращается.

Входные данные Исключение SEH _matherr Исключение

± INF, QNaN, IND нет нет

Денормализованные числа EXCEPTION_FLT_UNDERFLOW нет

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки rint , которые
принимают и возвращают значения float и long double . В программе на языке C,
если вы не используете <макрос tgmath.h> для вызова этой функции, rint всегда
принимает и возвращает double .

При использовании <макроса tgmath.h> rint() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

rint , rintf , rintl <math.h> <cmath>

rint Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_rint.c

// Build with: cl /W3 /Tc crt_rint.c

// This example displays the rounded results of

// the floating-point values 2.499999, -2.499999,

// 2.8, -2.8, 2.5 and -2.5.

#include <math.h>

#include <stdio.h>

int main( void )

double x = 2.499999;
float y = 2.8f;

long double z = 2.5;

printf("rint(%f) is %.0f\n", x, rint (x));

printf("rint(%f) is %.0f\n", -x, rint (-x));

printf("rintf(%f) is %.0f\n", y, rintf(y));

printf("rintf(%f) is %.0f\n", -y, rintf(-y));

printf("rintl(%Lf) is %.0Lf\n", z, rintl(z));

printf("rintl(%Lf) is %.0Lf\n", -z, rintl(-z));

Output

rint(2.499999) is 2

rint(-2.499999) is -2

rintf(2.800000) is 3

rintf(-2.800000) is -3

rintl(2.500000) is 3

rintl(-2.500000) is -3

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ceil, ceilf, ceill

floor, floorf, floorl

fmod, fmodf

lrint, lrintf, lrintl, llrint, llrintf, llrintl

lround, lroundf, lroundl, llround, llroundf, llroundl

nearbyint, nearbyintf, nearbyintl

rint
rmdir
Статья • 03.04.2023

Имя rmdir функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _rmdir для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _rmdir . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_rmdir , _wrmdir
Статья • 03.04.2023

Удаляет каталог.

Синтаксис
C

int _rmdir(

const char *dirname

);

int _wrmdir(

const wchar_t *dirname

);

Параметры
dirname

Путь к каталогу, который следует удалить.

Возвращаемое значение
Каждая из этих функций возвращает 0, если каталог был успешно удален.
Возвращаемое значение -1 указывает на ошибку и errno имеет одно из следующих
значений:

Значение Условие
errno

ENOTEMPTY Указанный путь не является каталогом, каталог не пуст, или каталогом является
текущий рабочий или корневой каталог.

ENOENT Недопустимый путь.

EACCES Программа имеет открытый дескриптор каталога.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Функция _rmdir удаляет каталог, указанный в параметре dirname . Каталог должен
быть пустым и не должен являться текущим рабочим или корневым каталогом.

_wrmdir — это версия _rmdir с расширенными символами; аргумент dirname для

_wrmdir — строка расширенных символов. Поведение _wrmdir и _rmdir идентично


в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_trmdir _rmdir _rmdir _wrmdir

Требования
Подпрограмма Обязательный заголовок

_rmdir <direct.h>

_wrmdir <direct.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
См. пример для _mkdir.

См. также раздел


Управление каталогами

_chdir, _wchdir

_mkdir, _wmkdir
rmtmp
Статья • 03.04.2023

Имя rmtmp функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _rmtmp функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _rmtmp . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_rmtmp
Статья • 03.04.2023

Удаляет временные файлы.

Синтаксис
C

int _rmtmp( void );

Возвращаемое значение
Функция _rmtmp возвращает количество закрытых и удаленных временных файлов.

Комментарии
Функция _rmtmp удаляет все временные файлы в текущем каталоге. Функция
удаляет только те файлы, которые созданы с помощью функции tmpfile ;
используйте ее только в том же самом каталоге, в котором были созданы
временные файлы.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_rmtmp <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.
Пример
См. пример для tmpfile.

См. также раздел


Потоковый ввод-вывод

_flushall

tmpfile

_tempnam, _wtempnam, tmpnam, _wtmpnam


_rotl , _rotl64 , _rotr , _rotr64
Статья • 03.04.2023

Циклически сдвигает биты влево ( _rotl ) или вправо ( _rotr ).

Синтаксис
C

unsigned int _rotl(

unsigned int value,

int shift

);

unsigned __int64 _rotl64(

unsigned __int64 value,

int shift

);

unsigned int _rotr(

unsigned int value,

int shift

);

unsigned __int64 _rotr64(

unsigned __int64 value,

int shift

);

Параметры
value

Значение для сдвига.

shift

Количество битов для сдвига.

Возвращаемое значение
Итоговое значение. Ошибка не возвращается.

Комментарии
Функции _rotl и _rotr поворот без знака value shift битами. _rotl выполняет
циклический сдвиг влево. _rotr выполняет циклический сдвиг вправо. Обе
функции переносили биты, повернутые от одного конца до другого value конца.

Требования
Подпрограмма Обязательный заголовок

_rotl , _rotl64 <stdlib.h>

_rotr , _rotr64 <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_rot.c

/* This program shifts values to rotate an integer.

*/

#include <stdlib.h>

#include <stdio.h>

int main( void )

unsigned val = 0x0fd93;

__int64 val2 = 0x0101010101010101;

printf( "0x%4.4x rotated left three times is 0x%4.4x\n",

val, _rotl( val, 3 ) );

printf( "0x%4.4x rotated right four times is 0x%4.4x\n",

val, _rotr( val, 4 ) );

printf( "%I64x rotated left three times is %I64x\n",

val2, _rotl64( val2, 3 ) );

printf( "%I64x rotated right four times is %I64x\n",

val2, _rotr64( val2, 4 ) );

Выходные данные
Output

0xfd93 rotated left three times is 0x7ec98

0xfd93 rotated right four times is 0x30000fd9

101010101010101 rotated left three times is 808080808080808

101010101010101 rotated right four times is 1010101010101010

См. также
Поддержка математических функций для чисел с плавающей запятой
_lrotl, _lrotr
round , roundf , roundl
Статья • 03.04.2023

Округляет значение с плавающей запятой до ближайшего целочисленного


значения.

Синтаксис
C

double round(

double x

);

float round(

float x

); // C++ only

long double round(

long double x

); // C++ only

float roundf(

float x

);

long double roundl(

long double x

);

#define round(X) // Requires C11 or higher

Параметры
x

Округляемое значение с плавающей запятой.

Возвращаемое значение
Функции round возвращают значение с плавающей запятой, которое представляет
целое число, ближайшее к x . Промежуточные значения округляются в сторону от
нуля, независимо от настройки режима округления чисел с плавающей запятой.
Ошибка не возвращается.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN


Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки round , которые
принимают и возвращают значения float и long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, round всегда
принимает и возвращает . double

Если вы используете round макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

round , roundf , roundl <math.h>

round Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// Build with: cl /W3 /Tc

// This example displays the rounded

// results of floating-point values

#include <math.h>

#include <stdio.h>

int main()

printf("===== Round a float\n\n");

float floatValue = 2.4999999f; // float stores a value close to, but not
exactly equal to, the initializer below. floatValue will contain 2.5 because
it is the closest single precision value

printf("roundf(%.1000g) is %.1000g\n", floatValue, roundf(floatValue));

printf("roundf(%.1000g) is %.1000g\n", -floatValue, roundf(-


floatValue));

// double stores a value close to, but not exactly equal to, the
initializer below. The closest double value is just slightly larger.

double doubleValue = 2.4999999;

printf("\n===== Round a double\n\n");

printf("round(%.1000g) is %.1000g\n", doubleValue, round(doubleValue));

printf("round(%.1000g) is %.1000g\n", -doubleValue, round(-


doubleValue));

// long double stores a value close to, but not exactly equal to, the
initializer below. The closest long double value is just slightly larger.

long double longDoubleValue = 2.4999999L;

printf("\n===== Round a long double\n\n");

printf("roundl(%.1000g) is %.1000g\n", longDoubleValue,


roundl(longDoubleValue));

printf("roundl(%.1000g) is %.1000g\n", -longDoubleValue, roundl(-


longDoubleValue));

return 0;

Output

===== Round a float

roundf(2.5) is 3

roundf(-2.5) is -3

===== Round a double

round(2.499999900000000163657887242152355611324310302734375) is 2

round(-2.499999900000000163657887242152355611324310302734375) is -2

===== Round a long double

roundl(2.499999900000000163657887242152355611324310302734375) is 2

roundl(-2.499999900000000163657887242152355611324310302734375) is -2

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ceil, ceilf, ceill

floor, floorf, floorl

fmod, fmodf

lrint, lrintf, lrintl, llrint, llrintf, llrintl

lround, lroundf, lroundl, llround, llroundf, llroundl

nearbyint, nearbyintf, nearbyintl

rint, rintf, rintl


_RPT , _RPTF , _RPTW , _RPTFW Макросы
Статья • 03.04.2023

Отслеживает ход выполнения приложения путем создания отчета отладки (только


отладочная версия). Суффикс n указывает количество аргументов в args и может
иметь значение 0, 1, 2, 3, 4 или 5.

Синтаксис
C

_RPTn(

reportType,

format,

...[args]

);

_RPTFn(

reportType,

format,

[args]

);

_RPTWn(

reportType,

format

[args]

);

_RPTFWn(

reportType,

format

[args]

);

Параметры
reportType

Тип отчета: _CRT_WARN , _CRT_ERROR или _CRT_ASSERT .

format

Строка управления форматом, которая используется для создания


пользовательского сообщения.

args

Аргументы подстановки, используемые параметром format .


Комментарии
Все эти макросы принимают reportType параметры и format . Кроме того, они
могут принимать до четырех дополнительных аргументов, означаемых номером,
добавленным к имени макроса. Например, _RPT0 и _RPTF0 не принимать больше
аргументов, _RPT1 и _RPTF1 принимать arg1 , _RPT2 и _RPTF2 принимать arg1 и
arg2 , и т. д.

_RPT Макросы и _RPTF похожи на функцию printf , так как их можно использовать

для отслеживания хода выполнения приложения в процессе отладки. Однако эти


макросы являются более гибкими, чем printf потому, что их не нужно заключать в
инструкции #ifdef , чтобы предотвратить их вызов в розничной сборке
приложения. Эта гибкость достигается с помощью макроса _DEBUG ; _RPT макросы
и _RPTF доступны только при определении флага _DEBUG . Если _DEBUG параметр не
определен, вызовы этих макросов удаляются во время предварительной
обработки.

Макросы _RPTW и _RPTFW являются версиями этих макросов для расширенных


символов. Они подобны функции wprintf и принимают в качестве аргументов
строки расширенных символов.

Макросы _RPT вызывают функцию _CrtDbgReport для создания отчета об отладке с


пользовательским сообщением. Макросы _RPTW вызывают функцию _CrtDbgReportW
для создания того же отчета с расширенными символами. Макросы _RPTF и _RPTFW
создают отчеты отладки, в котором помимо пользовательского сообщения указан
файл исходного кода и номер строки, в которой был вызван макрос отчета.
Сообщение пользователя создается путем замены arg[n] аргументов в format
строку с использованием правил, определенных функцией printf .

Функция _CrtDbgReport или _CrtDbgReportW создает отчет отладки и определяет


места его назначения на основании текущих режимов отчета и файла,
определенных для reportType . _CrtSetReportMode Функции и _CrtSetReportFile
используются для определения назначений для каждого типа отчета.

Если макрос _RPT вызывается, а _CrtSetReportMode и _CrtSetReportFile не были


вызваны, сообщения отображаются следующим образом:

Тип отчета Назначение выходных данных

_CRT_WARN Текст предупреждения не отображается.


Тип отчета Назначение выходных данных

_CRT_ERROR Всплывающее окно. То же самое, как если бы была указана функция


_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_WNDW); .

_CRT_ASSERT Эквивалентно _CRT_ERROR .

Если назначением является окно сообщения отладки и пользователь нажимает


кнопку _CrtDbgReport Повторить или _CrtDbgReportW возвращает значение 1. Это
возвращаемое значение приводит к тому, что эти макросы запускают отладчик,
если включена JIT-отладка. Дополнительные сведения об использовании этих
макросов в качестве механизма обработки ошибок отладки см. в разделе Макросы
для создания отчетов.

Существуют два других макроса, которые создают отчеты отладки. Макрос _ASSERT
создает отчет, но только в том случае, если аргумент выражения имеет
FALSE значение . _ASSERTE точно так же, как _ASSERT , но включает выражение,

завершилось сбоем, в созданном отчете.

Requirements (Требования)
Макрос Обязательный заголовок

Макрос _RPT <crtdbg.h>

Макрос _RPTF <crtdbg.h>

Макрос _RPTW <crtdbg.h>

Макрос _RPTFW <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Только отладочные версии библиотек времени выполнения языка C.

Хотя эти макросы доступны при включении crtdbg.h , для выполнения приложение
должно связаться с одной из библиотек отладки, так как эти макросы вызывают
другие функции времени выполнения.

Пример
См. пример в _ASSERT статье.

См. также раздел


Подпрограммы отладки
_RTC_GetErrDesc
Статья • 03.04.2023

Возвращает краткое описание типа проверки на ошибки во время выполнения


(RTC).

Синтаксис
C

const char * _RTC_GetErrDesc(

_RTC_ErrorNumber errnum

);

Параметры
errnum

Число от нуля до единицы и меньше значения, возвращаемого _RTC_NumErrors .

Возвращаемое значение
Строка символов, которая содержит краткое описание одного из типов ошибок,
обнаруженного системой проверки на ошибки во время выполнения. Если ошибка
меньше нуля или больше или равна значению, возвращаемого параметром
_RTC_NumErrors, _RTC_GetErrDesc возвращается NULL .

Требования
Подпрограмма Обязательный заголовок

_RTC_GetErrDesc <rtcapi.h>

Дополнительные сведения см. в разделе Совместимость.

Библиотеки
Все версии библиотек времени выполнения языка C.
См. также раздел
_RTC_NumErrors

Проверка ошибок во время выполнения


_RTC_NumErrors
Статья • 03.04.2023

Возвращает общее количество ошибок, которое может быть обнаружено путем


проверки на ошибки во время выполнения (RTC). Это число можно использовать в
качестве элемента управления в for цикле, где каждое значение в цикле
передается _RTC_GetErrDesc.

Синтаксис
C

int _RTC_NumErrors( void );

Возвращаемое значение
Целое число, представляющее общее количество ошибок, которое может быть
обнаружено проверками на ошибки во время выполнения Visual C++.

Требования
Подпрограмма Обязательный заголовок

_RTC_NumErrors <rtcapi.h>

Дополнительные сведения см. в разделе Совместимость.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


_RTC_GetErrDesc

Проверка ошибок во время выполнения


_RTC_SetErrorFunc
Статья • 03.04.2023

Назначает функцию в качестве обработчика для сообщений о проверке на ошибки


во время выполнения (RTC). Эта функция не рекомендуется; вместо нее
используйте функцию _RTC_SetErrorFuncW .

Синтаксис
C

_RTC_error_fn _RTC_SetErrorFunc(

_RTC_error_fn function

);

Параметры
function

Адрес функции, которая будет обрабатывать проверки на ошибки во время


выполнения.

Возвращаемое значение
Ранее определенная функция обработки ошибок. Если ранее не определена
функция, возвращается NULL .

Комментарии
Не используйте эту функцию; вместо этого используйте _RTC_SetErrorFuncW . Он
сохраняется только для обратной совместимости.

Требования
Подпрограмма Обязательный заголовок

_RTC_SetErrorFunc <rtcapi.h>

Дополнительные сведения см. в разделе Совместимость.


Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


_CrtDbgReport, _CrtDbgReportW

Проверка ошибок во время выполнения


_RTC_SetErrorFuncW
Статья • 03.04.2023

Назначает функцию в качестве обработчика для сообщений о проверке на ошибки


во время выполнения (RTC).

Синтаксис
C

_RTC_error_fnW _RTC_SetErrorFuncW(

_RTC_error_fnW function

);

Параметры
function

Адрес функции, которая будет обрабатывать проверки на ошибки во время


выполнения.

Возвращаемое значение
Ранее определенная функция ошибки; или NULL , если ранее не определена
функция.

Комментарии
В новом коде используйте только _RTC_SetErrorFuncW . _RTC_SetErrorFunc включена
в библиотеку только для обеспечения обратной совместимости.

Обратный вызов _RTC_SetErrorFuncW применяется только к компоненту, с которым


он был связан, но не глобально.

Убедитесь, что передаваемый в _RTC_SetErrorFuncW адрес относится к допустимой


функции обработки ошибок.

Если ошибке назначен тип -1 с помощью _RTC_SetErrorType, функция обработки


ошибок не вызывается.
Перед тем, как вы сможете вызвать эту функцию, необходимо сначала вызвать
одну из функций инициализации проверки на ошибки во время выполнения.
Дополнительные сведения см. в статье Использование проверок среды
выполнения без библиотеки среды выполнения C.

_RTC_error_fnW определяется следующим образом:

C++

typedef int (__cdecl * _RTC_error_fnW)(

int errorType,

const wchar_t * filename,

int linenumber,

const wchar_t * moduleName,

const wchar_t * format,

... );

где:

errorType

Тип ошибки, заданный параметром _RTC_SetErrorType.

filename

Исходный файл, где произошел сбой, или значение NULL, если информация об
отладке недоступна.

linenumber

Строка, в filename которой произошел сбой, или 0, если отладочная информация


недоступна.

moduleName

Библиотека DLL или имя исполняемого файла, где произошел сбой.

format

Строка в стиле printf для отображения сообщения об ошибке с использованием


оставшихся параметров. Первым аргументом VA_ARGLIST является номер ошибки
RTC, которая произошла.

Пример использования _RTC_error_fnW см. в разделе Настройка проверок


собственной среды выполнения.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_RTC_SetErrorFuncW <rtcapi.h>

Дополнительные сведения см. в разделе Совместимость.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


_CrtDbgReport, _CrtDbgReportW

Проверка ошибок среды выполнения


_RTC_SetErrorType
Статья • 03.04.2023

Связывает обнаруженную проверкой во время выполнения ошибку (RTC) с типом.


Обработчик ошибок определяет способ вывода ошибок указанного типа.

Синтаксис
C

int _RTC_SetErrorType(

_RTC_ErrorNumber errnum,

int ErrType

);

Параметры
errnum

Число от нуля до единицы и меньше значения, возвращаемого _RTC_NumErrors.

ErrType

Значение, присваиваемое этому errnum . Например, можно использовать


_CRT_ERROR . Если вы используете _CrtDbgReport в качестве обработчика ошибок,

может быть только одним из символов, ErrType определенных в


_CrtSetReportMode. Если у вас есть собственный обработчик ошибок
(_RTC_SetErrorFunc), у вас может быть столько ErrType значений, сколько
значений. errnum

_RTC_ERRTYPE_IGNORE Имеет ErrType особое значение _CrtSetReportMode ; ошибка

игнорируется.

Возвращаемое значение
Предыдущее значение для типа ошибки, замененного . ErrType

Комментарии
По умолчанию для всех ошибок задано значение ErrType = 1, соответствующее
_CRT_ERROR . Дополнительные сведения о типах ошибок по умолчанию, таких как
_CRT_ERROR , см. в разделе _CrtDbgReport.

Перед вызовом этой функции необходимо сначала вызвать одну из функций


инициализации проверки ошибок во время выполнения; см . раздел
"Использование проверок среды выполнения без библиотеки среды выполнения
C"

Требования
Подпрограмма Обязательный заголовок

_RTC_SetErrorType <rtcapi.h>

Дополнительные сведения см. в разделе Совместимость.

Библиотеки
Все версии библиотек времени выполнения языка C.

См. также раздел


_RTC_GetErrDesc

Проверка ошибок во время выполнения


_scalb , _scalbf
Статья • 03.04.2023

Масштабирует аргумент по степени числа 2.

Синтаксис
C

double _scalb(

double x,

long exp

);

float _scalbf(

float x,

long exp

); /* x64 only */

Параметры
x

Число двойной точности с плавающей запятой.

exp

Показатель степени — длинное целое число.

Возвращаемое значение
Возвращает значение экспоненты в случае успешного выполнения. При
переполнении x (в зависимости от знака), _scalb возвращается +/- HUGE_VAL ; errno
переменная имеет значение ERANGE .

Дополнительные сведения об этом и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Функция _scalb вычисляет значение x * 2 exp .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.
Требования
Подпрограмма Обязательный заголовок

_scalb , _scalbf <float.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
ldexp
scalbn , scalbnf , scalbnl , scalbln ,
scalblnf , scalblnl
Статья • 03.04.2023

Умножает число с плавающей запятой на целочисленную степень FLT_RADIX .

Синтаксис
C

double scalbn(

double x,

int exp

);

float scalbn(

float x,

int exp

); // C++ only

long double scalbn(

long double x,

int exp

); // C++ only

float scalbnf(

float x,

int exp

);

long double scalbnl(

long double x,

int exp

);

#define scalbn(X, INT) // Requires C11 or higher

double scalbln(

double x,

long exp

);

float scalblnf(

float x,

long exp

);

long double scalblnl(

long double x,

long exp

);

#define scalbln(X, LONG) // Requires C11 or higher

float scalbln(

float x,

long exp

); // C++ only

long double scalbln(

long double x,

long exp

); // C++ only

Параметры
x

Значение с плавающей запятой.

exp

Целый показатель степени.

Возвращаемое значение
Функции scalbn возвращают значение x * FLT_RADIX exp в случае успешного
выполнения. При переполнении (в зависимости от знака x ) scalbn возвращает
значение +/- HUGE_VAL ; errno значение имеет значение ERANGE .

Дополнительные сведения и errno возможные возвращаемые значения ошибок


см. в разделах errno, _doserrno, _sys_errlistи _sys_nerr.

Комментарии
FLT_RADIX определяется в <float.h> как собственный радикс с плавающей запятой;

в двоичных системах он имеет значение 2 и scalbn эквивалентен ldexp.

Так как C++ допускает перегрузку, можно вызывать scalbn перегрузки и scalbln ,
которые принимают и возвращают float типы или long double . В программе на
языке C, если вы не используете <макрос tgmath.h> для вызова этой функции,
scalbn всегда принимает double и и int возвращает double , а scalbln также

всегда принимает double и long и возвращает double .

Если вы используете <макросы tgmath.h> scalbn() или scalbln , тип аргумента


определяет, какая версия функции выбрана. Дополнительные сведения см. в
разделе Типообразная математика .
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

scalbn , scalbnf , scalbnl , scalbln , scalblnf , scalblnl <math.h> <cmath>

scalbn макрос или scalbln <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_scalbn.c

// Compile using: cl /W4 crt_scalbn.c

#include <math.h>

#include <stdio.h>

int main( void )

double x = 6.4, y;

int p = 3;

y = scalbn( x, p );

printf( "%2.1f times FLT_RADIX to the power of %d is %2.1f\n", x, p, y );

Выходные данные
Output

6.4 times FLT_RADIX to the power of 3 is 51.2

См. также
Поддержка математических функций для чисел с плавающей запятой
frexp

ldexp

modf, modff, modfl


scanf , _scanf_l , wscanf , _wscanf_l
Статья • 03.04.2023

Считывает отформатированные данные из стандартного входного потока.


Доступны более безопасные версии этих функций; см. ,scanf_s_scanf_s_l , , wscanf_s.
_wscanf_s_l

7 Примечание

В Visual Studio 2015 printf семейство функций и scanf было объявлено как
inline и перемещено в <stdio.h> заголовки и <conio.h> . При переносе

старого кода вы можете увидеть ошибку компоновщика LNK2019 в связи с


этими функциями. Дополнительные сведения см. в статье Журнал изменений
Visual C++ с 2003 по 2015.

Синтаксис
C

int scanf(

const char *format [,

argument]...

);

int _scanf_l(

const char *format,

_locale_t locale [,

argument]...

);

int wscanf(

const wchar_t *format [,

argument]...

);

int _wscanf_l(

const wchar_t *format,

_locale_t locale [,

argument]...

);

Параметры
format

Строка управления форматированием.


argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает число успешно преобразованных и назначенных полей;
Возвращаемое значение не включает поля, которые были прочитаны, но не
назначены. Возвращаемое значение 0 указывает, что поля не были назначены.

Если format является указателем NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эти функции возвращают EOF и устанавливают для errno
значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция scanf считывает данные из стандартного входного потока stdin и
записывает данные в расположение, указанное параметром argument . Каждый
параметр argument должен быть указателем на переменную, которая имеет тип,
соответствующий спецификатору типа в параметре format . Если копирование
производится между перекрывающимися строками, поведение не определено.

) Важно!

При использовании scanf для чтения строки всегда следует указывать ширину
для формата %s (например, %32s вместо %s ); в противном случае ввод в
неправильном формате может легко привести к переполнению буфера. Кроме
того, рекомендуется использовать scanf_s, _scanf_s_l, _wscanf_s_lwscanf_s или
fgets.

wscanf — это версия scanf с расширенными символами; аргумент format для

wscanf — строка расширенных символов. wscanf и scanf ведут себя одинаково,


если поток открыт в режиме ANSI. scanf сейчас не поддерживает ввод из потока
ЮНИКОДА.
Версии этих функций с суффиксом _l идентичны за исключением того, что они
используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tscanf scanf scanf wscanf

_tscanf_l _scanf_l _scanf_l _wscanf_l

Дополнительные сведения см. в разделе Поля спецификации формата: scanf и


wscanf функции.

Требования
Подпрограмма Обязательный заголовок

scanf , _scanf_l <stdio.h>

wscanf , _wscanf_l <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C
смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_scanf.c

// compile with: /W3

// This program uses the scanf and wscanf functions

// to read formatted input.

#include <stdio.h>

int main( void )

int i, result;

float fp;

char c, s[81];

wchar_t wc, ws[81];

result = scanf( "%d %f %c %C %80s %80S", &i, &fp, &c, &wc, s, ws ); //


C4996

// Note: scanf and wscanf are deprecated; consider using scanf_s and
wscanf_s

printf( "The number of fields input is %d\n", result );

printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);

result = wscanf( L"%d %f %hc %lc %80S %80ls", &i, &fp, &c, &wc, s, ws );
// C4996

wprintf( L"The number of fields input is %d\n", result );

wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws);

Input

71 98.6 h z Byte characters

36 92.3 y n Wide characters

Output

The number of fields input is 6

The contents are: 71 98.599998 h z Byte characters

The number of fields input is 6

The contents are: 36 92.300003 y n Wide characters

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Потоковый ввод-вывод

Локаль

fscanf, _fscanf_l, fwscanf, _fwscanf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

sscanf, _sscanf_l, swscanf, _swscanf_l


scanf_s , _scanf_s_l , wscanf_s ,
_wscanf_s_l
Статья • 03.04.2023

Считывает отформатированные данные из стандартного входного потока. Эти


версии scanf, _scanf_l, , wscanfимеют _wscanf_l улучшения безопасности, как
описано в разделе Функции безопасности в CRT.

Синтаксис
C

int scanf_s(

const char *format [,

argument]...

);

int _scanf_s_l(

const char *format,

_locale_t locale [,

argument]...

);

int wscanf_s(

const wchar_t *format [,

argument]...

);

int _wscanf_s_l(

const wchar_t *format,

_locale_t locale [,

argument]...

);

Параметры
format

Строка управления форматированием.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.


Возвращаемое значение
Возвращает число успешно преобразованных и назначенных полей.
Возвращаемое значение не включает поля, которые были прочитаны, но не
назначены. Возвращаемое значение 0 указывает, что поля не назначены.
Возвращаемое значение — EOF для ошибки, или значение , если символ конца
файла или символ конца строки найден при первой попытке чтения символа. Если
format является указателем NULL , вызывается обработчик недопустимых

параметров, как описано в разделе Проверка параметров. Если выполнение может


быть продолжено, то функции scanf_s и wscanf_s возвращают ошибку EOF и
устанавливают для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция scanf_s считывает данные из стандартного входного потока stdin и
записывает их в argument . Каждый из них argument должен быть указателем на тип
переменной, соответствующий спецификатору типа в format . Если копирование
производится между перекрывающимися строками, поведение не определено.

wscanf_s — это версия scanf_s с расширенными символами; аргумент format для


wscanf_s — строка расширенных символов. wscanf_s и scanf_s ведут себя

одинаково, если поток открыт в режиме ANSI. scanf_s сейчас не поддерживает


ввод из потока ЮНИКОДА.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют locale параметр вместо текущего языкового стандарта потока.

В отличие от scanf и wscanf , scanf_s и wscanf_s требуют указания размеров


буфера для некоторых параметров. Укажите размеры для всех c параметров , C , s ,
S или строковых наборов [] элементов управления. Размер буфера в символах
передается как другой параметр. Он сразу же следует за указателем на буфер или
переменную. Например, если вы читаете строку, размер буфера для нее
передается следующим образом:

char s[10];

scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width


specification is 9

Размер буфера включает в себя значение NULL терминала. Вы можете


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

7 Примечание

Параметр размера имеет тип unsigned , а не size_t . Для преобразования


значения size_t в значение unsigned для 64-разрядной конфигурации сборки
следует использовать static_cast.

Параметр размера буфера описывает максимальное число символов, а не байтов.


В этом примере ширина типа буфера не соответствует ширине описателя формата.

wchar_t ws[10];

wscanf_s(L"%9S", ws, (unsigned)_countof(ws));

Описатель S формата означает использование ширины символов, которая


"противоположна" ширине по умолчанию, поддерживаемой функцией. Ширина
символа — один байт, но функция поддерживает двухбайтовые символы. В этом
примере выполняется чтение в строке длиной до девяти однобайтовых символов и
помещает их в двухбайтовый буфер символов. Символы обрабатываются как
однобайтовые значения; первые два символа сохраняются в ws[0] , вторые два
сохраняются в ws[1] и т. д.

В этом примере считывается один символ:

char c;

scanf_s("%c", &c, 1);

При чтении нескольких символов для строк, не заканчивающихся null, для


спецификации ширины и размера буфера используются целые числа.

char c[4];

scanf_s("%4c", c, (unsigned)_countof(c)); // not null terminated

Дополнительные сведения см. в разделе scanf Спецификация ширины.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tscanf_s scanf_s scanf_s wscanf_s

_tscanf_s_l _scanf_s_l _scanf_s_l _wscanf_s_l

Дополнительные сведения см. в разделе Поля спецификации форматирования:


scanf и wscanf функции.

Требования
Подпрограмма Обязательный заголовок

scanf_s , _scanf_s_l <stdio.h>

wscanf_s , _wscanf_s_l <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартный поток обрабатывает stdin , stdout и stderr должен быть
перенаправлен, прежде чем функции среды выполнения C смогут использовать их
в приложениях UWP. Дополнительные сведения о совместимости см. в разделе
Compatibility.

Пример
C

// crt_scanf_s.c

// This program uses the scanf_s and wscanf_s functions

// to read formatted input.

#include <stdio.h>

#include <stdlib.h>

int main( void )

int i,

result;

float fp;

char c,

s[80];

wchar_t wc,

ws[80];

result = scanf_s( "%d %f %c %C %s %S", &i, &fp, &c, 1,

&wc, 1, s, (unsigned)_countof(s), ws,


(unsigned)_countof(ws) );

printf( "The number of fields input is %d\n", result );

printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c,

wc, s, ws);

result = wscanf_s( L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,

&wc, 1, s, (unsigned)_countof(s), ws,


(unsigned)_countof(ws) );

wprintf( L"The number of fields input is %d\n", result );

wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp,

c, wc, s, ws);

Эта программа создает следующие выходные данные для этих входных данных:

Input

71 98.6 h z Byte characters

36 92.3 y n Wide characters

Output

The number of fields input is 6

The contents are: 71 98.599998 h z Byte characters

The number of fields input is 6

The contents are: 36 92.300003 y n Wide characters

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Потоковый ввод-вывод

Локаль

fscanf, _fscanf_l, fwscanf, _fwscanf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

sscanf, _sscanf_l, swscanf, _swscanf_l


_scprintf , _scprintf_l , _scwprintf ,
_scwprintf_l
Статья • 03.04.2023

Возвращает количество символов в отформатированной строке.

Синтаксис
C

int _scprintf(

const char *format [,

argument] ...

);

int _scprintf_l(

const char *format,

_locale_t locale [,

argument] ...

);

int _scwprintf(

const wchar_t *format [,

argument] ...

);

int _scwprintf_l(

const wchar_t *format,

_locale_t locale [,

argument] ...

);

Параметры
format

Строка управления форматом.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в описании синтаксиса спецификации формата.


Возвращаемое значение
Возвращает число символов, которые были бы созданы, если строка была бы
напечатана либо отправлена в файл или буфер с помощью указанных кодов
форматирования. Возвращаемое значение не включает завершающий нуль-
символ. Функция _scwprintf выполняет эту же операцию для расширенных
символов.

Если format указатель является указателем NULL , вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
разрешается продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Каждый argument (при наличии) преобразуется согласно соответствующей
спецификации формата в параметре format . Формат состоит из обычных символов
и имеет те же форму и функциональные возможности, что и аргумент format для
printf.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округляются до
ближайшей четной цифры (также известной как "Округление банкира").
Например, оба printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны
округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до 3. Это
изменение влияет только на точно представляемые числа. Например, 2.35
(который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_sctprintf _scprintf _scprintf _scwprintf

_sctprintf_l _scprintf_l _scprintf_l _scwprintf_l

Требования
Подпрограмма Обязательный заголовок

_scprintf , _scprintf_l <stdio.h>

_scwprintf , _scwprintf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt__scprintf.c

#define _USE_MATH_DEFINES

#include <stdio.h>

#include <math.h>

#include <malloc.h>

int main( void )

int count;

int size;

char *s = NULL;

count = _scprintf( "The value of Pi is calculated to be %f.\n",

M_PI);

size = count + 1; // the string will need one more char for the null
terminator

s = malloc(sizeof(char) * size);

sprintf_s(s, size, "The value of Pi is calculated to be %f.\n",

M_PI);

printf("The length of the following string will be %i.\n", count);

printf("%s", s);

free( s );

Output

The length of the following string will be 46.

The value of Pi is calculated to be 3.141593.

См. также раздел


Потоковый ввод-вывод

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

Функции vprintf
_scprintf_p , _scprintf_p_l ,
_scwprintf_p , _scwprintf_p_l
Статья • 03.04.2023

Возвращают число символов в форматированной строке с возможностью указать


порядок, в котором эти параметры используются в строке формата.

Синтаксис
C

int _scprintf_p(

const char *format [,

argument] ...

);

int _scprintf_p_l(

const char *format,

_locale_t locale [,

argument] ...

);

int _scwprintf_p (

const wchar_t *format [,

argument] ...

);

int _scwprintf_p _l(

const wchar_t *format,

_locale_t locale [,

argument] ...

);

Параметры
format

Строка управления форматом.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает число символов, которые были бы созданы, если строка была бы
напечатана либо отправлена в файл или буфер с помощью указанных кодов
форматирования. Возвращаемое значение не включает завершающий символ
NULL. Функция _scwprintf_p выполняет эту же операцию для расширенных
символов.

Различие между функциями _scprintf_p и _scprintf заключается в том, что


функция _scprintf_p поддерживает позиционные параметры, позволяющие
определить порядок, в котором аргументы используются в строке
форматирования. Дополнительные сведения см. в разделе Позиционные
параметры printf_p.

Если format является указателем NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если разрешается
продолжать выполнение, эти функции возвращают -1 и задают errno значение
EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Каждый argument (при наличии) преобразуется согласно соответствующей
спецификации формата в параметре format . Формат состоит из обычных символов
и имеет те же форму и функциональные возможности, что и аргумент format для
printf.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_sctprintf_p _scprintf_p _scprintf_p _scwprintf_p

_sctprintf_p_l _scprintf_p_l _scprintf_p_l _scwprintf_p_l

Требования
Подпрограмма Обязательный заголовок

_scprintf_p , _scprintf_p_l <stdio.h>

_scwprintf_p , _scwprintf_p_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

_scprintf, _scprintf_l, _scwprintf, _scwprintf_l

_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l


_searchenv , _wsearchenv
Статья • 03.04.2023

Использует пути в среде для поиска файла. Доступны более безопасные версии
этих функций; См. раздел_searchenv_s , _wsearchenv_s.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

void _searchenv(

const char *filename,

const char *varname,


char *pathname

);

void _wsearchenv(

const wchar_t *filename,

const wchar_t *varname,

wchar_t *pathname

);

template <size_t size>

void _searchenv(

const char *filename,

const char *varname,


char (&pathname)[size]

); // C++ only

template <size_t size>

void _wsearchenv(

const wchar_t *filename,

const wchar_t *varname,

wchar_t (&pathname)[size]

); // C++ only

Параметры
filename

Имя искомого файла.


varname

Искомая среда.

pathname

Буфер для хранения полного пути.

Комментарии
Процедура _searchenv ищет целевой файл в указанном домене. Переменной
varname может быть любая переменная среды или переменная, определяемая

пользователем, например PATH , LIB или INCLUDE , и определяющая список путей к


каталогам. Поскольку процедура _searchenv чувствительна к регистру, значение
параметра varname должно соответствовать регистру переменной среды.

Сначала процедура выполняет поиск файла в текущем рабочем каталоге. Если


файл не найти, он просматривает каталоги, указанные в переменной среды. Если
целевой файл содержится в одном из этих каталогов, созданный путь копируется в
pathname . filename Если файл не найден, pathname содержит пустую строку со
значением NULL.

Буфер pathname должен содержать не меньше _MAX_PATH знаков, чтобы вместить


полное имя созданного пути. В противном случае _searchenv может вызвать
переполнение буфера pathname и привести к непредвиденному поведению.

_wsearchenv — это двухбайтовая версия _searchenv , а аргументы для _wsearchenv


представляют собой двухбайтовые строки. Поведение _wsearchenv и _searchenv
идентично в противном случае.

Если filename является пустой строкой, эти функции возвращают ENOENT .

Если filename или pathname является указателем NULL , вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
разрешается продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

Дополнительные сведения о errno и коды ошибок см. в разделе errno Константы.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tsearchenv _searchenv _searchenv _wsearchenv

Требования
Подпрограмма Обязательный заголовок

_searchenv <stdlib.h>

_wsearchenv <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_searchenv.c

// compile with: /W3

// This program searches for a file in

// a directory that's specified by an environment variable.

#include <stdlib.h>

#include <stdio.h>

int main( void )

char pathbuffer[_MAX_PATH];

char searchfile[] = "CL.EXE";

char envvar[] = "PATH";

// Search for file in PATH environment variable:

_searchenv( searchfile, envvar, pathbuffer ); // C4996

// Note: _searchenv is deprecated; consider using _searchenv_s

if( *pathbuffer != '\0' )

printf( "Path for %s:\n%s\n", searchfile, pathbuffer );

else

printf( "%s not found\n", searchfile );

Output

Path for CL.EXE:

C:\Program Files\Microsoft Visual Studio 8\VC\BIN\CL.EXE

См. также раздел


Управление каталогами

getenv, _wgetenv

_putenv, _wputenv

_searchenv_s, _wsearchenv_s
_searchenv_s , _wsearchenv_s
Статья • 03.04.2023

Ищет файл, используя пути в среде. Эти версии имеют улучшения безопасности,
как описано в функциях _searchenv_wsearchenvбезопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

errno_t _searchenv_s(

const char *filename,

const char *varname,


char *pathname,

size_t numberOfElements

);

errno_t _wsearchenv_s(

const wchar_t *filename,

const wchar_t *varname,

wchar_t *pathname,

size_t numberOfElements

);

template <size_t size>

errno_t _searchenv_s(

const char *filename,

const char *varname,


char (&pathname)[size]

); // C++ only

template <size_t size>

errno_t _wsearchenv_s(

const wchar_t *filename,

const wchar_t *varname,

wchar_t (&pathname)[size]

); // C++ only

Параметры
filename

Имя искомого файла.

varname

Искомая среда.

pathname

Буфер для хранения полного пути.

numberOfElements

Размер буфера pathname .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.

Если filename является пустой строкой, возвращаемое значение — ENOENT .

Условия ошибок

filename varname pathname numberOfElements Возвращаемое Содержимое


значение pathname

any any NULL any EINVAL Недоступно

NULL any any any EINVAL не изменено

any any any <= 0 EINVAL не изменено

Если возникает какое-либо из этих условий ошибки, вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, эти функции устанавливают параметр errno
в значение EINVAL и возвращают значение EINVAL .

Комментарии
Процедура _searchenv_s ищет целевой файл в указанном домене. Переменной
varname может быть любая переменная среды или переменная, определяемая
пользователем и определяющая список путей к каталогам, например PATH , LIB и
INCLUDE . Поскольку процедура _searchenv_s чувствительна к регистру, значение

параметра varname должно соответствовать регистру переменной среды. Если


varname имя переменной среды, определенной в среде процесса, не совпадает,

функция возвращает ноль, а pathname переменная не изменяется.

Сначала процедура выполняет поиск файла в текущем рабочем каталоге. Если


файл не найдется, он будет выглядеть следующим образом в каталогах, указанных
переменной среды. Если целевой файл содержится в одном из этих каталогов,
созданный путь копируется в pathname . filename Если файл не найден, содержит
пустую строку, pathname завершаемую значением NULL.

Буфер pathname должен содержать не меньше _MAX_PATH знаков, чтобы вместить


полное имя созданного пути. В противном случае _searchenv_s может вызвать
переполнение буфера pathname и привести к непредвиденному поведению.

_wsearchenv_s — это двухбайтовая версия _searchenv_s ; аргументы для

_wsearchenv_s представляют собой двухбайтовые строки. Поведение _wsearchenv_s


и _searchenv_s идентично в противном случае.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tsearchenv_s _searchenv_s _searchenv_s _wsearchenv_s

Требования
Подпрограмма Обязательный заголовок

_searchenv_s <stdlib.h>

_wsearchenv_s <stdlib.h> или <wchar.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_searchenv_s.c

/* This program searches for a file in

* a directory specified by an environment variable.

*/

#include <stdlib.h>

#include <stdio.h>

int main( void )

char pathbuffer[_MAX_PATH];

char searchfile[] = "CL.EXE";

char envvar[] = "PATH";

errno_t err;

/* Search for file in PATH environment variable: */

err = _searchenv_s( searchfile, envvar, pathbuffer, _MAX_PATH );

if (err != 0)

printf("Error searching the path. Error code: %d\n", err);

if( *pathbuffer != '\0' )

printf( "Path for %s:\n%s\n", searchfile, pathbuffer );

else

printf( "%s not found\n", searchfile );

Output

Path for CL.EXE:

C:\Program Files\Microsoft Visual Studio 2010\VC\BIN\CL.EXE

См. также раздел


Управление каталогами

_searchenv, _wsearchenv

getenv, _wgetenv

_putenv, _wputenv
__security_init_cookie
Статья • 03.04.2023

Инициализирует глобальный cookie-файл безопасности.

Синтаксис
C

void __security_init_cookie(void);

Remarks
Глобальный cookie-файл безопасности используется для защиты от переполнения
буфера в коде, скомпилированном с параметром /GS (проверка безопасности
буфера), и в коде, в котором используется структурная обработка исключений. При
входе в функцию с защитой от переполнения cookie-файл помещается в стек, а при
выходе значение в стеке сравнивается с глобальным cookie-файлом. Любое
различие между ними указывает, что произошло переполнение буфера, что
приводит к немедленному завершению работы программы.

__security_init_cookie Обычно вызывается CRT при инициализации. Если вы


обходите инициализацию CRT( например, если вы используете /ENTRY для
указания точки входа), необходимо вызвать __security_init_cookie
самостоятельно. Если __security_init_cookie не вызывается, для файла cookie
глобальной безопасности устанавливается значение по умолчанию, а защита от
переполнения буфера скомпрометирована. Злоумышленник может
воспользоваться этим значением cookie-файла по умолчанию, чтобы обойти
проверку переполнения буфера, поэтому рекомендуется всегда вызывать
__security_init_cookie при определении собственной точки входа.

Функцию __security_init_cookie необходимо вызывать до входа в любую


функцию, защищенную от переполнения; в противном случае будет обнаружено
ложное переполнение буфера. Подробнее: Ошибка R6035 времени выполнения C.

Пример
Примеры см. в разделе Ошибка R6035 времени выполнения C.
Требования
Подпрограмма Обязательный заголовок

__security_init_cookie <process.h>

__security_init_cookie — расширение Майкрософт для стандартной библиотеки

выполнения C. Сведения о совместимости см. в разделе Совместимость.

См. также раздел


Центр Майкрософт по реагированию на угрозы
_seh_filter_dll , _seh_filter_exe
Статья • 03.04.2023

Определяет исключение и необходимые связанные действия.

Синтаксис
C

int __cdecl _seh_filter_dll(

unsigned long exceptionNum,

struct _EXCEPTION_POINTERS* exceptionPtr

);

int __cdecl _seh_filter_exe(

unsigned long exceptionNum,

struct _EXCEPTION_POINTERS* exceptionPtr

);

Параметры
exceptionNum

Идентификатор исключения.

exceptionPtr

Указатель на данные об исключении.

Возвращаемое значение
Целое число, обозначающее необходимое действие на основе результатов
обработки исключения.

Комментарии
Эти методы вызываются выражением фильтра исключений try-except Statement.
Метод просматривает постоянную внутреннюю таблицу для идентификации
исключения и определяет соответствующее действие, как показано ниже. Номера
исключений определяются в файле winnt.h, а номера сигналов — в файле signal.h.

Номер исключения (unsigned long) Номер сигнала


Номер исключения (unsigned long) Номер сигнала

STATUS_ACCESS_VIOLATION SIGSEGV

STATUS_ILLEGAL_INSTRUCTION SIGILL

STATUS_PRIVILEGED_INSTRUCTION SIGILL

STATUS_FLOAT_DENORMAL_OPERAND SIGFPE

STATUS_FLOAT_DIVIDE_BY_ZERO SIGFPE

STATUS_FLOAT_INEXACT_RESULT SIGFPE

STATUS_FLOAT_INVALID_OPERATION SIGFPE

STATUS_FLOAT_OVERFLOW SIGFPE

STATUS_FLOAT_STACK_CHECK SIGFPE

STATUS_FLOAT_UNDERFLOW SIGFPE

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Заголовок: corecrt_startup.h

См. также раздел


Алфавитный указатель функций
_set_abort_behavior
Статья • 03.04.2023

Указывает действие, выполняемое при аварийном завершении программы.

7 Примечание

Не используйте abort функцию для завершения работы приложения Microsoft


Store, за исключением сценариев тестирования или отладки. Программные
или пользовательские способы закрытия приложения Магазина не
допускаются в соответствии с политиками Microsoft Store. Дополнительные
сведения см. в разделе жизненного цикла приложений UWP.

Синтаксис
C

unsigned int _set_abort_behavior(

unsigned int flags,

unsigned int mask

);

Параметры
flags

Новое значение флагов abort .

mask

Маска для битов флагов abort , которую требуется задать.

Возвращаемое значение
Старое значение флагов.

Комментарии
Существует два флага abort: _WRITE_ABORT_MSG и _CALL_REPORTFAULT . _WRITE_ABORT_MSG
определяет, будет ли выводиться полезное текстовое сообщение при аварийном
завершении программы. Сообщение указывает на то, что приложение вызвало
функцию abort . По умолчанию сообщение выводится. _CALL_REPORTFAULT , если
задано, вызывает механизм службы отчеты об ошибках Windows (ранее известный
как доктор Уотсон), чтобы сообщить о сбоях корпорации Майкрософт при abort
вызове. По умолчанию функция создания отчетов о аварийных дампах включена в
неотладочных сборках. Если обработчик отчетов об ошибках Windows не
вызывается, abort вызывается _exit для завершения процесса с кодом выхода 3 и
возвращает управление родительскому процессу или операционной системе.
_exit не очищает буферы потоков или не выполняет atexit / _onexit обработку.

По соображениям совместимости Windows при abort вызовах _exit он может


вызвать API Windows ExitProcess , который, в свою очередь, позволяет выполнять
процедуры завершения DLL. Деструкторы не выполняются в исполняемом файле,
но то же самое может не совпадать с библиотеками DLL, загруженными в
пространство обработки исполняемого файла. Это поведение не соответствует
стандарту C++. Чтобы немедленно завершить процесс, включая все библиотеки
DLL, используйте API Windows TerminateProcess . Можно также зарегистрировать
обработчик сигнала прерывания, вызывающий TerminateProcess для стандартного
поведения. Поведение, соответствующее требованиям, может привести к
некоторым затратам в совместимости Windows.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе "Глобальное состояние" в CRT.

Требования
Подпрограмма Обязательный заголовок

_set_abort_behavior <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_set_abort_behavior.c

// compile with: /TC

#include <stdlib.h>

int main()

printf("Suppressing the abort message. If successful, this message"

" will be the only output.\n");

// Suppress the abort message

_set_abort_behavior( 0, _WRITE_ABORT_MSG);

abort();

Output

Suppressing the abort message. If successful, this message will be the only
output.

См. также раздел


abort
setbuf
Статья • 03.04.2023

Управляет буферизацией потока. Эта функция не рекомендуется; вместо нее


используйте функцию setvbuf .

Синтаксис
C

void setbuf(

FILE *stream,

char *buffer

);

Параметры
stream

Указатель на структуру FILE .

buffer

Выделенный пользователем буфер.

Комментарии
Функция setbuf управляет буферизацией для stream . Аргумент stream должен
ссылаться на открытый файл, который не был прочитан или записан. buffer Если
аргумент имеет значение NULL , поток не замешанный. В противном случае буфер
должен указывать на массив символов длиной BUFSIZ , где BUFSIZ  — размер
буфера, как определено в файле STDIO.H. Вместо буфера, по умолчанию
выделенного системой для данного потока, для буферизации ввода-вывода
используется указанный пользователем буфер. Поток stderr по умолчанию не
поддерживается, но можно использовать для setbuf назначения буферов stderr .

setbuf был заменен setvbufна , который является предпочтительной

подпрограммой для нового кода. В отличие от setvbuf этого, setbuf нет способа
создания отчетов об ошибках. setvbuf также позволяет управлять режимом
буферизации и размером буфера. setbuf существует для совместимости с
существующим кодом.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

setbuf <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_setbuf.c

// compile with: /W3

// This program first opens files named DATA1 and

// DATA2. Then it uses setbuf to give DATA1 a user-assigned

// buffer and to change DATA2 so that it has no buffer.

#include <stdio.h>

int main( void )

char buf[BUFSIZ];

FILE *stream1, *stream2;

fopen_s( &stream1, "data1", "a" );

fopen_s( &stream2, "data2", "w" );

if( (stream1 != NULL) && (stream2 != NULL) )

// "stream1" uses user-assigned buffer:

setbuf( stream1, buf ); // C4996

// Note: setbuf is deprecated; consider using setvbuf instead

printf( "stream1 set to user-defined buffer at: %Fp\n", buf );

// "stream2" is unbuffered

setbuf( stream2, NULL ); // C4996

printf( "stream2 buffering disabled\n" );

_fcloseall();

Output
stream1 set to user-defined buffer at: 0012FCDC

stream2 buffering disabled

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

fflush

fopen, _wfopen

setvbuf
_set_controlfp
Статья • 03.04.2023

Задает управляющее слово блока операций с плавающей запятой.

Синтаксис
C

void __cdecl _set_controlfp(

unsigned int newControl,

unsigned int mask

);

Параметры
newControl

Значения битов в новом управляющем слове.

mask

Маска для установки битов нового управляющего слова.

Возвращаемое значение
Нет.

Remarks
Функция _set_controlfp похожа на _control87 функцию, но она задает только для
элемента управления с плавающей запятой значение newControl . Биты в значениях
показывают состояние элемента управления блоком операций с плавающей
запятой. Состояние элемента управления блока операций с плавающей запятой
разрешает программе изменять режимы точности, округления и бесконечности в
пакете математических операций с числами с плавающей запятой. Можно также
использовать функцию _set_controlfp для маскирования и демаскирования
исключений, связанных с операциями с плавающей запятой. Дополнительные
сведения см. в разделе _control87, _controlfp. __control87_2
Эта функция не рекомендуется использовать при компиляции с параметром /clr
(компиляция clr), так как среда CLR поддерживает только точность с плавающей
запятой по умолчанию.

Требования
Подпрограмма Обязательный заголовок Совместимость

_set_controlfp <float.h> только для процессоров x86

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_clear87, _clearfp

_status87, _statusfp, _statusfp2


_set_doserrno
Статья • 03.04.2023

Задает значение глобальной переменной _doserrno .

Синтаксис
C

errno_t _set_doserrno( int error_value );

Параметры
error_value

Новое значение _doserrno .

Возвращаемое значение
Возвращает нуль при успешном завершении.

Комментарии
Возможные значения макроса определяются в Errno.h.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_set_doserrno <stdlib.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_get_doserrno
errno, , _doserrno_sys_errlistи_sys_nerr
_set_errno
Статья • 03.04.2023

Задает значение глобальной переменной errno .

Синтаксис
C

errno_t _set_errno( int error_value );

Параметры
error_value

Новое значение errno .

Возвращаемое значение
Возвращает нуль при успешном завершении.

Комментарии
Возможные значения макроса определяются в Errno.h. Кроме того, см errno .
константы.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Пример
C

// crt_set_errno.c

#include <stdio.h>

#include <errno.h>

int main()

_set_errno( EILSEQ );

perror( "Oops" );

Output

Oops: Illegal byte sequence

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_set_errno <stdlib.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_get_errno

errno, , _doserrno_sys_errlistи_sys_nerr
_set_error_mode
Статья • 03.04.2023

Изменяет __error_mode для определения отличного от используемого по


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

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _set_error_mode(

int mode_val

);

Параметры
mode_val

Назначение сообщений об ошибках.

Возвращаемое значение
Возвращает старое значение или -1, если возникла ошибка.

Комментарии
Управляет приемником потока ошибок, устанавливая значение __error_mode .
Например, можно направить вывод в стандартную ошибку или использовать API
MessageBox .

Параметру mode_val может быть присвоено одно из следующих значений:


Значение Описание

_OUT_TO_DEFAULT Приемник ошибок определяется значением __app_type .

_OUT_TO_STDERR Приемником ошибок является стандартная ошибка.

_OUT_TO_MSGBOX Приемником ошибок является окно сообщения.

_REPORT_ERRMODE Сообщает текущее значение __error_mode .

Если передается значение, отличное от перечисленных, вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, _set_error_mode задает для errno значение
EINVAL и возвращает значение -1.

Если он используется с assert, отображает оператор, _set_error_mode который


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

Требования
Подпрограмма Обязательный заголовок

_set_error_mode <stdlib.h>

Пример
C

// crt_set_error_mode.c

// compile with: /c

#include <stdlib.h>

#include <assert.h>

int main()

_set_error_mode(_OUT_TO_STDERR);

assert(2+2==5);

Output

Assertion failed: 2+2==5, file crt_set_error_mode.c, line 8

This application has requested the Runtime to terminate it in an unusual


way.

Please contact the application's support team for more information.

См. также раздел


Assert Macro, _assert, _wassert
_set_fmode
Статья • 03.04.2023

Устанавливает режим преобразования файла по умолчанию для операций


файлового ввода-вывода.

Синтаксис
C

errno_t _set_fmode(

int mode

);

Параметры
mode

Требуемый режим преобразования файлов: _O_TEXT или _O_BINARY .

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае ошибки. Если mode
параметр не _O_TEXT имеет значения или _O_WTEXT _O_BINARY , вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, эта функция задает для
errno значение EINVAL и возвращает EINVAL .

Комментарии
Функция задает глобальную _fmode переменную. Эта переменная определяет
значение по умолчанию режима трансляции файла для операций файлового
ввода-вывода _open и _pipe .

_O_TEXT и _O_BINARY задаются в Fcntl.h. EINVAL задается в Errno.h.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_set_fmode <stdlib.h> <fcntl.h>, <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_set_fmode.c

#include <stdlib.h>

#include <stdio.h>

#include <fcntl.h> /* for _O_TEXT and _O_BINARY */

#include <errno.h> /* for EINVAL */

#include <sys\stat.h> /* for _S_IWRITE */

#include <share.h> /* for _SH_DENYNO */

int main()

int mode, fd, ret;

errno_t err;

int buf[12] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,

75, 76 };

char * filename = "fmode.out";

err = _get_fmode(&mode);

if (err == EINVAL)

printf( "Invalid parameter: mode\n");

return 1;

else

printf( "Default Mode is %s\n", mode == _O_TEXT ? "text" :

"binary");

err = _set_fmode(_O_BINARY);

if (err == EINVAL)

printf( "Invalid mode.\n");

return 1;

if ( _sopen_s(&fd, filename, _O_RDWR | _O_CREAT, _SH_DENYNO, _S_IWRITE |


_S_IREAD) != 0 )

printf( "Error opening the file %s\n", filename);

return 1;

if (ret = _write(fd, buf, 12*sizeof(int)) < 12*sizeof(int))

printf( "Problem writing to the file %s.\n", filename);

printf( "Number of bytes written: %d\n", ret);

if (_close(fd) != 0)
{

printf("Error closing the file %s. Error code %d.\n",

filename, errno);

system("type fmode.out");

Output

Default Mode is binary

A B C D E F G H I J K L

См. также раздел


_fmode

_get_fmode

_setmode

Файловый ввод-вывод в текстовом и двоичном режиме


_set_invalid_parameter_handler ,
_set_thread_local_invalid_parameter_ha
ndler
Статья • 03.04.2023

Устанавливает функцию для вызова, когда CRT обнаруживает недопустимый


аргумент.

Синтаксис
C

_invalid_parameter_handler _set_invalid_parameter_handler(

_invalid_parameter_handler pNew

);

_invalid_parameter_handler _set_thread_local_invalid_parameter_handler(

_invalid_parameter_handler pNew

);

Параметры
pNew

Указатель на функцию нового обработчика недопустимого параметра.

Возвращаемое значение
Указатель на обработчик недопустимого параметра до вызова.

Комментарии
Многие функции времени выполнения C проверяют допустимость аргументов,
передаваемых в них. Если передается недопустимый аргумент, функция может
установить номер ошибки errno или вернуть код ошибки. В таких случаях также
вызывается обработчик недопустимого параметра. Среда выполнения C
предоставляет глобальный обработчик недопустимых параметров по умолчанию,
который завершает программу и отображает сообщение об ошибке среды
выполнения. Можно использовать _set_invalid_parameter_handler , чтобы задать
собственную функцию в качестве глобального обработчика недопустимых
параметров. Среда выполнения C также поддерживает локальный обработчик
недопустимых параметров потока. Если локальный обработчик недопустимых
параметров потока задан для потока с помощью
_set_thread_local_invalid_parameter_handler , функции среды выполнения C,
вызванные из потока, используют этот обработчик вместо глобального
обработчика. Только одну функцию можно указать в качестве глобального
обработчика недопустимых аргументов единовременно. Только одну функцию
можно указать в качестве локального обработчика недопустимых аргументов для
одного потока, но различные потоки могут иметь разные локальные обработчики
потоков. Локальные обработчики потоков позволяют изменять обработчик,
используемый в одной части кода, не влияя на поведение других потоков.

Когда среда выполнения вызывает функцию обработки недопустимого параметра,


это обычно означает, что возникла неисправимая ошибка. Указанная функция
обработчика недопустимого параметра должна сохранить все данные, которые
возможно сохранить, и затем прерваться. Функция main не должна возвращать
управление, если вы не уверены, что ошибка может быть исправлена.

Функция обработчика недопустимого параметра должна иметь следующий


прототип:

void _invalid_parameter(

const wchar_t * expression,

const wchar_t * function,

const wchar_t * file,

unsigned int line,

uintptr_t pReserved

);

Аргумент expression  — это двухбайтовое строковое представление выражения


аргумента, вызвавшего ошибку. Аргумент function  — имя функции CRT, которая
получила недопустимый аргумент. Аргумент file  — имя исходного файла CRT,
содержащего функцию. Аргумент line  — номер строки в этом файле. Последний
аргумент зарезервирован. Все параметры имеют значение NULL , если не
используется отладочная версия библиотеки CRT.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный
заголовок

_set_invalid_parameter_handler , C: <stdlib.h>

_set_thread_local_invalid_parameter_handler
C++: <cstdlib> или
<stdlib.h>

Функции _set_invalid_parameter_handler и
_set_thread_local_invalid_parameter_handler относятся к корпорации Майкрософт.

Сведения о совместимости см. в разделе Совместимость.

Пример
В следующем примере обработчик ошибок недопустимого параметра
используется для печати функции, которая получила недопустимый параметр, и
файла и строки в источниках CRT. При использовании отладочной библиотеки CRT
ошибки недопустимых параметров также вызывают утверждение, которое в этом
примере отключено с помощью _CrtSetReportMode.

// crt_set_invalid_parameter_handler.c

// compile with: /Zi /MTd

#include <stdio.h>

#include <stdlib.h>

#include <crtdbg.h> // For _CrtSetReportMode

void myInvalidParameterHandler(const wchar_t* expression,

const wchar_t* function,

const wchar_t* file,


unsigned int line,

uintptr_t pReserved)
{

wprintf(L"Invalid parameter detected in function %s."

L" File: %s Line: %d\n", function, file, line);

wprintf(L"Expression: %s\n", expression);

abort();

int main( )

char* formatString;

_invalid_parameter_handler oldHandler, newHandler;

newHandler = myInvalidParameterHandler;

oldHandler = _set_invalid_parameter_handler(newHandler);

// Disable the message box for assertions.

_CrtSetReportMode(_CRT_ASSERT, 0);

// Call printf_s with invalid parameters.

formatString = NULL;

printf(formatString);

Output

Invalid parameter detected in function common_vfprintf. File:


minkernel\crts\ucrt\src\appcrt\stdio\output.cpp Line: 32

Expression: format != nullptr

См. также раздел


_get_invalid_parameter_handler, _get_thread_local_invalid_parameter_handler

Версии функций CRT повышенной безопасности

errno, _doserrno, _sys_errlistи _sys_nerr


setjmp
Статья • 03.04.2023

Сохраняет текущее состояние программы.

Синтаксис
C

int setjmp(

jmp_buf env

);

Параметры
env

Переменная, в которой хранится среда.

Возвращаемое значение
Возвращает 0 после сохранения среды стека. Если setjmp возвращается из-за
longjmp вызова, он возвращает value аргумент или если value аргумент

longjmp longjmp имеет значение 0, setjmp возвращает значение 1. Ошибка не


возвращается.

Комментарии
Функция setjmp сохраняет среду стека, которую можно впоследствии восстановить
с помощью функции longjmp . При совместном использовании функции setjmp и
longjmp предоставляют способ выполнения нелокального goto . Они обычно
используются для передачи управления выполнением в код обработки ошибок
или восстановления в ранее называемой подпрограмме без использования
обычных соглашений о вызовах или возвратах.

Вызов функции setjmp сохраняет текущую среду стека в параметре env .


Последующий вызов функции longjmp восстанавливает сохраненную среду и
возвращает управление в точку, следующую сразу за соответствующим вызовом
функции setjmp . Все переменные (за исключением регистровых переменных),
доступные для получившей управление подпрограммы, содержат те значения,
которые они имели при вызове функции longjmp .

Невозможно использовать setjmp для перехода от машинного кода к


управляемому коду.

Блок, относящийся только к системам Microsoft

В коде Microsoft C++ в Windows longjmp используется та же семантика очистки


стека, что и код обработки исключений. Безопасно использовать в том же месте,
где могут возникать исключения C++. Однако это использование не является
переносимым и поставляется с некоторыми важными предостережениями.
Дополнительные сведения см. в разделе longjmp.

Завершение блока, относящегося только к системам Майкрософт

7 Примечание

В переносимом коде C++ нельзя предполагать setjmp и longjmp


поддерживать семантику объектов C++. В частности, setjmp / longjmp пара
вызовов не определена при замене setjmp и longjmp catch вызове throw
любых нетривиальных деструкторов для любых автоматических объектов. В
программах C++ рекомендуется использовать механизм обработки
исключений C++.

Дополнительные сведения см. в разделе "Использование setjmp и longjmp".

Требования
Подпрограмма Обязательный заголовок

setjmp <setjmp.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _fpreset.

См. также раздел


Управление процессами и средой

longjmp
setlocale , _wsetlocale
Статья • 20.04.2023

Устанавливает или извлекает языковой стандарт времени выполнения.

Синтаксис
C

char *setlocale(

int category,

const char *locale

);

wchar_t *_wsetlocale(

int category,

const wchar_t *locale

);

Параметры
category

Категория, на которую влияет языковой стандарт.

locale

Указатель языкового стандарта.

Возвращаемое значение
Если задано допустимое locale значение и category , функции возвращают
указатель на строку, связанную с указанными locale и category .
locale Если
аргумент имеет значение NULL , функции возвращают текущий языковой стандарт.

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


NULL значение .
Поведение недопустимых аргументов выглядит следующим

образом:

Функция недопустимый Вызов недопустимого обработчика, как Задает


параметр. описано в разделе Проверка параметров errno

setlocale category да да
Функция недопустимый Вызов недопустимого обработчика, как Задает
параметр. описано в разделе Проверка параметров errno

setlocale locale нет нет

_wsetlocale category да да

_wsetlocale locale нет нет

Вызов

setlocale( LC_ALL, "en-US" );

задает все категории, возвращая только строку

Output

en-US

Можно скопировать строку, возвращенную setlocale , для восстановления этой


части данных о языковом стандарте программы. Глобальное или локальное
хранилище потока используется для строки, возвращаемой setlocale .
Последующие вызовы setlocale перезаписывают эту строку, что аннулирует
указатели строк, возвращенные предыдущими вызовами.

Комментарии
Используйте функцию setlocale для задания, изменения или получения некоторой
или всей информации о языковом стандарте текущей программы, определяемой
locale и category . locale ссылается на расположение (страну или регион и язык),

для которого можно настраивать определенные аспекты программы. К некоторым


категориям, зависящим от языкового стандарта, относится формат дат и
отображения денежных значений. Если для locale задается строка по умолчанию
для языка с несколькими формами, которые поддерживаются на вашем
компьютере, необходимо проверять возвращаемое значение setlocale , чтобы
узнать, какой язык применяется. Например, если для параметра задано
locale "chinese" возвращаемое значение, может быть или "chinese-

traditional" "chinese-simplified" .
_wsetlocale — это версия с расширенными символами для setlocale ; аргумент

locale и возвращаемое значение _wsetlocale являются строками с расширенными


символами. Поведение _wsetlocale и setlocale идентично в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tsetlocale setlocale setlocale _wsetlocale

Аргумент category указывает части информации о языковом стандарте программы,


которые подвергаются влиянию. Макросы, используемые для category и части
программы, на которые они оказывают, указаны ниже.

Флаг category Область применения

LC_ALL Все категории, перечисленные ниже.

LC_COLLATE Функции strcoll , _stricoll , wcscoll , _wcsicoll , strxfrm , _strncoll ,


_strnicoll , _wcsncoll , _wcsnicoll и wcsxfrm .

LC_CTYPE Функции обработки символов (за исключением isdigit , isxdigit , mbstowcs


и mbtowc , которые не затрагиваются).

LC_MONETARY Информация о форматировании денежных значений, возвращаемая


функцией localeconv .

LC_NUMERIC Символ десятичной запятой для форматированных выходных подпрограмм


(например printf , ), для подпрограмм преобразования данных и для
сведений о форматировании, возвращаемых методом localeconv . В
дополнение к десятичному символу, задает разделитель разрядов и строку
управления группировкой, LC_NUMERIC возвращаемую localeconv.

LC_TIME Функции strftime и wcsftime .

Эта функция проверяет параметр категории. Если параметр category не является


одним из значений, приведенных в предыдущей таблице, вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
выполнение может быть продолжено, эта функция задает для errno значение
EINVAL и возвращает NULL .
Аргумент locale является указателем на строку, которая задает языковой стандарт.
Сведения о формате аргумента см. в locale разделах Названия языкового
стандарта, Языки и Строки стран и регионов. Если locale указывает на пустую
строку, языковой стандарт соответствует исходной среде, определенной
реализацией. Значение C задает минимальную подходящую ANSI среду для
переноса C. Языковой стандарт C предполагает, что все типы данных char
соответствуют 1 байту, а их значение всегда меньше 256.

При запуске программы выполняется эквивалент следующего оператора:

setlocale( LC_ALL, "C" );

Аргумент locale может принимать имя языкового стандарта, строковую


переменную с названием языка, строковую переменную с названием языка и код
страны или региона, кодовую страницу или строковую переменную с названием
языка, код страны или региона и кодовую страницу. Доступные имена языковых
стандартов, языки, коды стран или регионов и кодовая страница включают все те,
которые поддерживаются API windows NLS. Набор имен языковых стандартов,
поддерживаемых setlocale , описан в разделах Имена языков, Языки и Строки
стран и регионов. Набор строк языка и страны или региона, поддерживаемых
setlocale , перечислены в языковых строках и строках страны или региона.

Рекомендуется использовать форму имени языкового стандарта для обеспечения


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

Указатель null, который передается в качестве аргумента locale , указывает


setlocale выполнить запрос, а не задать международную среду. locale Если

аргумент является пустым указателем, текущий языковой стандарт программы не


изменяется. Вместо этого setlocale возвращает указатель на строку, связанную с
category текущего языкового стандарта этого потока. Если аргумент category имеет

значение LC_ALL , функция возвращает строку, которая указывает текущий


параметр каждой категории с разделением точкой с запятой. Например,
последовательность вызовов

// Set all categories and return "en-US"

setlocale(LC_ALL, "en-US");

// Set only the LC_MONETARY category and return "fr-FR"

setlocale(LC_MONETARY, "fr-FR");

printf("%s\n", setlocale(LC_ALL, NULL));

возвращает

Output

LC_COLLATE=en-US;LC_CTYPE=en-US;LC_MONETARY=fr-FR;LC_NUMERIC=en-
US;LC_TIME=en-US

и это строка, связанная с категорией LC_ALL .

Следующие примеры относятся к категории LC_ALL . Любая из строк . OCP" и ". ACP"
можно использовать вместо номера кодовой страницы, чтобы указать
использование пользовательской кодовой страницы OEM и пользовательской
кодовой страницы ANSI по умолчанию для этого имени языкового стандарта
соответственно.

setlocale( LC_ALL, "" );

Задает языковой стандарт по умолчанию, т.е. заданную по умолчанию для


пользователя кодовую страницу ANSI, полученную от операционной системы.
Для имени языкового стандарта задается значение, возвращаемое
GetUserDefaultLocaleName. Кодовая страница имеет значение, возвращаемое
GetACP.

setlocale( LC_ALL, ".OCP" );

Задает языковой стандарт для текущей кодовой страницы OEM, полученной


из операционной системы. Для имени языкового стандарта задается значение,
возвращаемое GetUserDefaultLocaleName. Кодовая страница имеет
LOCALE_IDEFAULTCODEPAGE значение для имени пользовательского языкового
стандарта по умолчанию с помощью GetLocaleInfoEx.

setlocale( LC_ALL, ".ACP" );

Задает языковой стандарт согласно текущей кодовой странице ANSI,


полученной от операционной системы. Для имени языкового стандарта
задается значение, возвращаемое GetUserDefaultLocaleName. Кодовая
страница имеет LOCALE_IDEFAULTANSICODEPAGE значение для имени
пользовательского языкового стандарта по умолчанию с помощью
GetLocaleInfoEx.

setlocale( LC_ALL, "<localename>" );


Задает для языкового стандарта имя языкового стандарта, указываемое
параметром <localename> . Кодовая страница имеет
LOCALE_IDEFAULTANSICODEPAGE значение для указанного имени языкового
стандарта с помощью GetLocaleInfoEx.

setlocale( LC_ALL, "<language>_<country>" );

Задает язык и страну или регион, указанные <language> в и <country> , а также


кодовую страницу по умолчанию, полученную из операционной системы
узла. Кодовая страница имеет LOCALE_IDEFAULTANSICODEPAGE значение для
указанного имени языкового стандарта с помощью GetLocaleInfoEx.

setlocale( LC_ALL, "<language>_<country>.<code_page>" );

Задает язык, страну или регион и кодовую страницу, указанные


<language> строками , <country> и <code_page> . Можно использовать
различные сочетания языка, страны или региона и кодовой страницы.
Например, этот вызов устанавливает языковой стандарт "французский
(Канада)" с кодовой страницей 1252.

setlocale( LC_ALL, "French_Canada.1252" );

Этот вызов устанавливает языковой стандарт "французский (Канада)" с


кодовой страницей по умолчанию ANSI.

setlocale( LC_ALL, "French_Canada.ACP" );

Этот вызов устанавливает языковой стандарт "французский (Канада)" с


кодовой страницей по умолчанию OEM.

setlocale( LC_ALL, "French_Canada.OCP" );

setlocale( LC_ALL, "<language>" );

Задает язык, указанный <language> в параметре , и использует страну или


регион по умолчанию для указанного языка и кодовую страницу ANSI по
умолчанию для этой страны или региона, полученную из операционной
системы узла. Например, следующие вызовы setlocale функционально
эквивалентны:

setlocale( LC_ALL, "en-US" );

setlocale( LC_ALL, "English" );

setlocale( LC_ALL, "English_United States.1252" );


Рекомендуется использовать первую форму для обеспечения
производительности и простоты обслуживания.

setlocale( LC_ALL, ".<code_page>" );

Задает для кодовой страницы значение, указанное в параметре <code_page> , а


также страну или регион по умолчанию и язык (в соответствии с
определением операционной системы узла) для указанной кодовой страницы.

Эта категория должна быть LC_ALL или LC_CTYPE для реализации изменения
кодовой страницы. Например, если страной или регионом по умолчанию и языком
операционной системы узла являются " United States " и " English ", следующие два
вызова setlocale функционально эквивалентны:

setlocale( LC_ALL, ".1252" );

setlocale( LC_ALL, "English_United States.1252");

Дополнительные сведения см. в директиве setlocale pragma в справочнике по


препроцессору C/C++.

Функция _configthreadlocale используется для управления тем, влияет ли setlocale


языковой стандарт всех потоков в программе или только языковой стандарт
вызывающего потока.

Поддержка UTF-8.
Начиная с Windows 10 версии 1803 (10.0.17134.0), универсальная среда выполнения
C поддерживает использование кодовой страницы UTF-8. Это изменение означает,
что строки, char передаваемые в функции среды выполнения C, могут ожидать
строк в кодировке UTF-8. Чтобы включить режим UTF-8, используйте ".UTF8" в
качестве кодовой страницы при использовании setlocale . Например,
setlocale(LC_ALL, ".UTF8") использует текущую кодовую страницу WINDOWS ANSI
(ACP) по умолчанию для языкового стандарта и UTF-8 для кодовой страницы.

Строка для указания режима UTF-8:

Не учитывает регистр.
дефис ( - ) является необязательным
Он должен находиться в кодовой странице имени языкового стандарта,
поэтому должен иметь начальную точку ( . ), как показано в следующих
примерах: "en_US.UTF8" или ".utf8"
В следующих примерах показано, как указать строку UTF-8:

".UTF8"

".UTF-8"

".utf8"

".utf-8"

"en_us.utf8"

"ja_JP.Utf-8"

После вызова setlocale(LC_ALL, ".UTF8") можно передать "😊" в mbtowcs , и он


будет правильно преобразован в wchar_t строку. Ранее для этого перевода не
было параметров языкового стандарта.

Режим UTF-8 также включен для функций, которые имеют исторически


переведенные char строки с помощью кодовой страницы Windows ANSI по
умолчанию (ACP). Например, при вызове _mkdir("😊") кодовой страницы UTF-8
будет правильно создаваться каталог с этим эмодзи в качестве имени папки, а не
требовать, чтобы ACP был изменен на UTF-8 перед запуском программы.
Аналогичным образом, вызов _getcwd() в этой папке возвращает строку в
кодировке UTF-8. Для обеспечения совместимости ACP по-прежнему используется,
если для кодовой страницы C не задано значение UTF-8.

Следующие аспекты среды выполнения C не могут использовать UTF-8, так как они
задаются во время запуска программы и должны использовать кодовую страницу
WINDOWS ANSI (ACP) по умолчанию: __argv, _acmdlnи _pgmptr.

Ранее эта поддержкаmbrtoc16, , mbrtoc32,c16rtomb и c32rtomb существовала для


перевода между узкими строками UTF-8, UTF-16 (та же кодировка, что wchar_t и на
платформах Windows) и UTF-32. В целях совместимости эти API по-прежнему
преобразуют только в UTF-8 и из них, а не кодовую страницу, заданную через
setlocale .

Чтобы использовать эту функцию в ОПЕРАЦИОННОй системе до Windows 10,


необходимо использовать локальное развертывание приложения или статически
связать с помощью windows SDK версии 1803 (10.0.17134.0). Для Windows 10
операционных систем до версии 1803 (10.0.17134.0) поддерживается только
статическая компоновка.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

setlocale <locale.h>

_wsetlocale <locale.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_setlocale.c

//

// This program demonstrates the use of setlocale when

// using two independent threads.


//

#include <locale.h>

#include <process.h>

#include <windows.h>

#include <stdio.h>

#include <time.h>

#define BUFF_SIZE 100

// Retrieve the date in the current

// locale's format.

int get_date(unsigned char* str)

__time64_t ltime;

struct tm thetime;

// Retrieve the current time

_time64(&ltime);

_gmtime64_s(&thetime, &ltime);

// Format the current time structure into a string

// "%#x" is the long date representation in the

// current locale

if (!strftime((char *)str, BUFF_SIZE, "%#x",

(const struct tm *)&thetime))

printf("strftime failed!\n");

return -1;

return 0;

// This thread sets its locale to the argument

// and prints the date.

uintptr_t __stdcall SecondThreadFunc( void* pArguments )


{

unsigned char str[BUFF_SIZE];

char * locale = (char *)pArguments;

// Set the thread locale

printf("The thread locale is now set to %s.\n",

setlocale(LC_ALL, locale));

// Retrieve the date string from the helper function

if (get_date(str) == 0)

printf("The date in %s locale is: '%s'\n", locale, str);

_endthreadex( 0 );

return 0;

// The main thread sets the locale to English

// and then spawns a second thread (above) and prints the date.

int main()

HANDLE hThread;

unsigned threadID;

unsigned char str[BUFF_SIZE];

// Enable per-thread locale causes all subsequent locale

// setting changes in this thread to only affect this thread.

_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);

// Set the locale of the main thread to US English.

printf("The thread locale is now set to %s.\n",

setlocale(LC_ALL, "en-US"));

// Create the second thread with a German locale.

// Our thread function takes an argument of the locale to use.


hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc,

"de-DE", 0, &threadID );

if (get_date(str) == 0)

// Retrieve the date string from the helper function

printf("The date in en-US locale is: '%s'\n\n", str);

// Wait for the created thread to finish.

WaitForSingleObject( hThread, INFINITE );

// Destroy the thread object.


CloseHandle( hThread );

Output

The thread locale is now set to en-US.

The time in en-US locale is: 'Wednesday, May 12, 2004'

The thread locale is now set to de-DE.

The time in de-DE locale is: 'Mittwoch, 12. Mai 2004'

См. также раздел


Имена языкового стандарта, языки и строки страны или региона

_configthreadlocale

_create_locale, _wcreate_locale

Локаль

localeconv

_mbclen, mblen, _mblen_l

strlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

_setmbcp

Функции strcoll

strftime, wcsftime, _strftime_l, _wcsftime_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l

wcstombs, _wcstombs_l

wctomb, _wctomb_l
_setmaxstdio
Статья • 03.04.2023

Задает максимальное число одновременно открытых файлов на уровне


потокового ввода-вывода.

Синтаксис
C

int _setmaxstdio(

int new_max

);

Параметры
new_max

Новое максимальное число одновременно открытых файлов на уровне потокового


ввода-вывода.

Возвращаемое значение
Возвращает значение new_max в случае успешного выполнения; значение -1 в
противном случае.

Если new_max значение меньше _IOB_ENTRIES или больше максимального


количества дескрипторов, доступных в операционной системе, вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, эта функция возвращает
-1 и задает для errno значение EINVAL .

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno,


_doserrno_sys_errlistи _sys_nerr.

Комментарии
Функция _setmaxstdio изменяет максимальное значение количества файлов,
которые могут быть открыты одновременно на уровне потокового ввода-вывода.
Ввод-вывод среды выполнения C теперь поддерживает до 8192 одновременно
открытых файлов на низком уровне ввода-вывода. Этот уровень включает файлы,
открытые и доступные с помощью _open функций ввода-вывода _read , а также
_write семейства функций ввода-вывода. По умолчанию на уровне потокового
ввода-вывода может быть открыто одновременно 512 файлов. Этот уровень
включает файлы, открытые и доступные с помощью fopen и fputc fgetc семейства
функций. Ограничение в 512 открытых файлов на уровне потокового ввода-вывода
можно увеличить до максимум 8192, используя функцию _setmaxstdio .

Так как функции уровня потокового ввода-вывода, такие как fopen , основаны на
низком уровне операций ввода-вывода, максимальное значение 8192 является
жестким верхним пределом для количества одновременно открытых файлов,
доступ к которых осуществляется через библиотеку времени выполнения C.

7 Примечание

Это пороговое значение может превышать ограничения, поддерживаемые


определенной конфигурацией и платформой Win32.

Требования
Подпрограмма Обязательный заголовок

_setmaxstdio <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. _getmaxstdio с примером использования _setmaxstdio .

См. также раздел


Потоковый ввод-вывод
_setmbcp
Статья • 03.04.2023

Задает новую многобайтовую кодовую страницу.

Синтаксис
C

int _setmbcp(

int codepage

);

Параметры
codepage

Новая кодовая страница для независимых от языкового стандарта многобайтовых


подпрограмм.

Возвращаемое значение
Возвращает 0, если кодовая страница задана успешно. Если для задано
codepage недопустимое значение кодовой страницы , возвращается значение -1, а
параметр кодовой страницы не изменяется. Устанавливает параметр errno в
EINVAL , если происходит сбой выделения памяти.

Комментарии
Функция _setmbcp задает новую многобайтовую кодовую страницу. По умолчанию
система времени выполнения автоматически устанавливает в качестве
многобайтовой кодовой страницы кодовую страницу ANSI, используемую в
системе по умолчанию. Параметр многобайтовой кодовой страницы влияет на все
многобайтовые подпрограммы, которые не зависят от языкового стандарта.
Однако можно указать _setmbcp использовать кодовую страницу, определенную
для текущего языкового стандарта (см. следующий список констант манифеста и
связанных результатов поведения). Список многобайтовых подпрограмм,
зависящих от кодовой страницы языкового стандарта, а не от многобайтовой
кодовой страницы, см. в разделе Интерпретация многобайтовых
последовательностей символов.

Для аргумента codepage может быть установлено одно из следующих значений:

_MB_CP_ANSI  Используется кодовая страница ANSI, полученная от


операционной системы при запуске программы.

_MB_CP_LOCALE Используйте кодовую страницу текущего языкового стандарта,

полученную при предыдущем вызове setlocale.

_MB_CP_OEM  Используется кодовая страница OEM, полученная от

операционной системы при запуске программы.

_MB_CP_SBCS  Используется однобайтовая кодовая страница. Если для кодовой

страницы задано значение _MB_CP_SBCS , подпрограмма, например , _ismbblead


всегда возвращает значение false.

_MB_CP_UTF8 Используйте UTF-8. Если для кодовой страницы задано значение

_MB_CP_UTF8 , подпрограмма, например , _ismbblead всегда возвращает


значение false.

Любое другое допустимое значение кодовой страницы, независимо от того,


является ли значение ANSI, OEM или другой поддерживаемой операционной
системой кодовой страницей (кроме UTF-7, которая не поддерживается).

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_setmbcp <mbctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_getmbcp

setlocale, _wsetlocale
setmode
Статья • 03.04.2023

Имя setmode функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _setmode функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _setmode . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_setmode
Статья • 03.04.2023

Задает режим преобразования файлов.

Синтаксис
C

int _setmode (

int fd,

int mode

);

Параметры
fd

Дескриптор файла.

mode

Новый режим преобразования.

Возвращаемое значение
При успешном выполнении возвращает предыдущий режим преобразования.

Если в эту функцию передаются недопустимые параметры, вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение разрешено продолжать, эта функция возвращает значение -1 и задает
errno EBADF значение ", которое указывает на недопустимый дескриптор файла" или

EINVAL указывает на недопустимый mode аргумент.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция _setmode задает в качестве параметра mode режим преобразования файла,
заданный fd . При передаче _O_TEXT как параметра mode задается текстовый
(преобразованный) режим. Комбинации перевода строки возврата каретки (CR-LF)
превратятся в один символ канала строки для входных данных. Символы перевода
строки преобразуются в комбинацию CR-LF в выводе. Передача _O_BINARY задает
двоичный режим (без преобразования), в котором такие преобразования
подавляются.

Вы также можете передать _O_U16TEXT _O_U8TEXT или _O_WTEXT включить режим


Юникода, как показано во втором примере далее в этом документе.

U Внимание!

Режим Юникода предназначен для расширенных функций печати (например,


wprintf ) и не поддерживается для узких функций печати. Использование узкой

функции печати в потоке режима Юникода активирует утверждение.

_setmode , как правило, используется для изменения режима преобразования stdin


и stdout по умолчанию, однако ее можно использовать для любого файла. Если вы
применяете функцию _setmode к дескриптору файла для потока, ее необходимо
вызывать _setmode до выполнения любых операций ввода или вывода в потоке.

U Внимание!

Если вы записываете данные в файловый поток, перед изменением режима


явным fflush _setmode образом очищайте код. Если не выполнить сброс кода,
может возникнуть непредвиденное поведение. Если данные не записывались в
поток, выполнять сброс кода не нужно.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок Необязательные заголовки

_setmode <io.h> <fcntl.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример. Использование _setmode для
изменения stdin
C

// crt_setmode.c

// This program uses _setmode to change

// stdin from text mode to binary mode.

#include <stdio.h>

#include <fcntl.h>

#include <io.h>

int main( void )

int result;

// Set "stdin" to have binary mode:

result = _setmode( _fileno( stdin ), _O_BINARY );

if( result == -1 )

perror( "Cannot set mode" );

else

printf( "'stdin' successfully changed to binary mode\n" );

Output

'stdin' successfully changed to binary mode

Пример. Использование _setmode для


изменения stdout
C

// crt_setmodeunicode.c

// This program uses _setmode to change

// stdout to Unicode. Cyrillic and Ideographic

// characters will appear on the console (if

// your console font supports those character sets).

#include <fcntl.h>

#include <io.h>

#include <stdio.h>

int main(void) {

_setmode(_fileno(stdout), _O_U16TEXT);

wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");

return 0;

См. также раздел


Обработка файлов

_creat, _wcreat

fopen, _wfopen

_open, _wopen

_set_fmode
_set_new_handler
Статья • 03.04.2023

Передает управление механизму обработки ошибок, если оператору new не


удается выделить память. Компилятор Microsoft C++ использует эту функцию для
реализации std::set_new_handler в стандартной библиотеке.

Синтаксис
C++

_PNH _set_new_handler( _PNH pNewHandler );

Параметры
pNewHandler

Указатель на предоставленную приложением функцию обработки памяти.


Аргумент 0 или nullptr приводит к удалению нового обработчика.

Возвращаемое значение
Возвращает указатель на предыдущую функцию обработки исключений,
зарегистрированную функцией _set_new_handler , чтобы предыдущую функцию
можно было впоследствии восстановить. Если предыдущая функция не задана,
возвращаемое значение можно использовать для восстановления поведения по
умолчанию. Это значение может быть nullptr или 0.

Комментарии
Функция C++ _set_new_handler определяет функцию обработки исключений,
которая получает управление, если оператор new не смог выделить память. Если
оператор new завершается ошибкой, система времени выполнения автоматически
вызывает функцию обработки исключений, которая была передана в качестве
аргумента в функцию _set_new_handler . _PNH , определенный в <new.h> , является
указателем на функцию, которая возвращает тип int и принимает аргумент типа
size_t . Используйте size_t для определения объема выделяемого пространства.

Обработчик по умолчанию отсутствует.


_set_new_handler фактически является схемой сборки мусора. Система времени

выполнения делает попытку выделения памяти каждый раз, когда


пользовательская функция возвращает ненулевое значение, и завершается
неудачей, если пользовательская функция возвращает 0.

Вхождение функции _set_new_handler в программе регистрирует в системе


времени выполнения функцию обработчика исключения, указанную в списке
аргументов:

C++

// _set_new_handler1.cpp

#include <new.h>

int handle_program_memory_depletion( size_t )

// Your code

int main( void )

_set_new_handler( handle_program_memory_depletion );

int *pi = new int[BIG_NUMBER];

По умолчанию _set_new_handler глобальное состояние функции ограничивается


приложением. Чтобы изменить его, просмотрите глобальное состояние в CRT.

Можно сохранить адрес функции, которая была передан последней в функцию


_set_new_handler , и восстановить ее позже:

C++

_PNH old_handler = _set_new_handler( my_handler );

// Code that requires my_handler

// . . .

_set_new_handler( old_handler )

// Code that requires old_handler

// . . .

Функция C++ _set_new_mode задает новый режим обработчика для malloc. Новый
режим обработки указывает, должна ли функция malloc при сбое вызывать новую
подпрограмму обработчика, заданную функцией _set_new_handler . По умолчанию
malloc не вызывает новую подпрограмму обработчика при сбое выделения

памяти. Можно переопределить это поведение по умолчанию, чтобы в случае сбоя


предоставления памяти функцией malloc функция malloc вызывала новую
подпрограмму обработчика таким же образом, как это делает оператор new при
сбое по той же причине. Чтобы переопределить значение по умолчанию, вызовите
_set_new_mode(1); на ранней стадии программы или свяжите с newmode.obj .

Если указан пользователь operator new , новые функции обработчика не


вызываются автоматически при сбое.

Дополнительные сведения смnew. в справочнике по языку C++ и delete в ней.

Существует один _set_new_handler обработчик для всех динамически связанных


библиотек DLL или исполняемых файлов в одном процессе. Даже при вызове
_set_new_handler обработчик может быть заменен другим. Кроме того, новый
обработчик может заменить обработчик, заданный другой библиотекой DLL или
исполняемым файлом в процессе.

Требования
Компонент Обязательный заголовок

_set_new_handler <new.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
В этом примере при сбое выделения элемент управления передается MyNewHandler в
. Переданный аргумент MyNewHandler — это число запрошенных байтов.
Возвращаемое MyNewHandler значение является флагом, указывающим, следует ли
повторить выделение: ненулевое значение указывает, что необходимо повторить
выделение, а нулевое значение указывает, что выделение завершилось сбоем.

C++

// crt_set_new_handler.cpp

// Build for x86.

// WARNING: This code intentionally allocates memory until an allocation


fails.

// Running this code can cause your system to become non-responsive.

#include <iostream>

#include <new>

#include <new.h>

static const int Big_number = 0x03FFFFFF;

struct MemoryHog {

int pork[Big_number];

};

class MemoryReserve {

MemoryHog* reserved = nullptr;

public:

MemoryReserve() {

reserved = new MemoryHog();

~MemoryReserve() noexcept {

if (reserved != nullptr)

delete reserved;

bool free_reserve() noexcept {

if (reserved != nullptr) {

delete reserved;

reserved = nullptr;

return true; // return true if memory freed

return false; // reserved memory exhausted.

};

// Global singleton for a MemoryReserve object

static MemoryReserve reserve{};

// Define a function to be called if new fails to allocate memory.

int MyNewHandler(size_t /* unused */)

// Call a function to recover some heap space. Return 1 on success.

if (reserve.free_reserve()) {

std::cerr << "MyNewHandler: Released reserved memory.\n";

return 1;

std::cerr << "MyNewHandler: Reserved memory exhausted.\n";

return 0;

static const int max_depth = 16; // recursion depth limiter

static int depth = 0;

void RecurseAlloc() {

MemoryHog* piggy = new MemoryHog{};

if (++depth < max_depth) // Recurse until memory exhausted or max_depth

RecurseAlloc();

depth--;

delete piggy;

return;

int main()

try {

_set_new_handler(MyNewHandler); // Set handler for new.

RecurseAlloc();

catch (std::bad_alloc& ex) {

std::cerr << "bad_alloc caught: " << ex.what() << '\n';

/* Output:

MyNewHandler: Released reserved memory.

MyNewHandler: Reserved memory exhausted.

bad_alloc caught: bad allocation

*/

См. также раздел


Выделение памяти

calloc

free

realloc
_set_new_mode
Статья • 03.04.2023

Задает режим обработчика new для malloc .

Синтаксис
C++

int _set_new_mode( int newhandlermode );

Параметры
newhandlermode

new Режим обработчика для malloc ; допустимое значение равно 0 или 1.

Возвращаемое значение
Возвращает предыдущий режим обработчика, заданный для malloc .
Возвращаемое значение 1 указывает, что при сбое выделения памяти, malloc
ранее называемой new подпрограммой обработчика; возвращаемое значение 0
указывает на то, что этого не произошло. newhandlermode Если аргумент не равен 0
или 1, возвращает значение -1.

Комментарии
Функция C++ _set_new_mode задает режим обработчика new для malloc. Режим new
обработчика указывает, следует ли при сбое вызывать подпрограмму new
обработчика, malloc заданную параметром _set_new_handler. По умолчанию
malloc не вызывает подпрограмму обработчика new при сбое выделения памяти.

Это поведение по умолчанию можно переопределить, чтобы в случае malloc сбоя


выделения памяти вызывалась подпрограмма new обработчика так же, malloc как
new и оператор при сбое по той же причине. Дополнительные сведения см. в
операторах new и delete в справочнике по языку C++. Чтобы переопределить
значение по умолчанию, вызовите:

C++
_set_new_mode(1);

на ранних этапах программы или создание ссылки с помощью Newmode.obj (см.


раздел Параметры ссылки).

Эта функция проверяет свои параметры. Если newhandlermode имеет значение,


отличное от 0 или 1, функция вызывает обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если выполнение разрешено
продолжать, _set_new_mode возвращает значение -1 и задает значение
errno EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_set_new_mode <new.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Выделение памяти

calloc

free

realloc

_query_new_handler

_query_new_mode
_set_printf_count_output
Статья • 03.04.2023

Включение или отключение поддержки формата %n в printfфункциях ,


wprintf_printf_l_wprintf_l-family.

Синтаксис
C

int _set_printf_count_output(

int enable

);

Параметры
enable

Ненулевое значение для включения поддержки %n 0 для отключения поддержки


%n .

Значение свойства или возвращаемое


значение
Состояние поддержки %n перед вызовом этой функции: ненулевая, если включена
поддержка %n , 0, если она была отключена.

Комментарии
Из-за соображений безопасности поддержка описателя формата %n по
умолчанию отключена во printf всех его вариантах. Если %n встречается в
спецификации формата, поведение по умолчанию заключается в printf вызове
обработчика недопустимых параметров, как описано в разделе "Проверка
параметров". Вызов _set_printf_count_output с ненулевым аргументом приведет
printf к тому, что функции семейства интерпретируют %n , как описано в

синтаксисе спецификации формата: printf и wprintf функции.

Требования
Подпрограмма Обязательный заголовок

_set_printf_count_output <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_set_printf_count_output.c

#include <stdio.h>

int main()

int e;

int i;

e = _set_printf_count_output( 1 );

printf( "%%n support was %sabled.\n",

e ? "en" : "dis" );

printf( "%%n support is now %sabled.\n",

_get_printf_count_output() ? "en" : "dis" );

printf( "12345%n6789\n", &i ); // %n format should set i to 5

printf( "i = %d\n", i );

Output

%n support was disabled.

%n support is now enabled.

123456789

i = 5

См. также раздел


_get_printf_count_output
_set_se_translator
Статья • 03.04.2023

Задайте функцию обратного вызова для каждого потока для преобразования


исключений Win32 (структурированные исключения C) в типизированные
исключения C++.

Синтаксис
C++

_se_translator_function _set_se_translator(

_se_translator_function seTransFunction

);

Параметры
seTransFunction

Указатель на функцию-преобразователь структурированного исключения языка С,


создаваемую пользователем.

Возвращаемое значение
Возвращает указатель на предыдущую функцию-преобразователь,
зарегистрированную с помощью _set_se_translator , чтобы предыдущую функцию
можно было впоследствии восстановить. Если предыдущая функция не задана,
возвращаемое значение может использоваться для восстановления поведения по
умолчанию; это значение может быть равно nullptr .

Комментарии
Функция _set_se_translator предоставляет способ обработки исключений Win32
(структурированных исключений языка C) как типизированных исключений C++.
Чтобы разрешить обработчику catch языка С++ обрабатывать каждое исключение
языка С, сначала следует определить класс-оболочку исключения языка С, который
(или производный от него класс) может использоваться в качестве атрибута
специального типа класса для исключения языка С. Чтобы использовать этот класс,
требуется установить пользовательскую функцию преобразования исключений
языка C, которая вызывается внутренним механизмом обработки исключением
при каждом возникновении исключения языка C. Внутри функции-
преобразователя можно вызывать любое типизированное исключение, которое
может перехватываться соответствующим блоком catch языка С++.

При использовании _set_se_translator необходимо использовать /EHa параметр .

Чтобы указать пользовательскую функцию перевода, вызовите _set_se_translator ,


используя имя функции перевода в качестве аргумента. Созданная функция-
преобразователь вызывается по одному разу на каждый вызов функции для стека,
имеющего блоки try . Функция перевода по умолчанию отсутствует.

Функция-преобразователь не должна делать ничего другого, кроме вызова


типизированного исключения языка С++. Если она выполняет что-либо, помимо
создания (например, запись в файл журнала), программа может вести себя
неправильно, так как количество вызовов функции переводчика зависит от
платформы.

В многопоточной среде функции-преобразователи поддерживаются отдельно для


каждого потока. Каждый новый поток требует установки собственной функции-
преобразователя. Таким образом, каждый поток владеет собственной обработкой
преобразования. _set_se_translator относится к одному потоку. В другой
библиотеке DLL можно установить другую функцию преобразования.

Функция seTransFunction , которую вы пишете, должна быть скомпилированной в


собственном коде функцией (не скомпилированной с /clr помощью ). В качестве
аргументов она должна принимать целое число без знака и указатель на структуру
Win32 _EXCEPTION_POINTERS . Аргументы являются возвращаемыми значениями
вызовов функций GetExceptionCode и GetExceptionInformation API Win32,
соответственно.

C++

typedef void (__cdecl *_se_translator_function)(unsigned int, struct


_EXCEPTION_POINTERS* );

Для функции _set_se_translator динамическое связывание с CRT может приводить


к определенным последствиям; другая библиотека DLL в процессе может вызвать
функцию _set_se_translator и заменить обработчик собственным.

При использовании _set_se_translator из управляемого кода (скомпилированного


с /clr помощью ) или смешанного машинного и управляемого кода переводчик
влияет на исключения, созданные только в машинном коде. Все управляемые
исключения, созданные в управляемом коде (например, при вызове
System::Exception ), не направляются через функцию переводчика. Исключения,

вызванные в управляемом коде с помощью функции RaiseException Win32 или


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

Требования
Подпрограмма Обязательный заголовок

_set_se_translator <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример: ошибка перехвата __try


исключения
В этом примере выполняется оболочка вызовов для задания структурированного
переводчика исключений и восстановления старого в RAII классе
Scoped_SE_Translator . Этот класс позволяет ввести переводчик для конкретной

области в виде одного объявления. Деструктор класса восстанавливает исходный


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

C++

// crt_settrans.cpp

// compile with: cl /W4 /EHa crt_settrans.cpp

#include <stdio.h>

#include <windows.h>

#include <eh.h>

#include <exception>

class SE_Exception : public std::exception

private:

const unsigned int nSE;

public:

SE_Exception() noexcept : SE_Exception{ 0 } {}

SE_Exception( unsigned int n ) noexcept : nSE{ n } {}

unsigned int getSeNumber() const noexcept { return nSE; }

};

class Scoped_SE_Translator

private:

const _se_translator_function old_SE_translator;

public:

Scoped_SE_Translator( _se_translator_function new_SE_translator )


noexcept

: old_SE_translator{ _set_se_translator( new_SE_translator ) } {}

~Scoped_SE_Translator() noexcept { _set_se_translator( old_SE_translator


); }

};

void SEFunc()

__try

printf( "In __try, about to force exception\n" );

int x = 5;

int y = 0;

int *p = &y;

*p = x / *p;

__finally

printf( "In __finally\n" );

void trans_func( unsigned int u, EXCEPTION_POINTERS* )

throw SE_Exception( u );

int main()

Scoped_SE_Translator scoped_se_translator{ trans_func };

try

SEFunc();

catch( const SE_Exception& e )

printf( "Caught a __try exception, error %8.8x.\n", e.getSeNumber()


);

Output

In __try, about to force exception

In __finally

Caught a __try exception, error c0000094.

Пример: ошибка перехвата SE_Exception


Хотя функциональные возможности, предоставляемые , недоступны в
управляемом _set_se_translator коде, это сопоставление можно использовать в
машинном коде, даже если этот машинный код находится в компиляции в
параметре /clr , если машинный код указан с помощью #pragma unmanaged . Если в
управляемом коде, который должен быть сопоставлен, создается
структурированное исключение, код, который создает и обрабатывает исключение,
должен быть помечен как #pragma unmanaged . В следующем коде показано
возможное использование. Дополнительные сведения см. в разделах Директивы
Pragma и ключевые __pragma слова и _Pragma.

C++

// crt_set_se_translator_clr.cpp

// compile with: cl /W4 /clr crt_set_se_translator_clr.cpp

#include <windows.h>

#include <eh.h>

#include <stdio.h>

#include <exception>

int thrower_func( int i ) {

int y = 0;

int *p = &y;

*p = i / *p;

return 0;

class SE_Exception : public std::exception

private:

const unsigned int nSE;

public:

SE_Exception() noexcept : SE_Exception{ 0 } {}

SE_Exception( unsigned int n ) noexcept : nSE{ n } {}

unsigned int getSeNumber() const noexcept { return nSE; }

};

class Scoped_SE_Translator

private:

const _se_translator_function old_SE_translator;

public:

Scoped_SE_Translator( _se_translator_function new_SE_translator )


noexcept

: old_SE_translator{ _set_se_translator( new_SE_translator ) } {}

~Scoped_SE_Translator() noexcept { _set_se_translator( old_SE_translator


); }

};

#pragma unmanaged

void my_trans_func( unsigned int u, PEXCEPTION_POINTERS )

throw SE_Exception( u );

void DoTest()

try

thrower_func( 10 );

catch( const SE_Exception& e )

printf( "Caught SE_Exception, error %8.8x\n", e.getSeNumber() );

catch(...)

printf( "Caught unexpected SEH exception.\n" );

#pragma managed

int main() {

Scoped_SE_Translator scoped_se_translator{ my_trans_func };

DoTest();

Output

Caught SE_Exception, error c0000094

См. также раздел


Процедуры обработки исключений

set_terminate

set_unexpected

terminate

unexpected\
_set_SSE2_enable
Статья • 03.04.2023

Включает или отключает использование инструкций Streaming SIMD Extensions 2


(SSE2) в математических подпрограммах CRT. (Эта функция недоступна в
архитектуре x64, так как SSE2 включена по умолчанию.)

Синтаксис
C

int _set_SSE2_enable(

int flag

);

Параметры
flag

1 для включения реализации SSE2; 0 для отключения реализации SSE2. По


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

Возвращаемое значение
Ненулевое значение, если реализация SSE2 включена; ноль, если реализация SSE2
отключена.

Комментарии
Следующие функции имеют реализации SSE2, которые могут быть включены с
помощью функции _set_SSE2_enable :

atan

ceil

exp

floor
log

log10

modf

pow

Реализации этих функций в SSE2 могут давать несколько отличные ответы от


реализаций по умолчанию. Промежуточные значения SSE2 — это 64-разрядные
количества с плавающей запятой, но промежуточные значения реализации по
умолчанию — 80-разрядные количества с плавающей запятой.

7 Примечание

Если при компиляции проекта используется параметр компилятора /Oi


(создание встроенных функций), может оказаться, что функция
_set_SSE2_enable не оказывает никакого влияния. Параметр компилятора /Oi
предоставляет компилятору право использовать встроенные функции для
замены вызовов CRT; Это поведение переопределяет эффект _set_SSE2_enable .
Если вы хотите гарантировать, что параметр /Oi не переопределяется
_set_SSE2_enable , используйте /Oi- для компиляции проекта. Это также может

быть полезно при использовании других параметров компилятора, которые


подразумевают /Oi.

Реализация SSE2 используется только в том случае, если все исключения


маскированы. Используйте _control87, _controlfp чтобы маскировать исключения.

Требования
Подпрограмма Обязательный заголовок

_set_SSE2_enable <math.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_set_SSE2_enable.c

// processor: x86

#include <math.h>

#include <stdio.h>

int main()

int i = _set_SSE2_enable(1);

if (i)

printf("SSE2 enabled.\n");

else

printf("SSE2 not enabled; processor does not support SSE2.\n");

Output

SSE2 enabled.

См. также раздел


Файлы среды выполнения C (CRT) и стандартной библиотеки C++ (STL) .lib
set_terminate (CRT)
Статья • 03.04.2023

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


было вызвать с помощью функции terminate .

Синтаксис
C++

terminate_function set_terminate( terminate_function termFunction );

Параметры
termFunction

Указатель на пользовательскую функцию завершения.

Возвращаемое значение
Возвращает указатель на предыдущую функцию, зарегистрированную с помощью
функции set_terminate , чтобы предыдущую функцию можно было впоследствии
восстановить. Если предыдущая функция не была задана, возвращаемое значение
можно использовать для восстановления поведения по умолчанию; Это значение
может иметь значение NULL .

Комментарии
Функция set_terminate устанавливает termFunction как функцию, вызываемую
функцией terminate . Функция set_terminate используется с обработкой
исключений C++ и может быть вызвана в программе в любой момент до
возникновения исключения. По умолчанию terminate вызывает функцию abort.
Это поведение по умолчанию можно изменить, создав собственную функцию
завершения и вызвав функцию set_terminate с именем этой функции в качестве
аргумента. terminate вызывает последнюю функцию, заданную в качестве
аргумента для функции set_terminate . После выполнения любых необходимых
задач termFunction очистки следует выйти из программы. Если он не завершает
работу (если он возвращается к вызывающему объекту), abort вызывается .
В многопоточной среде функции завершения поддерживаются отдельно для
каждого потока. Каждый новый поток требует установки собственной функции
завершения. Таким образом, каждый поток отвечает за собственную обработку
завершения.

Тип terminate_function определен в файле EH.H как указатель на определенную


пользователем функцию завершения, termFunction , возвращающую значение void .
Пользовательская функция termFunction не может принимать аргументы и не
должна возвращаться к вызывающей функции. В противном случае вызывается
функция abort. Создание исключения из функции termFunction невозможно.

C++

typedef void ( *terminate_function )( );

7 Примечание

Функция set_terminate работает только вне отладчика.

Существует один set_terminate обработчик для всех динамически связанных


библиотек DLL или EXEs; даже если вы вызываете set_terminate обработчик, его
можно заменить другим, или вы можете заменить обработчик, заданный другой
библиотекой DLL или EXE.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

set_terminate <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для terminate.
См. также раздел
Процедуры обработки исключений

abort

_get_terminate

set_unexpected

terminate

unexpected
set_unexpected (CRT)
Статья • 03.04.2023

Устанавливает собственную функцию завершения, которая будет вызываться


unexpected .

Синтаксис
C++

unexpected_function set_unexpected( unexpected_function unexpFunction );

Параметры
unexpFunction

Указатель на пользовательскую функцию, которая заменит функцию unexpected .

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

Комментарии
Функция set_unexpected устанавливает unexpFunction как функцию, вызываемую
функцией unexpected . unexpected не используется в текущей реализации обработки
исключений C++. Тип unexpected_function определен в файле EH.H как указатель
на определенную пользователем непредвиденную функцию, unexpFunction ,
возвращающую значение void . Пользовательская unexpFunction функция не
должна возвращаться вызывающей функции.

C++

typedef void ( *unexpected_function )( );

По умолчанию unexpected вызывает функцию terminate . Это поведение по


умолчанию можно изменить, создав собственную функцию завершения и вызвав
функцию set_unexpected с именем этой функции в качестве аргумента. unexpected
вызывает последнюю функцию, заданную в качестве аргумента для функции
set_unexpected .

В отличие от пользовательской функции завершения, установленной с помощью


вызова set_terminate , исключение может быть вызвано из функции unexpFunction .

В многопоточной среде непредвиденные функции поддерживаются отдельно для


каждого потока. Каждый новый поток требует установки собственной
непредвиденной функции. Таким образом, каждый поток отвечает за собственную
обработку непредвиденных функций.

В текущей реализации обработчика исключений C++ Майкрософт unexpected


вызывает terminate по умолчанию и никогда не вызывается из библиотеки
времени выполнения для обработки исключений. Нет особых преимуществ для
вызова unexpected , а не terminate .

Существует один set_unexpected обработчик для всех динамически связанных


библиотек DLL или EXEs. Даже если вызвать set_unexpected обработчик может быть
заменен другим или вы заменяете обработчик, заданный другой библиотекой DLL
или EXE.

Требования
Подпрограмма Обязательный заголовок

set_unexpected <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Процедуры обработки исключений

abort

_get_unexpected

set_terminate

terminate

unexpected\
setvbuf
Статья • 03.04.2023

Управляет потоковой буферизацией и размером буфера.

Синтаксис
C

int setvbuf(

FILE *stream,

char *buffer,

int mode,

size_t size

);

Параметры
stream

Указатель на структуру FILE .

buffer

Выделенный пользователем буфер.

mode

Режим буферизации.

size

Размер буфера в байтах. Допустимый диапазон: 2 <= size <INT_MAX (2147483647).


На внутреннем уровне значение, указанное для size , округляется вниз до
ближайшего числа, кратного 2.

Возвращаемое значение
Возвращает 0 в случае успеха.

Если stream это NULL или mode size нет в допустимом изменении, вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, эта функция возвращает
-1 и задает для errno значение EINVAL .
Сведения об этих и других кодах ошибок см. в разделе errno, и
_doserrno_sys_errlist_sys_nerr.

Комментарии
Функция setvbuf позволяет программе управлять и буферизацией, и размером
буфера для stream . stream должен ссылаться на открытый файл, который не
прошел операцию ввода-вывода с момента его открытия. Массив, на который
указывает buffer указатель, используется в качестве буфера, если
buffer NULL только в этом случае setvbuf используется автоматически выделенный

буфер длины size /2 * 2 байта.

Должен быть установлен режим _IOFBF , _IOLBF , или _IONBF . Если mode имеет
значение _IOFBF или _IOLBF , то size используется в качестве размера буфера. Если
mode это _IONBF так, поток не поддерживается, и оба size buffer и игнорируются.

Переменные для функции mode и их значения:

Значение Значение
mode

_IOFBF Полная буферизация; то есть buffer используется в качестве буфера и size


используется в качестве размера буфера. Если buffer это так NULL , в этом
режиме используется автоматически выделенный буфер длиной size в байтах.

_IOLBF Для некоторых систем этот режим обеспечивает буферизацию строк. Однако
для Win32 такое поведение аналогично _IOFBF , то есть полной буферизации.

_IONBF Буфер не используется, независимо от функций buffer или size .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

setvbuf <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_setvbuf.c

// This program opens two streams: stream1

// and stream2. It then uses setvbuf to give stream1 a

// user-defined buffer of 1024 bytes and stream2 no buffer.

//

#include <stdio.h>

int main( void )

char buf[1024];

FILE *stream1, *stream2;

if( fopen_s( &stream1, "data1", "a" ) == 0 &&

fopen_s( &stream2, "data2", "w" ) == 0 )

if( setvbuf( stream1, buf, _IOFBF, sizeof( buf ) ) != 0 )

printf( "Incorrect type or size of buffer for stream1\n" );

else

printf( "'stream1' now has a buffer of 1024 bytes\n" );

if( setvbuf( stream2, NULL, _IONBF, 0 ) != 0 )

printf( "Incorrect type or size of buffer for stream2\n" );

else

printf( "'stream2' now has no buffer\n" );

_fcloseall();

Output

'stream1' now has a buffer of 1024 bytes

'stream2' now has no buffer

См. также раздел


Потоковый ввод-вывод

fclose, _fcloseall

fflush

fopen, _wfopen

setbuf
signal
Статья • 03.04.2023

Задает обработку сигнала прерывания.

) Важно!

Не используйте этот метод для завершения работы приложения Microsoft


Store, за исключением сценариев тестирования или отладки. Программные
или пользовательские способы закрытия приложения Магазина не
допускаются в соответствии с политиками Microsoft Store. Дополнительные
сведения см. в разделе Жизненный цикл приложения UWP.

Синтаксис
C

void __cdecl *signal(int sig, int (*func)(int, int));

Параметры
sig

Значение сигнала.

func

Второй параметр является указателем на выполняемую функцию. Первый


параметр является значением сигнала, а второй — подкодом, который можно
использовать, если первым параметром является SIGFPE .

Возвращаемое значение
signal возвращает предыдущее значение func, связанное с заданным сигналом.
Например, если предыдущее значение функции func было SIG_IGN , то
возвращаемое значение также равно SIG_IGN . Возвращаемое значение SIG_ERR
отображает ошибку; в этом случае для errno устанавливается значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.
Комментарии
Функция signal позволяет процессу выбрать один из нескольких способов
обработки сигнала прерывания от операционной системы. Аргумент sig является
прерыванием, на которое signal реагирует; это должна быть одна из следующих
констант манифеста, которые определены в SIGNAL.H .

Значение sig Описание

SIGABRT Аварийное завершение

SIGFPE Ошибка с плавающей запятой

SIGILL Недопустимая инструкция

SIGINT Сигнал CTRL + C

SIGSEGV Недопустимый доступ к хранилищу

SIGTERM Запрос на завершение

Если sig не является одним из указанных выше значений, вызывается обработчик


недопустимых параметров, как определено в разделе Проверка параметров . Если
выполнение может быть продолжено, эта функция задает для errno значение
EINVAL и возвращает SIG_ERR .

По умолчанию signal завершает вызывающую программу с кодом выхода 3,


независимо от значения sig .

7 Примечание

SIGINT не поддерживается ни одним приложением Win32. Когда происходит

прерывание CTRL + C, операционные системы Win32 создают новый поток


специально для обработки такого прерывания. Это может привести к тому, что
однопоточное приложение, например в UNIX, становится многопоточным и
вызывает непредвиденное поведение.

Аргумент func является адресом обработчика сигналов, который вы записываете,


или одной из предопределенных констант SIG_DFL действия сигнала или SIG_IGN ,
которые также определены в SIGNAL.H. Если func является функцией, она
устанавливается в качестве обработчика сигнала для заданного сигнала. Прототип
обработчика сигнала требуется один формальный аргумент sig типа int . В случае
прерывания операционная система предоставляет фактический аргумент с
помощью sig ; аргумент является сигналом, который вызвал прерывание. Поэтому
можно использовать шесть констант манифеста (перечисленных в приведенной
выше таблице) в обработчике сигнала, чтобы определить, какое прерывание
произошло, и предпринять соответствующие действия. Например, можно вызвать
функцию signal дважды, чтобы назначить один и тот же обработчик двум
различным сигналам, и затем проверять аргумент sig в обработчике для
выполнения различных действий в зависимости от полученного сигнала.

При тестировании на наличие исключений с плавающей запятой ( SIGFPE ) func


указывает на функцию, которая принимает необязательный второй аргумент,
который является одной из нескольких констант манифеста, определенных в
FLOAT.H , в форме FPE_xxx . При возникновении SIGFPE сигнала можно проверить

значение второго аргумента, чтобы определить тип исключения с плавающей


запятой, а затем выполнить соответствующее действие. Этот аргумент и его
возможные значения являются расширениями Майкрософт.

Для исключений с плавающей запятой значение func не сбрасывается при


получении сигнала. Для восстановления после исключений в операциях с
плавающей запятой заключайте такие операции в конструкции try/except. Также
можно выполнить восстановление с помощью .setjmplongjmp В любом случае
вызывающий процесс продолжает выполнение, а значение состояния операции с
плавающей запятой в процессе остается неопределенным.

Если обработчик сигнала возвращает значение , вызывающий процесс


возобновляет выполнение сразу после точки, в которой он получил сигнал
прерывания, независимо от типа сигнала или режима работы.

Перед выполнением указанной функцией для func устанавливается значение


SIG_DFL . Следующий сигнал прерывания обрабатывается так же, как это было

описано для SIG_DFL , если только промежуточный вызов signal не указывает


иное. Эту особенность можно использовать для сброса сигналов в вызванной
функции.

Так как подпрограммы обработчика сигналов часто вызываются асинхронно при


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

Не выпускайте низкоуровневые процедуры или STDIO.H процедуры ввода-


вывода (например, printf или fread ).
Не вызывайте подпрограммы кучи или какие-либо подпрограммы,
использующие подпрограммы кучи (например, malloc , _strdup или _putenv ).
Для получения дополнительной информации см. malloc.

Не используйте функции, создающие системный вызов (например, _getcwd


или time ).

Не используйте , longjmp если прерывание не вызвано исключением с


плавающей запятой (т sig . е SIGFPE . ). В этом случае вначале следует
инициализировать пакет операций с плавающей запятой с помощью вызова
функции _fpreset .

Не используйте подпрограммы наложения.

Программа должна содержать код с плавающей запятой, если она должна


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

volatile double d = 0.0f;

Сигналы SIGILL и SIGTERM не создаются в Windows. Они включены для


совместимости с ANSI. Таким образом, можно задать обработчики сигналов для
этих сигналов с помощью signal , а также явно создать эти сигналы, вызвав .raise

Параметры сигнала не сохраняются в порожденных процессах, созданных


вызовами _exec функций или _spawn . В новом процессе параметры сигнала
сбрасываются в значения по умолчанию.

Требования
Подпрограмма Обязательный заголовок

signal <signal.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
В следующем примере показано, как использовать функцию signal для
добавления пользовательского поведения в сигнал SIGABRT . Дополнительные
сведения о поведении прерывания см. в разделе _set_abort_behavior.

// crt_signal.c

// compile with: /EHsc /W4

// Use signal to attach a signal handler to the abort routine

#include <stdlib.h>

#include <signal.h>

void SignalHandler(int signal)

if (signal == SIGABRT) {

// abort signal handler code

} else {

// ...

int main()

typedef void (*SignalHandlerPointer)(int);

SignalHandlerPointer previousHandler;

previousHandler = signal(SIGABRT, SignalHandler);

abort();

Выходные данные зависят от используемой версии среды выполнения, от того,


является ли приложение консолью или приложением для Windows, а также от
параметров реестра Windows. Для консольного приложения в stderr может быть
отправлено примерно следующее сообщение:

Output

Debug Error!

Program: c:\Projects\crt_signal\Debug\crt_signal.exe

R6010

- abort() has been called

См. также раздел


Управление процессами и средой

abort

_exec, _wexec функции

exit, _Exit, _exit

_fpreset

_spawn, _wspawn функции


signbit
Статья • 03.04.2023

Определяет, является ли значение с плавающей запятой отрицательным.

Синтаксис
C

int signbit(

/* floating-point */ x

); /* C-only macro */

inline bool signbit(

float x

) throw(); /* C++-only overloaded function */

inline bool signbit(

double x

) throw(); /* C++-only overloaded function */

inline bool signbit(

long double x

) throw(); /* C++-only overloaded function */

Параметры
x

Проверяемое значение с плавающей запятой.

Возвращаемое значение
signbit возвращает ненулевое значение ( true в C++), если аргумент x является

отрицательным или отрицательным бесконечностью. Он возвращает значение 0


( false в C++), если аргумент не является отрицательным, положительным
бесконечностью или NAN.

Комментарии
signbit — это макрос при компиляции как C и перегруженная встроенная функция

при компиляции как C++.


Требования
Компонент Обязательный заголовок (C) Обязательный заголовок (C++)

signbit <math.h> <math.h> или <cmath>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
isfinite, _finite, _finitef

isinf

isnan, _isnan, _isnanf

isnormal

_fpclass, _fpclassf
sin , sinf , sinl
Статья • 03.04.2023

Вычисляет синус значения с плавающей запятой.

Синтаксис
C

double sin(double x);

float sinf(float x);

long double sinl(long double x);

#define sin(x) // Requires C11 or higher

C++

float sin(float x); // C++ only

long double sin(long double x); // C++ only

Параметры
x

Угол в радианах.

Возвращаемое значение
Функции sin возвращают синус x . Если x значение больше или равно 263 или
меньше или равно -263, происходит потеря значимости в результате.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND Нет _DOMAIN

± INF ( sin , sinf , sinl ) INVALID _DOMAIN

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки sin , которые
принимают и возвращают значения float или long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, sin всегда принимает
и возвращает . double

Если вы используете <tgmath.h> sin() макрос, тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

sin , sinf , sinl <math.h> <cmath> или <math.h>

sin Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_sincos.c

// This program displays the sine and cosine of pi / 2.

// Compile by using: cl /W4 crt_sincos.c

#include <math.h>

#include <stdio.h>

int main( void)

double pi = 3.1415926535;

double x, y;

x = pi / 2;

y = sin( x );

printf( "sin( %f ) = %f\n", x, y );

y = cos( x );

printf( "cos( %f ) = %f\n", x, y );

Output

sin( 1.570796 ) = 1.000000

cos( 1.570796 ) = 0.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acos, acosf, acosl

asin, asinf, asinl

atan, atanf, atanl, atan2, atan2f, atan2l

cos, cosf, cosl

tan, tanf, tanl

_CIsin\
sinh , sinhf , sinhl
Статья • 03.04.2023

Вычисляет гиперболический синус.

Синтаксис
C

double sinh(double x);

float sinhf(float x);

long double sinhl(long double x);

#define sinh(x) // Requires C11 or higher

float sinh(float x); // C++ only

long double sinh(long double x); // C++ only

Параметры
x

Угол в радианах.

Возвращаемое значение
Функции sinh возвращают гиперболический синус x . По умолчанию, если
результат слишком большой, sinh задает значение errno для ERANGE и возвращает
± HUGE_VAL .

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND Нет _DOMAIN

|x| ≥ 7.104760e+002 OVERFLOW + INEXACT OVERFLOW

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки sinh , которые
принимают и возвращают значения float или long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, sinh всегда
принимает и возвращает . double

Если вы используете sinh макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

sinh , sinhf , sinhl <math.h> <cmath> или <math.h>

sinh Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_sinhcosh.c

// This program displays the hyperbolic

// sine and hyperbolic cosine of pi / 2.

// Compile by using: cl /W4 crt_sinhcosh.c

#include <math.h>

#include <stdio.h>

int main( void)

double pi = 3.1415926535;

double x, y;

x = pi / 2;

y = sinh( x );

printf( "sinh( %f ) = %f\n",x, y );

y = cosh( x );

printf( "cosh( %f ) = %f\n",x, y );

Output

sinh( 1.570796 ) = 2.301299

cosh( 1.570796 ) = 2.509178

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acosh, acoshf, acoshl

asinh, asinhf, asinhl

atanh, atanhf, atanhl


cosh, coshf, coshl

tanh, tanhf, tanhl


snprintf , _snprintf , _snprintf_l ,
_snwprintf , _snwprintf_l
Статья • 03.04.2023

Записывает форматированные данные в строку. Доступны более безопасные


версии этих функций; see _snprintf_s, _snprintf_s_l, _snwprintf_s_snwprintf_s_l.

Синтаксис
C

int snprintf(

char *buffer,

size_t count,

const char *format [,

argument] ...

);

int _snprintf(

char *buffer,

size_t count,

const char *format [,

argument] ...

);

int _snprintf_l(

char *buffer,

size_t count,

const char *format,

_locale_t locale [,

argument] ...

);

int _snwprintf(

wchar_t *buffer,

size_t count,

const wchar_t *format [,

argument] ...

);

int _snwprintf_l(

wchar_t *buffer,

size_t count,

const wchar_t *format,

_locale_t locale [,

argument] ...

);

template <size_t size>

int _snprintf(

char (&buffer)[size],

size_t count,

const char *format [,

argument] ...

); // C++ only

template <size_t size>

int _snprintf_l(

char (&buffer)[size],

size_t count,

const char *format,

_locale_t locale [,

argument] ...

); // C++ only

template <size_t size>

int _snwprintf(

wchar_t (&buffer)[size],

size_t count,

const wchar_t *format [,

argument] ...

); // C++ only

template <size_t size>

int _snwprintf_l(

wchar_t (&buffer)[size],

size_t count,

const wchar_t *format,

_locale_t locale [,

argument] ...

); // C++ only

Параметры
buffer

Место хранения выходных данных.

count

Наибольшее число символов для хранения.

format

Строка управления форматом.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в описании синтаксиса спецификации формата:


printf и wprintf функций.

Возвращаемое значение
Пусть len будет длиной строки форматированных данных, не включая конечное
значение NULL. И то len и и count другое число символов snprintf _snprintf и
число расширенных символов. _snwprintf

Для всех функций, если len < count , символы len сохраняются в buffer ,
добавляется знак завершения NULL и возвращается len .

Функция snprintf усекает выходные данные, если значение len не меньше count ,
помещая знак завершения NULL в buffer[count-1] . Возвращаемое значение — len ,
то есть количество символов, которые стали бы выходными данными при
достаточном размере count . Функция snprintf возвращает отрицательное
значение при возникновении ошибки кодировки.

Для всех функций, кроме snprintf , если len = count , символы len сохраняются в
buffer , знак завершения NULL не добавляется и возвращается len . Если символы
len > count , символы count сохраняются в buffer , конечное значение null не

добавляется, и возвращается отрицательное значение.

Если buffer является указателем null и count равен нулю, len возвращается как
число символов, необходимых для форматирования выходных данных, не включая
конечное значение null. Для выполнения успешного вызова с теми же
параметрами argument и locale выделите буфер, содержащий хотя бы len + 1
символов.

Если buffer является пустым указателем и count ненулевым или если format
является пустым указателем, вызывается обработчик недопустимых параметров,
как описано в разделе "Проверка параметров". Если разрешается продолжать
выполнение, эти функции возвращают -1 и задают errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno,_doserrno_sys_errlist,


and _sys_nerr'.

Комментарии
Функция snprintf и семейство функций _snprintf форматируют и сохраняют count
или меньше символов в buffer . Функция snprintf всегда добавляет знак
завершения NULL с усечением выходных данных при необходимости. Семейство
функций _snprintf добавляет знак завершения NULL, только если длина
отформатированной строки в символах строго меньше count . Каждый argument
(при наличии) преобразуется и выводится согласно соответствующей
спецификации формата в format . Формат состоит из обычных символов и имеет те
же форму и функциональные возможности, что и аргумент format для printf. Если
копирование производится между перекрывающимися строками, поведение не
определено.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


_snprintf Так как функции не гарантируют завершение значений NULL, в

частности, если возвращаемое значение равно count , убедитесь, что за ними


следует код, добавляющий признак конца NULL. Дополнительные сведения см.
в разделе "Предотвращение переполнения буфера".

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округляются до
ближайшей четной цифры (также известной как "Округление банкира").
Например, оба printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны
округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до 3. Это
изменение влияет только на точно представляемые числа. Например, 2.35
(который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Начиная с UCRT в Visual Studio 2015 и Windows 10, snprintf больше не идентичен
_snprintf . Поведение snprintf функции теперь соответствует стандарту C99.

_snwprintf — это двухбайтовая версия _snprintf ; аргументы указателя для


_snwprintf представляют собой двухбайтовые строки. Обнаружение ошибок

кодирования может _snwprintf отличаться от обнаружения в _snprintf .


_snwprintf так же, как swprintf , записывает выходные данные в строку вместо

назначения типа FILE .


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

В C++ эти функции имеют перегрузки шаблонов, которые вызывают более новые,
более безопасные аналоги. Дополнительные сведения см. в разделе "Безопасные
перегрузки шаблонов".

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_sntprintf _snprintf _snprintf _snwprintf

_sntprintf_l _snprintf_l _snprintf_l _snwprintf_l

Требования
Подпрограмма Обязательный заголовок

snprintf , _snprintf , _snprintf_l <stdio.h>

_snwprintf , _snwprintf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_snprintf.c

// compile with: /W3

#include <stdio.h>

#include <stdlib.h>

#if !defined(__cplusplus)

typedef int bool;

const bool true = 1;

const bool false = 0;

#endif

#define FAIL 0 // change to 1 and see what happens

int main(void)

char buffer[200];

const static char s[] = "computer"

#if FAIL

"computercomputercomputercomputercomputercomputercomputercomputer"

"computercomputercomputercomputercomputercomputercomputercomputer"

"computercomputercomputercomputercomputercomputercomputercomputer"

"computercomputercomputercomputercomputercomputercomputercomputer"

#endif

const char c = 'l';

const int i = 35;

#if FAIL

const double fp = 1e300; // doesn't fit in the buffer

#else

const double fp = 1.7320534;

#endif

/* !subtract one to prevent "squeezing out" the terminal null! */

const int bufferSize = sizeof(buffer)/sizeof(buffer[0]) - 1;

int bufferUsed = 0;

int bufferLeft = bufferSize - bufferUsed;

bool bSuccess = true;

buffer[0] = 0;

/* Format and print various data: */

if (bufferLeft > 0)

int perElementBufferUsed = _snprintf(&buffer[bufferUsed],

bufferLeft, " String: %s\n", s ); // C4996

// Note: _snprintf is deprecated; consider _snprintf_s instead

if (bSuccess = (perElementBufferUsed >= 0))

bufferUsed += perElementBufferUsed;

bufferLeft -= perElementBufferUsed;

if (bufferLeft > 0)

int perElementBufferUsed = _snprintf(&buffer[bufferUsed],

bufferLeft, " Character: %c\n", c ); // C4996

if (bSuccess = (perElementBufferUsed >= 0))

bufferUsed += perElementBufferUsed;

bufferLeft -= perElementBufferUsed;

if (bufferLeft > 0)

int perElementBufferUsed = _snprintf(&buffer

[bufferUsed], bufferLeft, " Integer: %d\n", i ); //


C4996

if (bSuccess = (perElementBufferUsed >= 0))

bufferUsed += perElementBufferUsed;

bufferLeft -= perElementBufferUsed;

if (bufferLeft > 0)

int perElementBufferUsed = _snprintf(&buffer

[bufferUsed], bufferLeft, " Real: %f\n", fp ); //


C4996

if (bSuccess = (perElementBufferUsed >= 0))

bufferUsed += perElementBufferUsed;

if (!bSuccess)

printf("%s\n", "failure");

else

/* !store null because _snprintf doesn't necessarily (if the string

* fits without the terminal null, but not with it)!

* bufferUsed might be as large as bufferSize, which normally is

* like going one element beyond a buffer, but in this case

* subtracted one from bufferSize, so we're ok.

*/

buffer[bufferUsed] = 0;

printf( "Output:\n%s\ncharacter count = %d\n", buffer, bufferUsed );

return EXIT_SUCCESS;
}

Output

Output:

String: computer

Character: l

Integer: 35

Real: 1.732053

character count = 69

См. также раздел


Потоковый ввод-вывод

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

Функции vprintf
_snprintf_s , _snprintf_s_l ,
_snwprintf_s , _snwprintf_s_l
Статья • 03.04.2023

Записывает форматированные данные в строку. Эти функции являются версиями


snprintf, _snprintf, _snprintf_l, _snwprintf, с _snwprintf_l улучшениями безопасности,
как описано в разделе Функции безопасности в CRT.

Синтаксис
C

int _snprintf_s(

char *buffer,

size_t sizeOfBuffer,
size_t count,

const char *format [,

argument] ...

);

int _snprintf_s_l(

char *buffer,

size_t sizeOfBuffer,
size_t count,

const char *format,

_locale_t locale [,

argument] ...

);

int _snwprintf_s(

wchar_t *buffer,

size_t sizeOfBuffer,
size_t count,

const wchar_t *format [,

argument] ...

);

int _snwprintf_s_l(

wchar_t *buffer,

size_t sizeOfBuffer,
size_t count,

const wchar_t *format,

_locale_t locale [,

argument] ...

);

template <size_t size>

int _snprintf_s(

char (&buffer)[size],

size_t count,

const char *format [,

argument] ...

); // C++ only

template <size_t size>

int _snwprintf_s(

wchar_t (&buffer)[size],

size_t count,

const wchar_t *format [,

argument] ...

); // C++ only

Параметры
buffer

Место хранения выходных данных.

sizeOfBuffer

Размер места хранения выходных данных. Размер в bytes для _snprintf_s или
размер в words для _snwprintf_s .

count

Максимальное число символов для хранения или _TRUNCATE.

format

Строка управления форматом.

argument

Необязательные аргументы.

locale

Используемый языковой стандарт.

Возвращаемое значение
_snprintf_s возвращает число сохраненных в buffer символов без учета знака

завершения NULL. _snwprintf_s возвращает число расширенных символов,


сохраненных в buffer , без учета завершающего расширенного символа null.

Если хранилище, необходимое для хранения данных, а завершающее значение


NULL превышает sizeOfBuffer значение , вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если после обработчика
недопустимых параметров выполнение приложения продолжается, эти функции
устанавливают значение параметра buffer равным пустой строке, устанавливают
для errno значение ERANGE и возвращают значение –1.
Если параметр buffer или format является пустым ( NULL ) указателем или если
значение параметра count меньше или равно нулю, вызывается обработчик
недопустимых параметров. Если продолжение выполнения разрешено, эти
функции устанавливают для errno значение EINVAL и возвращают -1.

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция _snprintf_s форматирует и сохраняет count или меньшее число символов
в buffer и добавляет завершающий символ NULL. Каждый аргумент (если он есть)
преобразуется и выводится согласно соответствующей спецификации формата в
format . Форматирование согласуется с семейством printf функций. См . раздел
Синтаксис спецификации форматирования: printf и wprintf функции. Если
копирование производится между перекрывающимися строками, поведение не
определено.

Если count имеет значение _TRUNCATE, то _snprintf_s записывает столько строк,


сколько поместится в buffer , оставляя место для завершающего значения NULL.
Если вся строка (с учетом завершающего нуль-символа) помещается в buffer ,
_snprintf_s возвращает количество записанных символов (не включая

завершающий символ NULL); в противном случае _snprintf_s возвращает


значение –1, что указывает на то, что произошло усечение.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

_snwprintf_s — это двухбайтовая версия _snprintf_s ; аргументы указателя для


_snwprintf_s представляют собой двухбайтовые строки. Обнаружение ошибок

кодирования в _snwprintf_s может отличаться от обнаружения в _snprintf_s .


_snwprintf_s так же, как swprintf_s , записывает выходные данные в строку вместо

назначения типа FILE .

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Сопоставления подпрограмм с универсальным


текстом

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_sntprintf_s _snprintf_s _snprintf_s _snwprintf_s

_sntprintf_s_l _snprintf_s_l _snprintf_s_l _snwprintf_s_l

Требования
Подпрограмма Обязательный заголовок

_snprintf_s , _snprintf_s_l <stdio.h>

_snwprintf_s , _snwprintf_s_l <stdio.h> или <wchar.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_snprintf_s.cpp

// compile with: /MTd

// These #defines enable secure template overloads

// (see last part of Examples() below)

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <crtdbg.h> // For _CrtSetReportMode

#include <errno.h>

// This example uses a 10-byte destination buffer.

int snprintf_s_tester( const char * fmt, int x, size_t count )

char dest[10];

printf( "\n" );

if ( count == _TRUNCATE )

printf( "%zd-byte buffer; truncation semantics\n",


_countof(dest) );

else

printf( "count = %zd; %zd-byte buffer\n",

count, _countof(dest) );

int ret = _snprintf_s( dest, _countof(dest), count, fmt, x );

printf( " new contents of dest: '%s'\n", dest );

return ret;

void Examples()

// formatted output string is 9 characters long: "<<<123>>>"

snprintf_s_tester( "<<<%d>>>", 121, 8 );

snprintf_s_tester( "<<<%d>>>", 121, 9 );

snprintf_s_tester( "<<<%d>>>", 121, 10 );

printf( "\nDestination buffer too small:\n" );

snprintf_s_tester( "<<<%d>>>", 1221, 10 );

printf( "\nTruncation examples:\n" );

int ret = snprintf_s_tester( "<<<%d>>>", 1221, _TRUNCATE );

printf( " truncation %s occur\n", ret == -1 ? "did"

: "did not" );

ret = snprintf_s_tester( "<<<%d>>>", 121, _TRUNCATE );

printf( " truncation %s occur\n", ret == -1 ? "did"

: "did not" );

printf( "\nSecure template overload example:\n" );

char dest[10];

_snprintf( dest, 10, "<<<%d>>>", 12321 );

// With secure template overloads enabled (see #defines

// at top of file), the preceding line is replaced by

// _snprintf_s( dest, _countof(dest), 10, "<<<%d>>>", 12345 );

// Instead of causing a buffer overrun, _snprintf_s invokes

// the invalid parameter handler.

// If secure template overloads were disabled, _snprintf would

// write 10 characters and overrun the dest buffer.

printf( " new contents of dest: '%s'\n", dest );

void myInvalidParameterHandler(

const wchar_t* expression,

const wchar_t* function,

const wchar_t* file,


unsigned int line,

uintptr_t pReserved)
{

wprintf(L"Invalid parameter handler invoked: %s\n", expression);

int main( void )

_invalid_parameter_handler oldHandler, newHandler;

newHandler = myInvalidParameterHandler;

oldHandler = _set_invalid_parameter_handler(newHandler);

// Disable the message box for assertions.

_CrtSetReportMode(_CRT_ASSERT, 0);

Examples();

Output

count = 8; 10-byte buffer

new contents of dest: '<<<121>>'

count = 9; 10-byte buffer

new contents of dest: '<<<121>>>'

count = 10; 10-byte buffer

new contents of dest: '<<<121>>>'

Destination buffer too small:

count = 10; 10-byte buffer

Invalid parameter handler invoked: ("Buffer too small", 0)

new contents of dest: ''

Truncation examples:

10-byte buffer; truncation semantics

new contents of dest: '<<<1221>>'

truncation did occur

10-byte buffer; truncation semantics

new contents of dest: '<<<121>>>'

truncation did not occur

Secure template overload example:


Invalid parameter handler invoked: ("Buffer too small", 0)

new contents of dest: ''

См. также раздел


Потоковый ввод-вывод

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

Функции vprintf
_snscanf , _snscanf_l , _snwscanf ,
_snwscanf_l
Статья • 03.04.2023

Считывает форматированные данные указанной длины из строки. Доступны более


безопасные версии этих функций; См. раздел_snscanf_s , _snscanf_s_l, _snwscanf_s, .
_snwscanf_s_l

Синтаксис
C

int __cdecl _snscanf(

const char * input,

size_t length,

const char * format,


...

);

int __cdecl _snscanf_l(

const char * input,

size_t length,

const char * format,


_locale_t locale,

...

);

int __cdecl _snwscanf(

const wchar_t * input,

size_t length,

const wchar_t * format,

...

);

int __cdecl _snwscanf_l(

const wchar_t * input,

size_t length,

const wchar_t * format,

_locale_t locale,

...

);

Параметры
input

Входная строка для анализа.


length

Количество символов для анализа в строке input .

format

Один или несколько описателей формата.

...

Необязательные переменные, которые будут использоваться для хранения


значений, извлеченных из входной строки описателями формата в format .

locale

Используемый языковой стандарт.

Возвращаемое значение
Обе эти функции возвращают количество успешно преобразованных и
назначенных полей; Возвращаемое значение не включает поля, которые были
прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не
были назначены. Если до первого преобразования возникает ошибка или
достигается конец строки, возвращается значение EOF . Для получения
дополнительной информации см. sscanf.

Если input или format является указателем NULL или меньше length или равен
нулю, вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если продолжение выполнения разрешено, эти функции
возвращают EOF и устанавливают для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Эта функция похожа sscanf на , за исключением того, что она позволяет указать
фиксированное количество символов для проверки из входной строки. Для
получения дополнительной информации см. sscanf.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.
Сопоставления подпрограмм с универсальным
текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_sntscanf _snscanf _snscanf _snwscanf

_sntscanf_l _snscanf_l _snscanf_l _snwscanf_l

Требования
Подпрограмма Обязательный заголовок

_snscanf , _snscanf_l <stdio.h>

_snwscanf , _snwscanf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_snscanf.c

// compile with: /W3

#include <stdio.h>

int main( )

char str1[] = "15 12 14...";

wchar_t str2[] = L"15 12 14...";

char s1[3];

wchar_t s2[3];

int i;

float fp;

i = _snscanf( str1, 6, "%s %f", s1, &fp); // C4996

// Note: _snscanf is deprecated; consider using _snscanf_s instead

printf("_snscanf converted %d fields: ", i);

printf("%s and %f\n", s1, fp);

i = _snwscanf( str2, 6, L"%s %f", s2, &fp); // C4996

// Note: _snwscanf is deprecated; consider using _snwscanf_s instead

wprintf(L"_snwscanf converted %d fields: ", i);

wprintf(L"%s and %f\n", s2, fp);

Output

_snscanf converted 2 fields: 15 and 12.000000

_snwscanf converted 2 fields: 15 and 12.000000

См. также раздел


Спецификация ширины scanf
_snscanf_s , _snscanf_s_l , _snwscanf_s ,
_snwscanf_s_l
Статья • 03.04.2023

Считывает форматированные данные указанной длины из строки. Эти функции


являются версиями , _snscanf_l_snwscanfс улучшениями_snscanf безопасности,
_snwscanf_l как описано в функциях безопасности в CRT.

Синтаксис
C

int __cdecl _snscanf_s(

const char * input,

size_t length,

const char * format [, argument_list]

);

int __cdecl _snscanf_s_l(

const char * input,

size_t length,

const char * format,


_locale_t locale [, argument_list]

);

int __cdecl _snwscanf_s(

const wchar_t * input,

size_t length,

const wchar_t * format [, argument_list]

);

int __cdecl _snwscanf_s_l(

const wchar_t * input,

size_t length,

const wchar_t * format,

_locale_t locale [, argument_list]

);

Параметры
input

Входная строка для анализа.

length

Количество символов для анализа в строке input .


format

Один или несколько описателей формата.

locale

Используемый языковой стандарт.

argument_list

Необязательные аргументы, назначенные в соответствии со строкой формата.

Возвращаемое значение
Обе эти функции возвращают количество полей, успешно преобразованных и
назначенных; возвращаемое значение не содержит поля, которые были
прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не
были назначены. Если до первого преобразования возникает ошибка или
достигается конец строки, возвращается значение EOF . Дополнительные сведения
см. в разделе sscanf_s, , _sscanf_s_lswscanf_s. _swscanf_s_l

Если input или format является указателем NULL , вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
продолжение выполнения разрешено, эти функции возвращают EOF и
устанавливают для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Эта функция похожа sscanf_s , за исключением того, что она позволяет указать
фиксированное количество символов для проверки из входной строки.
Дополнительные сведения см. в разделе sscanf_s, , _sscanf_s_lswscanf_s. _swscanf_s_l

Параметр размера буфера является обязательным для символов поля типа c, C, s, S


и [. Дополнительные сведения см. в разделе Символы поля типа scanf.

7 Примечание

Параметр размера имеет тип unsigned , а не size_t .

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_sntscanf_s _snscanf_s _snscanf_s _snwscanf_s

_sntscanf_s_l _snscanf_s_l _snscanf_s_l _snwscanf_s_l

Требования
Подпрограмма Обязательный заголовок

_snscanf_s , _snscanf_s_l <stdio.h>

_snwscanf_s , _snwscanf_s_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_snscanf_s.c

// This example scans a string of


// numbers, using both the character

// and wide character secure versions

// of the snscanf function.

#include <stdio.h>

int main( )

char str1[] = "15 12 14...";

wchar_t str2[] = L"15 12 14...";

char s1[3];

wchar_t s2[3];

int i;

float fp;

i = _snscanf_s( str1, 6, "%s %f", s1, 3, &fp);

printf_s("_snscanf_s converted %d fields: ", i);

printf_s("%s and %f\n", s1, fp);

i = _snwscanf_s( str2, 6, L"%s %f", s2, 3, &fp);

wprintf_s(L"_snwscanf_s converted %d fields: ", i);

wprintf_s(L"%s and %f\n", s2, fp);

Output

_snscanf_s converted 2 fields: 15 and 12.000000

_snwscanf_s converted 2 fields: 15 and 12.000000

См. также раздел


Спецификация ширины scanf
sopen
Статья • 03.04.2023

Имя sopen функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _sopen функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _sopen функцию с расширенным


уровнем _sopen_s безопасности. Вы также можете продолжать использовать это
имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен предупреждений и функций POSIX".
_sopen , _wsopen
Статья • 03.04.2023

Открывает файл для общего доступа. Доступны более безопасные версии этих
функций: see _sopen_s, _wsopen_s.

Синтаксис
C

int _sopen(

const char *filename,

int oflag,

int shflag [,

int pmode ]

);

int _wsopen(

const wchar_t *filename,

int oflag,

int shflag [,

int pmode ]

);

Параметры
filename

Имя файла.

oflag

Разрешенные типы операций.

shflag

Разрешенные типы общего доступа.

pmode

Настройка разрешений.

Возвращаемое значение
Каждая из этих функций возвращает дескриптор файла для открытого файла.
Если filename или oflag является указателем NULL или находится в допустимом
диапазоне значений, oflag shflag вызывается обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если разрешается
продолжать выполнение, эти функции возвращают -1 и задают для errno одно из
следующих значений.

Значение Условие
errno

EACCES Заданный путь является каталогом, или файл доступен только для чтения,
однако была выполнена попытка операции открытия для записи.

EEXIST Указаны флаги _O_CREAT и _O_EXCL , однако filename уже существует.

EINVAL Недопустимый аргумент oflag или shflag .

EMFILE Больше нет доступных дескрипторов файлов.

ENOENT Файл или путь не найдены.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrnoи _sys_nerr_sys_errlist.

Комментарии
Функция _sopen открывает файл, указанный параметром filename , и готовит его к
общему доступу для чтения или записи, как задано параметрами oflag и shflag .
_wsopen — это версия _sopen с расширенными символами; аргумент filename для
_wsopen — строка расширенных символов. Поведение _wsopen и _sopen идентично

в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе "Глобальное состояние" в CRT.

Сопоставления подпрограмм универсального текста

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tsopen _sopen _sopen _wsopen

Целочисленное выражение oflag формируется путем объединения одной или


нескольких следующих констант манифеста, определенных в <fcntl.h> . Если две
или более констант образуют аргумент oflag , они объединяются с побитовой
оператором OR ( | ).

константа Поведение
oflag ;

_O_APPEND Перемещает указатель файла в конец файла перед каждой операцией


записи.

_O_BINARY Открывает файл в двоичном режиме (без преобразования). (См fopen .


описание двоичного режима.)

_O_CREAT Создает файл и открывает его для записи. Не действует, если существует
файл, указанный параметром filename . Аргумент pmode обязателен, если
указан флаг _O_CREAT .

_O_CREAT | Создает файл как временный и, если это возможно, не сбрасывает на диск.
_O_SHORT_LIVED Аргумент pmode обязателен, если указан флаг _O_CREAT .

_O_CREAT | Создает файл в качестве временного файла; файл удаляется при закрытии
_O_TEMPORARY последнего дескриптора файла. Аргумент pmode обязателен, если указан
флаг _O_CREAT . Чтобы сохранить устаревшее поведение для совместимости
приложений, другие процессы не препятствуют удалению этого файла.

_O_CREAT | Возвращает значение ошибки, если файл, указанный параметром filename ,


_O_EXCL существует. Применяется только при использовании с _O_CREAT .

_O_NOINHERIT Предотвращает создание общего дескриптора файла.

_O_RANDOM Указывает, что кэширование оптимизировано для случайного доступа с


диска, но не ограничивается им.

_O_RDONLY Открывает файл только для чтения. Не удается указать с _O_RDWR помощью
или _O_WRONLY .

_O_RDWR Открывает файл для чтения и записи. Не удается указать с _O_RDONLY


помощью или _O_WRONLY .

_O_SEQUENTIAL Указывает, что кэширование оптимизировано для последовательного


доступа с диска, но не ограничивается им.

_O_TEXT Открывает файл в текстовом режиме (с преобразованием).


(Дополнительные сведения см. в разделе "Текстовый и двоичный режим
ввода-вывода" иfopen.)

_O_TRUNC Открывает файл и обрезает его до нулевой длины; необходимо разрешение


на запись в файл. Не удается указать с помощью _O_RDONLY . _O_TRUNC при
использовании с _O_CREAT открывает существующий файл или создает
новый. Примечание: Флаг _O_TRUNC уничтожает содержимое указанного
файла.
константа Поведение
oflag ;

_O_WRONLY Открывает файл только для записи. Не удается указать с _O_RDONLY


помощью или _O_RDWR .

_O_U16TEXT Открывает файл в режиме Юникода UTF-16.

_O_U8TEXT Открывает файл в режиме Юникода UTF-8.

_O_WTEXT Открывает файл в режиме Юникода.

Чтобы указать режим доступа к файлу, необходимо задать _O_RDONLY , _O_RDWR или
_O_WRONLY . Значение по умолчанию для режима доступа отсутствует.

Если файл открывается в режиме Юникода с помощью флагов _O_WTEXT , _O_U8TEXT


или _O_U16TEXT , функции ввода преобразуют данные, считываемые из файла в
данные UTF-16, хранимые с типом wchar_t . Затем функции, которые выполняют
запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие
данные UTF-16, хранимые с типом wchar_t . Если файл закодирован как UTF-8,
данные UTF-16 превратятся в UTF-8 при записи. Содержимое в кодировке UTF-8
преобразуется в UTF-16 при чтении. Попытка чтения или записи нечетного числа
байт в режиме Юникода приводит к возникновению ошибки проверки параметра.
Для чтения или записи данных, хранимых в программе в кодировке UTF-8,
используйте режим текстового или двоичного файла вместо режима Юникода. Вы
несете ответственность за любой требуемый перевод кодировки.

Если _sopen вызывается с _O_WRONLY | _O_APPEND помощью (режим добавления) и


_O_U16TEXT _O_WTEXT ( или) сначала _O_U8TEXT пытается открыть файл для чтения и
записи, прочитать BOM, а затем снова открыть его только для записи. Если
происходит сбой открытия файла для чтения и записи, файл открывается только
для записи и для параметра режима Юникода используется значение по
умолчанию.

Аргумент shflag является константным выражением, состоящим из одной из


следующих констант манифеста, определенных в <share.h> .

константа shflag ; Поведение

_SH_DENYRW Запрещает доступ на чтение и запись.

_SH_DENYWR Запрещает доступ на запись.

_SH_DENYRD Запрещает доступ на чтение.


константа shflag ; Поведение

_SH_DENYNO Разрешает доступ на чтение и запись.

Аргумент pmode обязателен, только если указан флаг _O_CREAT . Если файл не
существует, pmode указывает параметры разрешений файла, которые задаются при
первом закрытии нового файла. В противном случае pmode игнорируется. pmode
представляет собой целочисленное выражение, содержащее одну или обе
константы манифеста _S_IWRITE и _S_IREAD определяемые в <sys\stat.h> . При
указании обеих констант они объединяются с оператором bitwise-OR. Значение
параметра pmode следующее.

pmode Значение

_S_IREAD Разрешено только чтение.

_S_IWRITE Разрешена запись. (Если действует, разрешает чтение и запись.)

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

Если разрешение на запись не задано, файл доступен только для чтения. В


операционной системе Windows все файлы доступны для чтения; невозможно
предоставить разрешение только на запись. Поэтому режимы _S_IWRITE и _S_IREAD
| _S_IWRITE эквивалентны.

_sopen применяет текущую маску разрешений файла к pmode до настройки

разрешений. Для получения дополнительной информации см. _umask.

Требования
Компонент Обязательный заголовок Необязательный заголовок

_sopen <io.h> <fcntl.h> , <sys\types.h> , <sys\stat.h> , <share.h>

_wsopen <io.h> или <wchar.h> <fcntl.h> , <sys\types.h> , <sys\stat.h> , <share.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _locking.
См. также раздел
Низкоуровневый ввод-вывод

_close

_creat, _wcreat

fopen, _wfopen

_fsopen, _wfsopen

_open, _wopen
_sopen_s , _wsopen_s
Статья • 03.04.2023

Открывает файл для общего доступа. Эти версии _sopen и _wsopen имеют
улучшения безопасности, как описано в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t _sopen_s(

int* pfh,

const char *filename,

int oflag,

int shflag,

int pmode

);

errno_t _wsopen_s(

int* pfh,

const wchar_t *filename,

int oflag,

int shflag,

int pmode,

);

Параметры
pfh

Дескриптор файла или значение -1, если произошла ошибка.

filename

Имя файла.

oflag

Разрешенные типы операций.

shflag

Разрешенные типы общего доступа.

pmode

Настройка разрешений.
Возвращаемое значение
Ненулевое возвращаемое значение указывает на ошибку; в этом случае для errno
задается одно из следующих значений.

Значение Условие
errno

EACCES Заданный путь является каталогом, или файл доступен только для чтения,
однако была выполнена попытка операции открытия для записи.

EEXIST Указаны флаги _O_CREAT и _O_EXCL , однако filename уже существует.

EINVAL Недопустимый аргумент oflag , shflag или pmode , либо pfh или filename
является пустым указателем.

EMFILE Больше нет доступных дескрипторов файлов.

ENOENT Файл или путь не найден.

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


недопустимых параметров, как описано в разделе Проверка параметров. Если
выполнение разрешено для продолжения, errno устанавливается значение
EINVAL и EINVAL возвращается .

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

При возникновении ошибки значение -1 возвращается через pfh (если pfh не


является пустым указателем).

Комментарии
Функция _sopen_s открывает файл, указанный параметром filename , и готовит его
к общему доступу для чтения или записи, как задано параметрами oflag и shflag .
_wsopen_s — это версия _sopen_s с расширенными символами; аргумент filename

для _wsopen_s — строка расширенных символов. Поведение _wsopen_s и _sopen_s


идентично в противном случае.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе Глобальное состояние в CRT.
Сопоставления подпрограмм с универсальным
текстом

Tchar.h _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tsopen_s _sopen_s _sopen_s _wsopen_s

Целочисленное выражение oflag формируется путем объединения одной или


нескольких констант манифеста, определенных в <fcntl.h> . Если аргумент
oflag формируется двумя или более константами , они объединяются с

оператором битового ИЛИ ( | ).

константа Поведение
oflag ;

_O_APPEND Перемещает указатель файла в конец файла перед каждой операцией


записи.

_O_BINARY Открывает файл в двоичном режиме (без преобразования). (См fopen .


описание двоичного режима.)

_O_CREAT Создает файл и открывает его для записи. Не действует, если существует
файл, указанный параметром filename . Аргумент pmode обязателен, если
указан флаг _O_CREAT .

_O_CREAT | Создает файл как временный и по возможности не сбрасывает его на диск.


_O_SHORT_LIVED Аргумент pmode обязателен, если указан флаг _O_CREAT .

_O_CREAT | Создает файл в качестве временного файла; файл удаляется при закрытии
_O_TEMPORARY последнего дескриптора файла. Аргумент pmode обязателен, если указан
флаг _O_CREAT . Чтобы сохранить устаревшее поведение для совместимости
приложений, другим процессам не запрещено удалять этот файл.

_O_CREAT | Возвращает значение ошибки, если файл, указанный параметром filename ,


_O_EXCL существует. Применяется только при использовании с _O_CREAT .

_O_NOINHERIT Предотвращает создание общего дескриптора файла.

_O_RANDOM Указывает, что кэширование оптимизировано для случайного доступа с


диска, но не ограничивается им.

_O_RDONLY Открывает файл только для чтения. Не удается указать с помощью _O_RDWR
или _O_WRONLY .

_O_RDWR Открывает файл для чтения и записи. Не удается указать с помощью


_O_RDONLY или _O_WRONLY .
константа Поведение
oflag ;

_O_SEQUENTIAL Указывает, что кэширование оптимизировано для последовательного


доступа с диска, но не ограничивается им.

_O_TEXT Открывает файл в текстовом режиме (с преобразованием).


(Дополнительные сведения см. в разделах Текстовый и двоичный режим
ввода-вывода файлов и fopen.)

_O_TRUNC Открывает файл и обрезает его до нулевой длины; необходимо разрешение


на запись в файл. Не удается указать с помощью _O_RDONLY . _O_TRUNC при
использовании с _O_CREAT открывает существующий файл или создает
новый. Примечание: Флаг _O_TRUNC удаляет содержимое указанного файла.

_O_WRONLY Открывает файл только для записи. Не удается указать с помощью


_O_RDONLY или _O_RDWR .

_O_U16TEXT Открывает файл в режиме Юникода UTF-16.

_O_U8TEXT Открывает файл в режиме Юникода UTF-8.

_O_WTEXT Открывает файл в режиме Юникода.

Чтобы указать режим доступа к файлу, необходимо задать _O_RDONLY , _O_RDWR или
_O_WRONLY . Нет значения по умолчанию для режима доступа.

Если файл открывается в режиме Юникода с помощью флагов _O_WTEXT , _O_U8TEXT


или _O_U16TEXT , функции ввода преобразуют данные, считываемые из файла в
данные UTF-16, хранимые с типом wchar_t . Затем функции, которые выполняют
запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие
данные UTF-16, хранимые с типом wchar_t . Если файл закодирован как UTF-8, то
при записи данные UTF-16 претворяются в UTF-8. Содержимое файла в кодировке
UTF-8 преобразуется в UTF-16 при чтении. Попытка чтения или записи нечетного
числа байт в режиме Юникода приводит к возникновению ошибки проверки
параметра. Для чтения или записи данных, хранимых в программе в кодировке
UTF-8, используйте режим текстового или двоичного файла вместо режима
Юникода. Вы несете ответственность за любой необходимый перевод
кодирования.

Если _sopen_s вызывается с флагами _O_WRONLY | _O_APPEND (режим добавления) и


_O_WTEXT , _O_U16TEXT или _O_U8TEXT , сначала выполняется попытка открыть файл

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

Аргумент shflag является константным выражением, состоящим из одной из


следующих констант манифеста, определенных в <share.h> .

константа shflag ; Поведение

_SH_DENYRW Запрещает доступ на чтение и запись.

_SH_DENYWR Запрещает доступ на запись.

_SH_DENYRD Запрещает доступ на чтение.

_SH_DENYNO Разрешает доступ на чтение и запись.

Аргумент pmode всегда обязателен, в отличие от _sopen . При указании _O_CREAT ,


если файл не существует, pmode указывает параметры разрешений файла, которые
задаются при первом закрытии нового файла. В противном случае pmode
игнорируется. pmode — это целочисленное выражение, содержащее одну или обе
константы _S_IWRITE манифеста и _S_IREAD , определенные в <sys\stat.h> . Если
заданы обе константы, они объединяются с оператором побитового ИЛИ.
Значение параметра pmode следующее.

pmode Значение

_S_IREAD Разрешено только чтение.

_S_IWRITE Разрешена запись. (Если действует, разрешает чтение и запись.)

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

Если разрешение на запись не предоставлено, файл доступен только для чтения. В


операционной системе Windows все файлы доступны для чтения; невозможно
предоставить разрешение только на запись. Поэтому режимы _S_IWRITE и _S_IREAD
| _S_IWRITE эквивалентны.

_sopen_s применяет текущую маску разрешений файла к pmode до настройки

разрешений. (См. раздел _umask.)

Требования
Компонент Обязательный заголовок Необязательный заголовок
Компонент Обязательный заголовок Необязательный заголовок

_sopen_s <io.h> <fcntl.h> , <sys\types.h> , <sys\stat.h> , <share.h>

_wsopen_s <io.h> или <wchar.h> <fcntl.h> , <sys/types.h> , <sys/stat.h> , <share.h>

_sopen_s и _wsopen_s являются расширениями Майкрософт. Дополнительные


сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _locking.

См. также раздел


Низкоуровневый ввод-вывод

_close

_creat, _wcreat

fopen, _wfopen

_fsopen, _wfsopen

_open, _wopen
spawnl
Статья • 03.04.2023

Имя spawnl функции, зависят от Майкрософт, является устаревшим псевдонимом


_spawnl для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnl . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnl , _wspawnl
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnl(

int mode,

const char *cmdname,


const char *arg0,

const char *arg1,

... const char *argn,

NULL

);

intptr_t _wspawnl(

int mode,

const wchar_t *cmdname,

const wchar_t *arg0,


const wchar_t *arg1,
... const wchar_t *argn,

NULL

);

Параметры
mode

Режим выполнения для вызывающего процесса.

cmdname

Путь к выполняемому файлу.

arg0 , arg1 , ... argN

Список указателей на аргументы. Аргумент arg0 обычно является указателем на


параметр cmdname . Аргументы arg1 – argN являются указателями на строки
символов, которые образуют новый список аргументов. После argN должно
следовать указатель NULL , отмечающий конец списка аргументов.

Возвращаемое значение
Возвращаемое значение синхронных функций _spawnl или _wspawnl (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnl или _wspawnl
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс специально вызывает процедуру exit с ненулевым
аргументом. Если новый процесс явно не задал положительное состояние выхода,
положительное состояние выхода указывает на аномальный выход с прерыванием
или прерыванием. Возвращаемое значение -1 указывает на ошибку (новый
процесс не запущен). В этом случае errno имеет одно из следующих значений.

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найден.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Эти функции проверяют свои параметры. cmdname Если или arg0 является пустой
строкой или пустым указателем, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают -1. Нет порожденных новых процессов.

Комментарии
Каждая из этих функций создает и выполняет новый процесс, передавая все
аргументы командной строки как отдельные параметры.

Требования
Подпрограмма Обязательный заголовок

_spawnl <process.h>

_wspawnl <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawn, _wspawn functions.

См. также раздел


Управление процессами и средой

_spawnФункции , _wspawn

abort

atexit

_execФункции , _wexec

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnle
Статья • 03.04.2023

Имя spawnle функции, зависят от Майкрософт, является устаревшим псевдонимом


_spawnle для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnle . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnle , _wspawnle
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnle(

int mode,

const char *cmdname,


const char *arg0,

const char *arg1,

... const char *argn,

NULL,

const char *const *envp

);

intptr_t _wspawnle(

int mode,

const wchar_t *cmdname,

const wchar_t *arg0,


const wchar_t *arg1,
... const wchar_t *argn,

NULL,

const wchar_t *const *envp

);

Параметры
mode

Режим выполнения для вызывающего процесса.

cmdname

Путь к выполняемому файлу.


arg0 , arg1 , ... argN

Список указателей на аргументы. Аргумент arg0 обычно является указателем на


параметр cmdname . Аргументы arg1 – argN являются указателями на строки
символов, которые образуют новый список аргументов. После argN должно
следовать указатель NULL , отмечающий конец списка аргументов.

envp

Массив указателей на параметры среды.

Возвращаемое значение
Возвращаемое значение синхронных функций _spawnle или _wspawnle (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnle или _wspawnle
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс специально вызывает процедуру exit с ненулевым
аргументом. Если новый процесс явно не установил положительное состояние
выхода, положительное состояние выхода указывает на ненормальный выход с
прерыванием или прерыванием. Возвращаемое значение -1 указывает на ошибку
(новый процесс не запущен). В этом случае errno имеет одно из следующих
значений.

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций создает и выполняет новый процесс и передает каждый
аргумент командной строки как отдельный параметр, а также передает массив
указателей на параметры среды.

Эти функции проверяют свои параметры. Если либо является пустой строкой или
пустым указателем, вызывается обработчик недопустимых параметров, как
описано в разделе "Проверка параметров". cmdname arg0 Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают -1. Нет порожденных новых процессов.

Требования
Подпрограмма Обязательный заголовок

_spawnle <process.h>

_wspawnle <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawnразделе " _wspawn Функции".

См. также раздел


Управление процессами и средой

_spawn, _wspawn функции

abort

atexit

_exec, _wexec функции

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnlp
Статья • 03.04.2023

Имя spawnlp функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _spawnlp функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnlp . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnlp , _wspawnlp
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnlp(

int mode,

const char *cmdname,


const char *arg0,

const char *arg1,

... const char *argn,

NULL

);

intptr_t _wspawnlp(

int mode,

const wchar_t *cmdname,

const wchar_t *arg0,


const wchar_t *arg1,
... const wchar_t *argn,

NULL

);

Параметры
mode

Режим выполнения для вызывающего процесса.

cmdname

Путь к выполняемому файлу.

arg0 , arg1 , ... argN

Список указателей на аргументы. Аргумент arg0 обычно является указателем на


параметр cmdname . Аргументы arg1 – argN являются указателями на строки
символов, которые образуют новый список аргументов. После argN должно
следовать указатель NULL , отмечающий конец списка аргументов.

Возвращаемое значение
Возвращаемое значение синхронных функций _spawnlp или _wspawnlp (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnlp или _wspawnlp
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс специально вызывает процедуру exit с ненулевым
аргументом. Если новый процесс явно не задал положительное состояние выхода,
положительное состояние выхода указывает на аномальный выход с прерыванием
или прерыванием. Возвращаемое значение -1 указывает на ошибку (новый
процесс не запущен). В этом случае errno имеет одно из следующих значений.

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найден.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Каждая из этих функций создает и выполняет новый процесс и передает каждый
аргумент командной строки как отдельный параметр, а также использует
переменную среды PATH для поиска выполняемого файла.

Эти функции проверяют свои параметры. Если или cmdname arg0 является пустой
строкой или пустым указателем, эти функции создают исключение недопустимого
параметра, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают -1. Нет порожденных новых процессов.

Требования
Подпрограмма Обязательный заголовок

_spawnlp <process.h>

_wspawnlp <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawn, _wspawn functions.

См. также раздел


Управление процессами и средой

_spawnФункции , _wspawn

abort

atexit

_execФункции , _wexec

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnlpe
Статья • 03.04.2023

Имя spawnlpe функции, зависят от Майкрософт, является устаревшим псевдонимом


_spawnlpe для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnlpe . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnlpe , _wspawnlpe
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnlpe(

int mode,

const char *cmdname,


const char *arg0,

const char *arg1,

... const char *argn,

NULL,

const char *const *envp

);

intptr_t _wspawnlpe(

int mode,

const wchar_t *cmdname,

const wchar_t *arg0,


const wchar_t *arg1,
... const wchar_t *argn,

NULL,

const wchar_t *const *envp

);

Параметры
mode

Режим выполнения для вызывающего процесса.

cmdname

Путь к выполняемому файлу.


arg0 , arg1 , ... argN

Список указателей на аргументы. Аргумент arg0 обычно является указателем на


параметр cmdname . Аргументы arg1 – argN являются указателями на строки
символов, которые образуют новый список аргументов. После argN должно
следовать указатель NULL , отмечающий конец списка аргументов.

envp

Массив указателей на параметры среды.

Возвращаемое значение
Возвращаемое значение синхронных функций _spawnlpe или _wspawnlpe (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnlpe или _wspawnlpe
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс использует ненулевой аргумент для вызова процедуры
exit . Если новый процесс явно не установил положительное состояние выхода,
положительное состояние выхода указывает на ненормальный выход, вызванный
прерыванием или прерыванием. Возвращаемое значение -1 указывает на ошибку
(новый процесс не запущен). В этом случае errno имеет одно из следующих
значений.

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций создает и выполняет новый процесс и передает каждый
аргумент командной строки как отдельный параметр, а также передает массив
указателей на параметры среды. Для поиска выполняемого файла в таких функциях
используется переменная среды PATH .

Эти функции проверяют свои параметры. Если либо является пустой строкой или
пустым указателем, вызывается обработчик недопустимых параметров, как
описано в разделе "Проверка параметров". cmdname arg0 Если продолжение
выполнения разрешено, эти функции устанавливают для errno значение EINVAL и
возвращают -1. Нет порожденных новых процессов.

Требования
Подпрограмма Обязательный заголовок

_spawnlpe <process.h>

_wspawnlpe <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawnразделе " _wspawn Функции".

См. также раздел


Управление процессами и средой

_spawn, _wspawn функции

abort

atexit

_exec, _wexec функции

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnv
Статья • 03.04.2023

Имя spawnv функции, зависят от Майкрософт, является устаревшим псевдонимом


_spawnv для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnv . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnv , _wspawnv
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnv(

int mode,

const char *cmdname,


const char *const *argv

);

intptr_t _wspawnv(

int mode,

const wchar_t *cmdname,

const wchar_t *const *argv

);

Параметры
mode

Режим выполнения для вызывающего процесса.

cmdname

Путь к выполняемому файлу.

argv

Массив указателей на аргументы. Аргумент argv[0] обычно является указателем на


путь в реальном режиме или на имя программы в защищенном режиме, а argv[1]
с помощью — argv[n] указатели на строки символов, образующие новый список
аргументов. Аргумент argv[n+1] должен быть указателем NULL для обозначения
конца списка аргументов.
Возвращаемое значение
Возвращаемое значение синхронных функций _spawnv или _wspawnv (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnv или _wspawnv
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс специально вызывает процедуру exit с ненулевым
аргументом. Если новый процесс явно не задал положительное состояние выхода,
положительное состояние выхода указывает на аномальный выход с прерыванием
или прерыванием. Возвращаемое значение -1 указывает на ошибку (новый
процесс не запущен). В этом случае errno имеет одно из следующих значений.

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найден.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Каждая из этих функций создает и выполняет новый процесс, передавая ему
массив указателей на аргументы командной строки.

Эти функции проверяют свои параметры. Если значение cmdname или argv является
пустым указателем или указывает argv на пустой указатель или argv[0] является
пустой строкой, вызывается обработчик недопустимых параметров, как описано в
разделе Проверка параметров. Если продолжение выполнения разрешено, эти
функции устанавливают для errno значение EINVAL и возвращают -1. Нет
порожденных новых процессов.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_spawnv <stdio.h> или <process.h>

_wspawnv <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawn, _wspawn functions.

См. также раздел


Управление процессами и средой

_spawnФункции , _wspawn

abort

atexit

_execФункции , _wexec

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnve
Статья • 03.04.2023

Имя spawnve функции, зависят от Майкрософт, является устаревшим псевдонимом


_spawnve для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnve . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnve , _wspawnve
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnve(

int mode,

const char *cmdname,


const char *const *argv,

const char *const *envp

);

intptr_t _wspawnve(

int mode,

const wchar_t *cmdname,

const wchar_t *const *argv,

const wchar_t *const *envp

);

Параметры
mode

Режим выполнения для вызывающего процесса.

cmdname

Путь к выполняемому файлу.

argv

Массив указателей на аргументы. Аргумент argv[0] обычно является указателем на


путь в реальном режиме или имя программы в защищенном режиме, а argv[1]
также с помощью argv[n] указателей на символьные строки, образующие новый
список аргументов. Аргумент argv[n+1] должен быть указателем NULL , чтобы
пометить конец списка аргументов.

envp

Массив указателей на параметры среды.

Возвращаемое значение
Возвращаемое значение синхронных функций _spawnve или _wspawnve (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnve или _wspawnve
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс специально вызывает процедуру exit с ненулевым
аргументом. Если новый процесс явно не установил положительное состояние
выхода, положительное состояние выхода указывает на ненормальный выход с
прерыванием или прерыванием. Возвращаемое значение -1 указывает на ошибку
(новый процесс не запущен). В этом случае errno имеет одно из следующих
значений.

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения об этих и других кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций создает и выполняет новый процесс, передавая ему
массив указателей на аргументы командной строки и массив указателей на
параметры среды.
Эти функции проверяют свои параметры. Если какой-либо cmdname или argv
является пустым указателем или указывает argv на пустой указатель или argv[0]
является пустой строкой, вызывается обработчик недопустимых параметров, как
описано в разделе "Проверка параметров". Если продолжение выполнения
разрешено, эти функции устанавливают для errno значение EINVAL и возвращают
-1. Нет порожденных новых процессов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_spawnve <stdio.h> или <process.h>

_wspawnve <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawnразделе " _wspawn Функции".

См. также раздел


Управление процессами и средой

_spawn, _wspawn функции

abort

atexit

_exec, _wexec функции

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnvp
Статья • 03.04.2023

Имя spawnvp функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _spawnvp функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnvp . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnvp , _wspawnvp
Статья • 03.04.2023

Создает и выполняет процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnvp(

int mode,

const char *cmdname,


const char *const *argv

);

intptr_t _wspawnvp(

int mode,

const wchar_t *cmdname,

const wchar_t *const *argv

);

Параметры
mode

Режим выполнения для вызова процесса.

cmdname

Путь к выполняемому файлу.

argv

Массив указателей на аргументы. Аргумент argv[0] обычно является указателем на


путь в реальном режиме или на имя программы в защищенном режиме, а argv[1]
с помощью — argv[n] указатели на строки символов, образующие новый список
аргументов. Аргумент argv[n+1] должен быть указателем NULL для обозначения
конца списка аргументов.
Возвращаемое значение
Возвращаемое значение синхронных функций _spawnvp или _wspawnvp (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnvp или _wspawnvp
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс использует ненулевой аргумент для вызова процедуры
exit . Если новый процесс явно не задал положительное состояние выхода,
положительное состояние выхода указывает на аномальный выход с прерыванием
или прерыванием. Возвращаемое значение -1 указывает на ошибку (новый
процесс не запущен). В этом случае errno имеет одно из следующих значений:

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найден.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

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

Эти функции проверяют свои параметры. Если значение cmdname или argv является
пустым указателем или указывает argv на пустой указатель или argv[0] является
пустой строкой, вызывается обработчик недопустимых параметров, как описано в
разделе Проверка параметров. Если продолжение выполнения разрешено, эти
функции устанавливают для errno значение EINVAL и возвращают -1. Нет
порожденных новых процессов.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_spawnvp <stdio.h> или <process.h>

_wspawnvp <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawn, _wspawn functions.

См. также раздел


Управление процессами и средой

_spawnФункции , _wspawn

abort

atexit

_execФункции , _wexec

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
spawnvpe
Статья • 03.04.2023

Имя spawnvpe функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _spawnvpe функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _spawnvpe . Вы также можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен предупреждений и
функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_spawnvpe , _wspawnvpe
Статья • 03.04.2023

Создает и выполняет новый процесс.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

intptr_t _spawnvpe(

int mode,

const char *cmdname,


const char *const *argv,

const char *const *envp

);

intptr_t _wspawnvpe(

int mode,

const wchar_t *cmdname,

const wchar_t *const *argv,

const wchar_t *const *envp

);

Параметры
mode

Режим выполнения для вызывающего процесса

cmdname

Путь к выполняемому файлу

argv

Массив указателей на аргументы. Аргумент argv[0] обычно является указателем на


путь в реальном режиме или имя программы в защищенном режиме, а argv[1]
также с помощью argv[n] указателей на символьные строки, образующие новый
список аргументов. Аргумент argv[n+1] должен быть указателем NULL , чтобы
пометить конец списка аргументов.

envp

Массив указателей на параметры среды

Возвращаемое значение
Возвращаемое значение синхронных функций _spawnvpe или _wspawnvpe (для
параметра _P_WAIT указано значение _ mode ) — это состояние завершения нового
процесса. Возвращаемое значение асинхронной функции _spawnvpe или _wspawnvpe
(для параметра _P_NOWAIT указано значение _P_NOWAITO или mode ) — это дескриптор
процесса. Состояние выхода имеет значение 0, если процесс завершился обычным
образом. Для состояния выхода можно задать ненулевое значение, если
порожденный процесс специально вызывает процедуру exit с ненулевым
аргументом. Если новый процесс явно не установил положительное состояние
выхода, положительное состояние выхода указывает на ненормальный выход с
прерыванием или прерыванием. Возвращаемое значение -1 указывает на ошибку
(новый процесс не запущен). В этом случае errno имеет одно из следующих
значений:

Значение Описание

E2BIG Длина списка аргументов превышает 1024 байта.

EINVAL Недопустимый аргумент mode .

ENOENT Файл или путь не найдены.

ENOEXEC Указанный файл не является исполняемым или имеет недопустимый формат


исполняемого файла.

ENOMEM Недостаточно памяти для выполнения нового процесса.

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая из этих функций создает и выполняет новый процесс, передавая ему
массив указателей на аргументы командной строки и массив указателей на
параметры среды. Для поиска выполняемого файла в таких функциях используется
переменная среды PATH .

Эти функции проверяют свои параметры. Если какой-либо cmdname или argv
является пустым указателем или указывает argv на пустой указатель или argv[0]
является пустой строкой, вызывается обработчик недопустимых параметров, как
описано в разделе "Проверка параметров ". Если продолжение выполнения
разрешено, эти функции устанавливают для errno значение EINVAL и возвращают
-1. Нет порожденных новых процессов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_spawnvpe <stdio.h> или <process.h>

_wspawnvpe <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в _spawnразделе " _wspawn Функции".

См. также раздел


abort

atexit

_exec, _wexec функции

exit, _Exit, _exit

_flushall

_getmbcp

_onexit, _onexit_m

_setmbcp

system, _wsystem
_splitpath , _wsplitpath
Статья • 03.04.2023

Разбивают имя пути на компоненты. Доступны более безопасные версии этих


функций, см. раздел_splitpath_s , _wsplitpath_s.

Синтаксис
C

void _splitpath(

const char *path,

char *drive,

char *dir,

char *fname,

char *ext

);

void _wsplitpath(

const wchar_t *path,


wchar_t *drive,

wchar_t *dir,

wchar_t *fname,

wchar_t *ext

);

Параметры
path

Полный путь.

drive

Буква диска, за которой следует двоеточие (:). Этот параметр можно передать NULL
, если буква диска не нужна.

dir

Путь к каталогу, включая заключительную косую черту. Могут использоваться


символы косой черты (/), обратной косой черты (\) или оба. Этот параметр можно
передать NULL , если путь к каталогу не нужен.

fname

Базовое имя файла (без расширения). Этот параметр можно передать NULL , если
имя файла не требуется.
ext

Расширение имени файла, включая начальную точку (.). Этот параметр можно
передать NULL , если расширение имени файла не требуется.

Комментарии
Функция _splitpath разделяет путь на четыре компонента. Функция _splitpath
автоматически требуемым образом обрабатывает аргументы в виде
многобайтовых строк, распознавая многобайтовые последовательности символов
в соответствии с текущей многобайтовой кодовой страницей. _wsplitpath — это
двухбайтовая версия _splitpath ; аргументы для _wsplitpath представляют собой
двухбайтовые строки. В остальном эти функции ведут себя одинаково.

Примечание о безопасности. Эти функции предполагают потенциальную угрозу,


связанную с проблемой переполнения буфера. Проблемы переполнения буфера
— это распространенный метод атак на системы, который приводит к
несанкционированному повышению уровня прав. Дополнительные сведения см . в
статье Предотвращение переполнения буфера. Доступны более безопасные версии
этих функций; См. раздел_splitpath_s , _wsplitpath_s.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tsplitpath _splitpath _splitpath _wsplitpath

Каждый компонент полного пути хранится в отдельном буфере; Константы


_MAX_DRIVE манифеста , _MAX_DIR , _MAX_FNAME и _MAX_EXT (определенные в STDLIB.H )

определяют максимальный размер каждого компонента файла. Компоненты


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

Каждый буфер должен быть соразмерен соответствующей константе манифеста,


чтобы избежать потенциального переполнения буфера.

В приведенной ниже таблице перечислены значения констант манифеста.


Имя Значение

_MAX_DRIVE 3

_MAX_DIR 256

_MAX_FNAME 256

_MAX_EXT 256

Если полный путь не содержит компонент (например, имя файла), _splitpath


назначает пустые строки соответствующим буферам.

Вы можете передать NULL в _splitpath для любого параметра, кроме path того,
который вам не нужен.

Если path имеет значение NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, параметр errno устанавливается в значение EINVAL , и функция
возвращает значение EINVAL .

Требования
Подпрограмма Обязательный заголовок

_splitpath <stdlib.h>

_wsplitpath <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _makepath.

См. также раздел


Обработка файлов

_fullpath, _wfullpath

_getmbcp

_makepath, _wmakepath

_setmbcp

_splitpath_s, _wsplitpath_s
_splitpath_s , _wsplitpath_s
Статья • 03.04.2023

Разбивает имя пути на компоненты. Эти функции являются версиями _splitpathс


усовершенствованиями безопасности, _wsplitpath описанными в разделе Функции
безопасности в CRT.

Синтаксис
C

errno_t _splitpath_s(

const char * path,

char * drive,

size_t driveNumberOfElements,

char * dir,

size_t dirNumberOfElements,

char * fname,

size_t nameNumberOfElements,

char * ext,

size_t extNumberOfElements

);

errno_t _wsplitpath_s(

const wchar_t * path,

wchar_t * drive,

size_t driveNumberOfElements,

wchar_t *dir,

size_t dirNumberOfElements,

wchar_t * fname,

size_t nameNumberOfElements,

wchar_t * ext,

size_t extNumberOfElements

);

template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t


extsize>

errno_t _splitpath_s(

const char *path,

char (&drive)[drivesize],

char (&dir)[dirsize],

char (&fname)[fnamesize],

char (&ext)[extsize]

); // C++ only

template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t


extsize>

errno_t _wsplitpath_s(

const wchar_t *path,


wchar_t (&drive)[drivesize],

wchar_t (&dir)[dirsize],

wchar_t (&fname)[fnamesize],

wchar_t (&ext)[extsize]

); // C++ only

Параметры
path

Полный путь.

drive

Буква диска с двоеточием в конце ( : ). Этот параметр можно передать NULL , если
буква диска не нужна.

driveNumberOfElements

Размер буфера drive в однобайтовых или расширенных символах. Если параметр


drive имеет значение NULL , это значение должно быть 0.

dir

Путь к каталогу, включая заключительную косую черту. Могут использоваться


символы косой черты ( / ), обратной косой черты ( \\ ) или оба. Этот параметр
можно передать NULL , если путь к каталогу не нужен.

dirNumberOfElements

Размер буфера dir в однобайтовых или расширенных символах. Если параметр


dir имеет значение NULL , это значение должно быть 0.

fname

Базовое имя файла (без расширения). Этот параметр можно передать NULL , если
имя файла не требуется.

nameNumberOfElements

Размер буфера fname в однобайтовых или расширенных символах. Если параметр


fname имеет значение NULL , это значение должно быть 0.

ext

Расширение имени файла, включая начальную точку ( . ). Этот параметр можно


передать NULL , если расширение имени файла не требуется.

extNumberOfElements

Размер буфера ext в однобайтовых или расширенных символах. Если параметр


ext имеет значение NULL , это значение должно быть 0.
Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.

Условия ошибок

Условие Возвращаемое
значение

path имеет значение NULL . EINVAL

drive имеет значение NULL , driveNumberOfElements отличен от EINVAL


нуля

drive отличен от NULL , driveNumberOfElements равен нулю EINVAL

dir имеет значение NULL , dirNumberOfElements отличен от нуля EINVAL

dir отличен от NULL , dirNumberOfElements равен нулю EINVAL

fname имеет значение NULL , nameNumberOfElements отличен от EINVAL


нуля

fname отличен от NULL , nameNumberOfElements равен нулю EINVAL

ext имеет значение NULL , extNumberOfElements отличен от нуля EINVAL

ext отличен от NULL , extNumberOfElements равен нулю EINVAL

При возникновении любого из указанных выше условий вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров . Если
выполнение может быть продолжено, эти функции устанавливают параметр errno
в значение EINVAL и возвращают значение EINVAL .

Если какой-либо из этих буферов слишком мал для хранения результата, эти
функции очищают все буферы, присваивают им пустые строки, устанавливают для
параметра errno значение ERANGE и возвращают ERANGE .

Комментарии
Функция _splitpath_s разделяет путь на четыре компонента. Функция _splitpath_s
автоматически требуемым образом обрабатывает аргументы в виде
многобайтовых строк, распознавая многобайтовые последовательности символов
в соответствии с текущей многобайтовой кодовой страницей. _wsplitpath_s — это
двухбайтовая версия _splitpath_s ; аргументы для _wsplitpath_s представляют
собой двухбайтовые строки. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tsplitpath_s _splitpath_s _splitpath_s _wsplitpath_s

Каждый компонент полного пути хранится в отдельном буфере; Константы


_MAX_DRIVE манифеста , _MAX_DIR , _MAX_FNAME и _MAX_EXT (определенные в STDLIB.H )
указывают максимальный допустимый размер для каждого компонента файла.
Компоненты файла, размер которых превышает значения соответствующих
констант манифеста, могут вызвать повреждение кучи.

В приведенной ниже таблице перечислены значения констант манифеста.

Имя Значение

_MAX_DRIVE 3

_MAX_DIR 256

_MAX_FNAME 256

_MAX_EXT 256

Если полный путь не содержит компонент (например, имя файла), _splitpath_s


назначает пустую строку соответствующему буферу.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте ._CrtSetDebugFillThreshold

Требования
Подпрограмма Обязательный заголовок

_splitpath_s <stdlib.h>

_wsplitpath_s <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _makepath_s, _wmakepath_s.

См. также раздел


Обработка файлов

_splitpath, _wsplitpath

_fullpath, _wfullpath

_getmbcp

_makepath, _wmakepath

_setmbcp
sprintf , _sprintf_l , swprintf ,
_swprintf , _swprintf_l , __swprintf_l
Статья • 10.03.2023

Запись форматированных данных в строку. Доступны более безопасные версии


некоторых из этих функций; См. разделsprintf_s , _sprintf_s_l, swprintf_s, . _swprintf_s_l
Безопасные версии swprintf и _swprintf_l принимают размер буфера в качестве
параметра.

Синтаксис
C

int sprintf(

char *buffer,

const char *format [,

argument] ...

);

int _sprintf_l(

char *buffer,

const char *format,

_locale_t locale [,

argument] ...

);

int swprintf(

wchar_t *buffer,

size_t count,

const wchar_t *format [,

argument]...

);

int _swprintf(

wchar_t *buffer,

const wchar_t *format [,

argument]...

);

int _swprintf_l(

wchar_t *buffer,

size_t count,

const wchar_t *format,

_locale_t locale [,

argument] ...

);

int __swprintf_l(

wchar_t *buffer,

const wchar_t *format,

_locale_t locale [,

argument] ...

);

template <size_t size>

int sprintf(

char (&buffer)[size],

const char *format [,

argument] ...

); // C++ only

template <size_t size>

int _sprintf_l(

char (&buffer)[size],

const char *format,

_locale_t locale [,

argument] ...

); // C++ only

Параметры
buffer

Место хранения выходных данных

count

Максимальное количество символов, которое может хранить эта функция в версии


Юникод.

format

Строка управления форматом

argument

Необязательные аргументы

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования.

Возвращаемое значение
Число записанных символов или -1, если произошла ошибка. Если buffer или
format является пустым указателем, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если разрешается
продолжать выполнение, эти функции возвращают -1 и задают errno значение
EINVAL .

sprintf возвращает число байтов, сохраненных в buffer без учета завершающего

символа null. swprintf возвращает число расширенных символов, сохраненных в


buffer , без учета завершающего расширенного символа null.

Комментарии
Функция sprintf форматирует и сохраняет набор символов и значений в buffer .
Каждый argument (если он есть) преобразуется и выводится согласно
соответствующей спецификацией формата в format . Формат состоит из обычных
символов и имеет те же форму и функциональные возможности, что и аргумент
format для printf. После последнего написанного символа добавляется символ null.
Если копирование производится между перекрывающимися строками, поведение
не определено.

) Важно!

Функция sprintf не позволяет ограничить число записываемых символов, а


значит, код, включающий функцию sprintf , может привести к переполнению
буфера. Рассмотрите возможность использования связанной функции
_snprintf, которая задает максимальное количество символов для записи
buffer в , или используйте для _scprintf определения размера буфера. Кроме

того, убедитесь, что format не является строкой, определяемой пользователем.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

swprintf — это двухбайтовая версия sprintf ; аргументы указателя для swprintf


представляют собой двухбайтовые строки. Обнаружение ошибок кодирования в
swprintf может отличаться от sprintf . swprintf и fwprintf ведут себя одинаково,
за исключением swprintf записи выходных данных в строку, а не в назначение
типа FILE , и swprintf требует count , чтобы параметр указать максимальное число
символов для записи. Версии этих функций с суффиксом _l идентичны, за
исключением того, что они используют переданный параметр языкового стандарта
вместо текущего языкового стандарта потока.

До стандартизации сигнатуры для swprintf версия, поставляемая в старой


библиотеке среды выполнения Microsoft C, которая не принимает параметр число
символов. Более старая версия по-прежнему доступна в библиотеке среды
выполнения Microsoft C, но она устарела и была переименована _swprintf() в . Для
кода, написанного на основе старой сигнатуры, определите
_CRT_NON_CONFORMING_SWPRINTFS , который сопоставляет вызовы с swprintf _swprintf .

В будущей версии старое поведение может быть удалено, поэтому код необходимо
изменить в соответствии с новым стандартным поведением.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_stprintf sprintf sprintf _swprintf

_stprintf_l _sprintf_l _sprintf_l __swprintf_l

Требования
Подпрограмма Обязательный заголовок

sprintf , _sprintf_l <stdio.h>

swprintf , _swprintf , _swprintf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример. Использование sprintf для


форматирования данных
C

// crt_sprintf.c

// compile with: /W3

// This program uses sprintf to format various

// data and place them in the string named buffer.

#include <stdio.h>

int main( void )

char buffer[200], s[] = "computer", c = 'l';

int i = 35, j;

float fp = 1.7320534f;

// Format and print various data:

j = sprintf( buffer, " String: %s\n", s ); // C4996

j += sprintf( buffer + j, " Character: %c\n", c ); // C4996

j += sprintf( buffer + j, " Integer: %d\n", i ); // C4996

j += sprintf( buffer + j, " Real: %f\n", fp );// C4996

// Note: sprintf is deprecated; consider using sprintf_s instead

printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );

Output

Output:

String: computer

Character: l

Integer: 35

Real: 1.732053

character count = 79

Пример. Обработка кода ошибки


C

// crt_swprintf.c

// wide character example

// also demonstrates swprintf returning error code

#include <stdio.h>

int main( void )

wchar_t buf[100];

int len = swprintf( buf, 100, L"%s", L"Hello world" );

printf( "wrote %d characters\n", len );

len = swprintf( buf, 100, L"%s", L"Hello\xffff world" );

// swprintf fails because string contains WEOF (\xffff)

printf( "wrote %d characters\n", len );

Output

wrote 11 characters

wrote -1 characters

См. также раздел


Потоковый ввод-вывод

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

Функции vprintf
_sprintf_p , _sprintf_p_l , _swprintf_p ,
_swprintf_p_l
Статья • 03.04.2023

Запись форматированных данных в строку с возможностью указать порядок


использования параметров в строке формата.

Синтаксис
C

int _sprintf_p(

char *buffer,

size_t sizeOfBuffer,
const char *format [,

argument_list]

);

int _sprintf_p_l(

char *buffer,

size_t sizeOfBuffer,
const char *format,

_locale_t locale [,

argument_list]

);

int _swprintf_p(

wchar_t *buffer,

size_t sizeOfBuffer,
const wchar_t *format [,

argument_list]

);

int _swprintf_p_l(

wchar_t *buffer,

size_t sizeOfBuffer,
const wchar_t *format,

_locale_t locale [,

argument_list]

);

Параметры
buffer

Место хранения выходных данных

sizeOfBuffer

Наибольшее число символов для хранения.


format

Строка управления форматом.

argument_list

Необязательные аргументы строки формата.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации формата.

Возвращаемое значение
Число записанных символов или -1, если произошла ошибка.

Комментарии
Функция _sprintf_p форматирует и сохраняет набор символов и значений в
buffer . Каждый аргумент в (если таковой argument_list имеется) преобразуется и

выводится в соответствии с соответствующей спецификацией формата в format .


Аргумент format использует синтаксис спецификации формата для printf функций и
wprintf. После последнего написанного символа добавляется символ null. Если
копирование производится между перекрывающимися строками, поведение не
определено. Различие между функциями _sprintf_p и sprintf_s заключается в
том, что функция _sprintf_p поддерживает позиционные параметры,
позволяющие определить порядок, в котором аргументы используются в строке
форматирования. Дополнительные сведения см. в разделе printf_p Позиционные
параметры.

_swprintf_p — это двухбайтовая версия _sprintf_p ; аргументы указателя для

_swprintf_p представляют собой двухбайтовые строки. Обнаружение ошибок


кодирования в _swprintf_p может отличаться от обнаружения в _sprintf_p .
_swprintf_p и fwprintf_p ведут себя одинаково за тем исключением, что

_swprintf_p записывает выходные данные в строку, а не в назначение типа FILE , а


_swprintf_p требует настройки параметра count , определяющего максимальное

количество символов для записи. Версии этих функций с суффиксом _l идентичны


за исключением того, что они используют переданный параметр языкового
стандарта вместо языкового стандарта текущего потока.
_sprintf_p возвращает число байтов, сохраненных в buffer без учета

завершающего символа null. _swprintf_p возвращает число расширенных


символов, сохраненных в buffer , без учета завершающего расширенного символа
null. Если buffer или format является пустым указателем или строка
форматирования содержит недопустимые символы форматирования, вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если разрешается продолжать выполнение, эти функции возвращают
-1 и задают errno значение EINVAL .

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


печатает точно представленные числа с плавающей запятой в соответствии с
правилами округления IEEE 754. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 гласит, что они должны округлиться до ближайшей
четной цифры (также известный как "Округление банкира"). Например, и
printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до 2. Ранее

значение 1,5 округлялось до 2, а 2,5 округлялось до 3. Это изменение влияет


только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,350000000000000008) продолжает
округление до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_stprintf_p _sprintf_p _sprintf_p _swprintf_p

_stprintf_p_l _sprintf_p_l _sprintf_p_l _swprintf_p_l

Требования
Подпрограмма Обязательный заголовок

_sprintf_p , _sprintf_p_l <stdio.h>

_swprintf_p , _swprintf_p_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример. Использование _sprintf_p для


форматирования данных
C

// crt_sprintf_p.c

// This program uses _sprintf_p to format various

// data and place them in the string named buffer.

//

#include <stdio.h>

int main( void )

char buffer[200],

s[] = "computer", c = 'l';

int i = 35,

j;

float fp = 1.7320534f;

// Format and print various data:

j = _sprintf_p( buffer, 200,

" String: %s\n", s );

j += _sprintf_p( buffer + j, 200 - j,

" Character: %c\n", c );

j += _sprintf_p( buffer + j, 200 - j,

" Integer: %d\n", i );

j += _sprintf_p( buffer + j, 200 - j,

" Real: %f\n", fp );

printf( "Output:\n%s\ncharacter count = %d\n",

buffer, j );

Output

Output:

String: computer

Character: l

Integer: 35

Real: 1.732053

character count = 79

Пример. Обработка кода ошибки


C

// crt_swprintf_p.c

// This is the wide character example which

// also demonstrates _swprintf_p returning

// error code.

#include <stdio.h>

#define BUFFER_SIZE 100

int main( void )

wchar_t buffer[BUFFER_SIZE];

int len;

len = _swprintf_p(buffer, BUFFER_SIZE, L"%2$s %1$d",

0, L" marbles in your head.");

_printf_p( "Wrote %d characters\n", len );

// _swprintf_p fails because string contains WEOF (\xffff)

len = _swprintf_p(buffer, BUFFER_SIZE, L"%s",

L"Hello\xffff world" );

_printf_p( "Wrote %d characters\n", len );

Output

Wrote 24 characters

Wrote -1 characters

См. также раздел


Потоковый ввод-вывод

_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

Функции vprintf

printf_p Позиционные параметры


sprintf_s , _sprintf_s_l , swprintf_s ,
_swprintf_s_l
Статья • 22.10.2022

Запись форматированных данных в строку. Это версии , ,


__swprintf_l_swprintf_lswprintf_sprintf_lс улучшениями безопасности, как описано в
функцияхsprintfбезопасности в CRT.

Синтаксис
C

int sprintf_s(

char *buffer,

size_t sizeOfBuffer,
const char *format,

...

);

int _sprintf_s_l(

char *buffer,

size_t sizeOfBuffer,
const char *format,

_locale_t locale,

...

);

int swprintf_s(

wchar_t *buffer,

size_t sizeOfBuffer,
const wchar_t *format,

...

);

int _swprintf_s_l(

wchar_t *buffer,

size_t sizeOfBuffer,
const wchar_t *format,

_locale_t locale,

...

);

template <size_t size>

int sprintf_s(

char (&buffer)[size],

const char *format,

...

); // C++ only

template <size_t size>

int swprintf_s(

wchar_t (&buffer)[size],

const wchar_t *format,

...

); // C++ only

Параметры
buffer

Место хранения выходных данных

sizeOfBuffer

Наибольшее число символов для хранения.

format

Строка управления форматом

...

Необязательные аргументы для форматирования

locale

Используемый языковой стандарт.

Дополнительные сведения см. в описании синтаксиса спецификации формата.

Возвращаемое значение
Число записанных символов или -1, если произошла ошибка. Если buffer или
format является пустым указателем, sprintf_s и swprintf_s возвращают значение

-1 и задают errno равным EINVAL .

sprintf_s возвращает число байтов, сохраненных в buffer без учета


завершающего символа null. swprintf_s возвращает число расширенных символов,
сохраненных в buffer , без учета завершающего расширенного символа null.

Комментарии
Функция sprintf_s форматирует и сохраняет набор символов и значений в buffer .
Каждый argument (если он есть) преобразуется и выводится согласно
соответствующей спецификацией формата в format . Формат состоит из обычных
символов и имеет те же форму и функциональные возможности, что и аргумент
format для printf. После последнего написанного символа добавляется символ null.

Если копирование производится между перекрывающимися строками, поведение


не определено.
Основное различие между sprintf_s и sprintf заключается в том, что sprintf_s
проверяет строку форматирования на наличие допустимых символов
форматирования, тогда как sprintf только проверяет, является ли строка формата
или буфер указателем NULL . Если проверка завершается ошибкой, вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если выполнение может быть продолжено, функция возвращает -1 и
устанавливает errno в значение EINVAL .

Другое основное различие между sprintf_s и sprintf в том, что sprintf_s


принимает параметр длины, определяющий размер буфера вывода в символах.
Если буфер слишком мал для форматированного текста, включая завершающий
символ null, то ему присваивается пустая строка путем размещения символа null в
buffer[0] и вызывается обработчик недопустимого параметра. В отличие от
_snprintf , sprintf_s гарантирует, что буфер будет завершен символом null (если

размер буфера не равен нулю).

swprintf_s — это двухбайтовая версия sprintf_s ; аргументы указателя для

swprintf_s представляют собой двухбайтовые строки. Обнаружение ошибок

кодирования в swprintf_s может отличаться от обнаружения ошибок в sprintf_s .


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

В C++ использование этих функций упрощено наличием шаблонных перегрузок;


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

Существуют версии sprintf_s , которые обеспечивают дополнительный контроль


над происходящим, если буфер слишком мал. Дополнительные сведения см. в
разделе _snprintf_s, _snprintf_s_l, _snwprintf_s. _snwprintf_s_l

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5
округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно
представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_stprintf_s sprintf_s sprintf_s swprintf_s

_stprintf_s_l _sprintf_s_l _sprintf_s_l _swprintf_s_l

Требования
Подпрограмма Обязательный заголовок

sprintf_s , _sprintf_s_l C: <stdio.h>

C++: <cstdio> или <stdio.h>

swprintf_s , _swprintf_s_l C: <stdio.h> или <wchar.h>

C++: <cstdio>, <cwchar>, <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример. Форматирование данных с


помощью sprintf_s
C
// crt_sprintf_s.c

// This program uses sprintf_s to format various

// data and place them in the string named buffer.

//

#include <stdio.h>

int main( void )

char buffer[200], s[] = "computer", c = 'l';

int i = 35, j;

float fp = 1.7320534f;

// Format and print various data:

j = sprintf_s( buffer, 200, " String: %s\n", s );

j += sprintf_s( buffer + j, 200 - j, " Character: %c\n", c );

j += sprintf_s( buffer + j, 200 - j, " Integer: %d\n", i );

j += sprintf_s( buffer + j, 200 - j, " Real: %f\n", fp );

printf_s( "Output:\n%s\ncharacter count = %d\n", buffer, j );

Output

Output:

String: computer

Character: l

Integer: 35

Real: 1.732053

character count = 79

Пример: обработка кода ошибки


C

// crt_swprintf_s.c

// wide character example

// also demonstrates swprintf_s returning error code

#include <stdio.h>

int main( void )

wchar_t buf[100];

int len = swprintf_s( buf, 100, L"%s", L"Hello world" );

printf( "wrote %d characters\n", len );

len = swprintf_s( buf, 100, L"%s", L"Hello\xffff world" );

// swprintf_s fails because string contains WEOF (\xffff)

printf( "wrote %d characters\n", len );

Output

wrote 11 characters

wrote -1 characters

См. также раздел


Потоковый ввод-вывод

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

Функции vprintf
sqrt , sqrtf , sqrtl
Статья • 03.04.2023

Вычисляет квадратный корень.

Синтаксис
C

double sqrt(

double x

);

float sqrt(

float x

); // C++ only

long double sqrt(

long double x

); // C++ only

float sqrtf(

float x

);

long double sqrtl(

long double x

);

#define sqrt(x) // Requires C11 or higher

Параметры
x

Неотрицательные значения с плавающей запятой

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки sqrt , которые
принимают типы float или long double . В программе на языке C, если вы не
используете <tgmath.h> макрос для вызова этой функции, sqrt всегда принимает и
возвращает . double

При использовании макроса <tgmath.h> sqrt() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Возвращаемое значение
Функции sqrt возвращают квадратный корень x . По умолчанию, если x имеет
отрицательное значение, sqrt возвращает неопределенное значение NaN .

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

-INF нет _DOMAIN

x < 0 нет _DOMAIN

Требования
Компонент Заголовок C Заголовок C++

sqrt , sqrtf , sqrtl <math.h> <cmath>

sqrt Макрос <tgmath.h>

Сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_sqrt.c

// This program calculates a square root.

#include <math.h>

#include <stdio.h>

#include <stdlib.h>

int main( void )

double question = 45.35, answer;

answer = sqrt( question );

if( question < 0 )

printf( "Error: sqrt returns %f\n", answer );

else

printf( "The square root of %.2f is %.2f\n", question, answer );

Output

The square root of 45.35 is 6.73

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
exp, expf, expl

log, logf, log10, log10f

pow, powf, powl

_CIsqrt\
srand
Статья • 03.04.2023

Задает начальное начальное значение для генератора псевдослучайных чисел,


используемого rand функцией.

Синтаксис
C

void srand(

unsigned int seed

);

Параметры
seed

Начальное значение для создания псевдослучайных чисел

Комментарии
Функция srand задает начальную точку для создания ряда псевдослучайных целых
чисел в текущем потоке. Для повторной инициализации генератора для создания
результатов той же последовательности результатов вызовите функцию srand и
использовать тот же аргумент seed . Любое другое значение для seed задает для
генератора другую начальную точку создания последовательности
псевдослучайных чисел. rand возвращает созданные псевдослучайные числа.
Вызов rand , предшествующий вызову srand , создает ту же последовательность, что
и вызов srand с seed , переданный в качестве 1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

srand <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для rand.

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
rand
sscanf , _sscanf_l , swscanf , _swscanf_l
Статья • 03.04.2023

Считывают форматированные данные из строки. Доступны более безопасные


версии этих функций; см. ,sscanf_s_sscanf_s_l , , swscanf_s. _swscanf_s_l

Синтаксис
C

int sscanf(

const char *buffer,

const char *format [,

argument ] ...

);

int _sscanf_l(

const char *buffer,

const char *format,

_locale_t locale [,

argument ] ...

);

int swscanf(

const wchar_t *buffer,

const wchar_t *format [,

argument ] ...

);

int _swscanf_l(

const wchar_t *buffer,

const wchar_t *format,

_locale_t locale [,

argument ] ...

);

Параметры
buffer

Сохраненные данные

format

Строка управления форматом. Дополнительные сведения см. в разделе Синтаксис


спецификации формата.

argument

Необязательные аргументы
locale

Используемый языковой стандарт

Возвращаемое значение
Каждая из этих функций возвращает количество успешно преобразованных и
назначенных полей; Возвращаемое значение не включает поля, которые были
прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля не
были назначены. Если до первого преобразования возникает ошибка или
достигается конец строки, возвращается значение EOF .

Если buffer или format является указателем NULL , вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
разрешается продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция sscanf считывает данные из buffer в расположение, заданное
параметрами argument . Каждый параметр argument должен быть указателем на
переменную, которая имеет тип, соответствующий спецификатору типа в
параметре format . Аргумент format определяет интерпретацию полей входных
данных и имеет такую же форму и функцию, как аргумент format для функции
scanf . Если копирование производится между перекрывающимися строками,
поведение не определено.

Сведения о символах полей типа scanf см. в разделе scanf Символы полей типа.
Сведения о полях спецификации формата scanf см. в разделе Поля спецификации
формата.

) Важно!

При чтении строки с sscanf помощью всегда указывайте ширину формата %s


(например, " %32s " вместо " %s "); в противном случае неправильно
отформатированные входные данные могут легко вызвать переполнение
буфера.
swscanf — это двухбайтовая версия sscanf ; аргументы для swscanf представляют

собой двухбайтовые строки. sscanf не обрабатывает многобайтовые


шестнадцатеричные символы. swscanf не обрабатывает полноширинный
шестнадцатеричный символ Юникода или символы зоны совместимости. В
противном случае поведение swscanf и sscanf идентично.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_stscanf sscanf sscanf swscanf

_stscanf_l _sscanf_l _sscanf_l _swscanf_l

Требования
Подпрограмма Обязательный заголовок

sscanf , _sscanf_l <stdio.h>

swscanf , _swscanf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_sscanf.c

// compile with: /W3

// This program uses sscanf to read data items

// from a string named tokenstring, then displays them.

#include <stdio.h>

int main( void )

char tokenstring[] = "15 12 14...";

char s[81];

char c;

int i;

float fp;

// Input various data from tokenstring:

// max 80 character string:

sscanf( tokenstring, "%80s", s ); // C4996

sscanf( tokenstring, "%c", &c ); // C4996

sscanf( tokenstring, "%d", &i ); // C4996

sscanf( tokenstring, "%f", &fp ); // C4996

// Note: sscanf is deprecated; consider using sscanf_s instead

// Output the data read

printf( "String = %s\n", s );

printf( "Character = %c\n", c );

printf( "Integer: = %d\n", i );

printf( "Real: = %f\n", fp );

Output

String = 15

Character = 1

Integer: = 15

Real: = 15.000000

См. также раздел


Потоковый ввод-вывод

fscanf, _fscanf_l, fwscanf, _fwscanf_l

scanf, _scanf_l, wscanf, _wscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

snprintf, _snprintf, _snprintf_l, _snwprintf, _snwprintf_l


sscanf_s , _sscanf_s_l , swscanf_s ,
_swscanf_s_l
Статья • 03.04.2023

Считывают форматированные данные из строки. Эти версии sscanf, _sscanf_l,


swscanf_swscanf_l имеют улучшения безопасности, как описано в разделе Функции
безопасности в CRT.

Синтаксис
C

int sscanf_s(

const char *buffer,

const char *format [,

argument ] ...

);

int _sscanf_s_l(

const char *buffer,

const char *format,

_locale_t locale [,

argument ] ...

);

int swscanf_s(

const wchar_t *buffer,

const wchar_t *format [,

argument ] ...

);

int _swscanf_s_l(

const wchar_t *buffer,

const wchar_t *format,

_locale_t locale [,

argument ] ...

);

Параметры
buffer

Сохраненные данные

format

Строка управления форматом. Дополнительные сведения см. в разделе Поля


спецификации формата: scanf и wscanf функции.
argument

Необязательные аргументы

locale

Используемый языковой стандарт

Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые успешно
преобразованы и назначены. Возвращаемое значение не включает поля, которые
были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля
не были назначены. Если до первого преобразования возникает ошибка или
достигается конец строки, возвращается значение EOF .

Если buffer или format является указателем NULL , вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
разрешается продолжать выполнение, эти функции возвращают -1 и присваивают
errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция sscanf_s считывает данные из buffer в расположение, заданное
параметрами argument . Аргументы, следующие за строкой формата, задают
указатели на переменные, имеющие тип, соответствующий спецификатору типа в
format . В отличие от менее безопасной версии sscanf требуется параметр размера
буфера при использовании символов полей типа c , C , s , S или наборов
элементов управления строк, заключенных в [] . Размер буфера в символах
должен быть указан в качестве дополнительного параметра сразу после каждого
параметра буфера, которому он требуется. Например, при чтении в строку размер
буфера для этой строки передается следующим образом:

wchar_t ws[10];

swscanf_s(in_str, L"%9s", ws, (unsigned)_countof(ws)); // buffer size is 10,


width specification is 9

Размер буфера включает завершающее значение NULL. Можно использовать поле


спецификации ширины, чтобы гарантировать, что считываемый токен поместится в
буфер. Если поле спецификации ширины не используется, а считываемые в файле
маркеры слишком велики, чтобы поместиться в буфер, в этот буфер ничего не
записывается.

Один символ можно прочитать следующим образом:

wchar_t wc;

swscanf_s(in_str, L"%c", &wc, 1);

В этом примере считывается один символ из входной строки и затем сохраняется в


буфер расширенных символов. При чтении нескольких символов для строк,
которые не завершаются нуль-символом, целые числа без знака используются как
спецификация ширины и размер буфера.

char c[4];

sscanf_s(input, "%4c", &c, (unsigned)_countof(c)); // not null terminated

Дополнительные сведения см. в разделе scanf_s, _scanf_s_l, _wscanf_s_lwscanf_s и


scanf введите символы полей.

7 Примечание

Параметр размера имеет тип unsigned , а не size_t . При компиляции для 64-
разрядных целевых объектов следует использовать static_cast для
преобразования результатов _countof или sizeof до требуемых размеров.

Аргумент format определяет интерпретацию полей входных данных и имеет такую


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

swscanf_s — это двухбайтовая версия sscanf_s ; аргументы для swscanf_s

представляют собой двухбайтовые строки. sscanf_s не обрабатывает


многобайтовые шестнадцатеричные символы. swscanf_s не обрабатывает
полноширинный шестнадцатеричный символ Юникода или символы зоны
совместимости. В противном случае поведение swscanf_s и sscanf_s идентично.
Версии этих функций с суффиксом _l идентичны версиям без суффикса, за
исключением того, что они используют переданный параметр языкового стандарта
вместо языкового стандарта текущего потока.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_stscanf_s sscanf_s sscanf_s swscanf_s

_stscanf_s_l _sscanf_s_l _sscanf_s_l _swscanf_s_l

Требования
Подпрограмма Обязательный заголовок

sscanf_s , _sscanf_s_l <stdio.h>

swscanf_s , _swscanf_s_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_sscanf_s.c

// This program uses sscanf_s to read data items

// from a string named tokenstring, then displays them.

#include <stdio.h>

#include <stdlib.h>

int main( void )

char tokenstring[] = "15 12 14...";

char s[81];

char c;

int i;

float fp;

// Input various data from tokenstring:

// max 80 character string plus null terminator

sscanf_s( tokenstring, "%s", s, (unsigned)_countof(s) );

sscanf_s( tokenstring, "%c", &c, (unsigned)sizeof(char) );

sscanf_s( tokenstring, "%d", &i );

sscanf_s( tokenstring, "%f", &fp );

// Output the data read

printf_s( "String = %s\n", s );

printf_s( "Character = %c\n", c );

printf_s( "Integer: = %d\n", i );

printf_s( "Real: = %f\n", fp );

Output

String = 15

Character = 1

Integer: = 15

Real: = 15.000000

См. также раздел


Потоковый ввод-вывод

fscanf, _fscanf_l, fwscanf, _fwscanf_l

scanf, _scanf_l, wscanf, _wscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

snprintf, _snprintf, _snprintf_l, _snwprintf, _snwprintf_l


_stat , _stat32 , _stat64 , _stati64 ,
_stat32i64 , _stat64i32 , _wstat ,
_wstat32 , _wstat64 , _wstati64 ,
_wstat32i64 , _wstat64i32
Статья • 27.05.2023

Получает сведения о состоянии файла.

Синтаксис
C

int _stat(

const char *path,

struct _stat *buffer

);

int _stat32(

const char *path,

struct __stat32 *buffer

);

int _stat64(

const char *path,

struct __stat64 *buffer

);

int _stati64(

const char *path,

struct _stati64 *buffer

);

int _stat32i64(

const char *path,

struct _stat32i64 *buffer

);

int _stat64i32(

const char *path,

struct _stat64i32 *buffer

);

int _wstat(

const wchar_t *path,


struct _stat *buffer

);

int _wstat32(

const wchar_t *path,


struct __stat32 *buffer

);

int _wstat64(

const wchar_t *path,


struct __stat64 *buffer

);

int _wstati64(

const wchar_t *path,


struct _stati64 *buffer

);

int _wstat32i64(

const wchar_t *path,


struct _stat32i64 *buffer

);

int _wstat64i32(

const wchar_t *path,


struct _stat64i32 *buffer

);

Параметры
path

Указатель на строку, содержащую путь к существующему файлу или каталогу.

buffer

Указатель на структуру, в которой хранятся результаты.

Возвращаемое значение
Каждая из этих функций возвращает 0, если получена информация о состоянии
файла. Возвращаемое значение -1 указывает на ошибку. В этом случае errno
устанавливается значение ENOENT , указывающее, что не удалось найти имя файла
или путь. Возвращаемое значение EINVAL указывает на недопустимый параметр; в
этом случае параметр errno также принимает значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Метка даты в файле может быть представлена, если она позже полуночи, 1 января
1970 года, и до 23:59:59 31 декабря 3000 года в формате UTC, если вы не
используете _stat32 или _wstat32 не определили _USE_32BIT_TIME_T . В этом случае
дата может быть представлена только до 23:59:59 18 января 2038 г. (UTC).

Комментарии
Функция _stat получает сведения о файле или каталоге, указанном параметром
path , и сохраняет их в структуре, указанной в параметре buffer . Функция _stat
автоматически требуемым образом обрабатывает аргументы в виде
многобайтовых строк, распознавая многобайтовые последовательности символов
в соответствии с текущей многобайтовой кодовой страницей.

_wstat — это версия _stat с расширенными символами; аргумент path для _wstat
— строка расширенных символов. _wstat и _stat ведут себя одинаково, за
исключением того, что _wstat не обрабатывает многобайтовые строки символов.

Варианты этих функций поддерживают 32-разрядные или 64-разрядные типы


времени, а также 32-разрядную или 64-разрядную длину файлов. Первый
числовой суффикс ( 32 или 64 ) указывает размер используемого типа времени;
второй суффикс i32 или i64 показывает, представлен ли размер файла как 32- или
64-разрядное целое число.

_stat эквивалентно _stat64i32 , и struct _stat содержит 64-разрядное время, если


_USE_32BIT_TIME_T не определено, в этом случае действует старое поведение; _stat

использует 32-разрядное время и struct _stat содержит 32-разрядное время. Это


же справедливо и для _stati64 .

7 Примечание

_wstat не работает с символическими ссылками Windows Vista. В таких случаях


функция _wstat всегда возвращает размер файла, равный 0. Функция _stat
правильно работает с символьными ссылками.
Семейство _stat функций,
используемых CreateFile в Visual Studio 2015, а не FindFirstFile как в Visual
Studio 2013 и более ранних версиях. Это означает, что _stat путь,
заканчивающийся косой чертой, завершается успешно, если путь ссылается на
каталог, в отличие от ранее, когда функция будет ошибиться с errno
значением ENOENT .

Эта функция проверяет свои параметры. Если параметр path или buffer имеет
значение NULL , вызывается обработчик недопустимых параметров, как описано в
разделе Проверка параметров.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Варианты типов времени и длины файла _stat


Функции _USE_32BIT_TIME_T Тип времени Тип длины
Определенные файла

_stat , _wstat Не определено 64-разрядная 32-разрядная


версия

_stat , _wstat Определено 32-битная 32-битная

_stat32 , _wstat32 Не затрагивается определением 32-битная 32-битная


макроса

_stat64 , _wstat64 Не затрагивается определением 64-разрядная 64-разрядная


макроса система система

_stati64 , Не определено 64-разрядная 64-разрядная


_wstati64 система система

_stati64 , Определено 32-разрядная 64-разрядная


_wstati64 версия версия

_stat32i64 , Не затрагивается определением 32-разрядная 64-разрядная


_wstat32i64 макроса версия версия

_stat64i32 , Не затрагивается определением 64-разрядная 32-разрядная


_wstat64i32 макроса версия

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tstat _stat _stat _wstat

_tstat64 _stat64 _stat64 _wstat64

_tstati64 _stati64 _stati64 _wstati64

_tstat32i64 _stat32i64 _stat32i64 _wstat32i64

_tstat64i32 _stat64i32 _stat64i32 _wstat64i32

Структура, определенная _stat в SYS\STAT.H , включает следующие поля.

Поле Описание
Поле Описание

st_gid Числовой идентификатор группы, которой принадлежит файл (только для UNIX).
В системах Windows это поле всегда равно нулю. Перенаправленный файл
классифицируется как файл Windows.

st_atime Время последнего доступа к файлу. Действительно на дисках,


отформатированных в файловой системе NTFS, но не в FAT.

st_ctime Время создания файла. Действительно на дисках, отформатированных в


файловой системе NTFS, но не в FAT.

st_dev Номер диска, содержащего файл (то же, что и st_rdev ).

st_ino Номер узла информации ( inode ) для файла (только для UNIX). В файловых
системах UNIX параметр inode описывает отметки даты и времени файла,
разрешения и содержимое. Если файлы связаны жесткими ссылками друг с
другом, они имеют один и тот же параметр inode . Параметр inode и,
следовательно, параметр st_ino не имеют смысла в файловых системах FAT, HPFS
и NTFS.

st_mode Битовая маска для информации о файловом режиме. Бит _S_IFDIR


устанавливается, если параметр path задает каталог; бит _S_IFREG
устанавливается, если параметр path задает обычный файл или устройство.
Пользовательские биты чтения/записи устанавливаются в соответствии с
режимом разрешений файла; пользовательские биты выполнения
устанавливаются согласно расширению имени файла.

st_mtime Время последнего изменения файла.

st_nlink Всегда имеет значение 1 в файловых системах, отличных от NTFS.

st_rdev Номер диска, содержащего файл (то же, что и st_dev ).

st_size Размер файла в байтах; 64-разрядное целое число для вариантов с суффиксом
i64 .

st_uid Числовой идентификатор пользователя, который владеет файлом (только для


UNIX). В системах Windows это поле всегда будет равно нулю. Перенаправленный
файл классифицируется как файл Windows.

Если параметр path ссылается на устройство, поле st_size , различные поля


времени, поля st_dev и st_rdev в структуре _stat не имеют смысла. Так как STAT.H
использует _dev_t тип, определенный в TYPES.H , необходимо включить TYPES.H в
код ранее STAT.H .

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

_stat , _stat32 , _stat64 , _stati64 , <sys/types.h> , затем <sys/stat.h> <errno.h>


_stat32i64 , _stat64i32

_wstat , _wstat32 , _wstat64 , <sys/types.h> за которым следует <errno.h>


_wstati64 , _wstat32i64 , _wstat64i32 <sys/stat.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_stat.c

// This program uses the _stat function to

// report information about the file named crt_stat.c.

#include <time.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

#include <errno.h>

int main( void )

struct _stat buf;

int result;

char timebuf[26];

char* filename = "crt_stat.c";

errno_t err;

// Get data associated with "crt_stat.c":

result = _stat( filename, &buf );

// Check if statistics are valid:

if( result != 0 )

perror( "Problem getting information" );

switch (errno)

case ENOENT:

printf("File %s not found.\n", filename);

break;

case EINVAL:

printf("Invalid parameter to _stat.\n");

break;

default:

/* Should never be reached. */

printf("Unexpected error in _stat.\n");

else

// Output some of the statistics:

printf( "File size : %ld\n", buf.st_size );

printf( "Drive : %c:\n", buf.st_dev + 'A' );

err = ctime_s(timebuf, 26, &buf.st_mtime);

if (err)

printf("Invalid arguments to ctime_s.");

exit(1);

printf( "Time modified : %s", timebuf );

Output

File size : 732

Drive : C:

Time modified : Thu Feb 07 14:39:36 2002

См. также раздел


Обработка файлов

_access, _waccess

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

_getmbcp

_setmbcp
_STATIC_ASSERT Макрос
Статья • 03.04.2023

Вычисляет выражение во время компиляции и выдает ошибку, если результат —


FALSE .

Синтаксис
C

_STATIC_ASSERT(

booleanExpression

);

Параметры
booleanExpression

Выражение (включая указатели), результат вычисления которого отличен от нуля


( TRUE ) или равен нулю ( FALSE ).

Комментарии
Этот макрос похож на _ASSERT макросы и _ASSERTE, за исключением того, что
booleanExpression вычисляется во время компиляции, а не во время выполнения.

Если результат вычисления booleanExpression равен FALSE (0), создается Ошибка


компилятора C2466.

Пример
В этом примере проверяется, является ли sizeof int больше или равно двум байтам
и равно ли значение sizeof long одному байту. Программа не будет
компилироваться и создаст ошибку компилятора C2466 , так как long больше 1
байта.

// crt__static_assert.c

#include <crtdbg.h>

#include <stdio.h>

_STATIC_ASSERT(sizeof(int) >= 2);

_STATIC_ASSERT(sizeof(long) == 1); // C2466

int main()

printf("I am sure that sizeof(int) will be >= 2: %d\n",

sizeof(int));

printf("I am not so sure that sizeof(long) == 1: %d\n",

sizeof(long));

Requirements (Требования)
Макрос Обязательный заголовок

_STATIC_ASSERT <crtdbg.h>

См. также раздел


Алфавитный указатель функций

_ASSERT, _ASSERTE, _ASSERT_EXPR макросы


_status87 , _statusfp , _statusfp2
Статья • 03.04.2023

Получает слово состояния модуля операций с плавающей запятой.

Синтаксис
C

unsigned int _status87( void );

unsigned int _statusfp( void );

void _statusfp2(unsigned int *px86, unsigned int *pSSE2)

Параметры
px86

Этот адрес заполняется словом состояния для модуля операций с плавающей


запятой x87.

pSSE2

Этот адрес заполняется словом состояния для модуля операций с плавающей


запятой SSE2.

Возвращаемое значение
Для функций _status87 и _statusfp биты в возвращаемом значении указывают
состояние модуля операций с плавающей запятой. Определения битов,
возвращаемых функцией _statusfp , см. в файле FLOAT.H. Многие математические
библиотечные функции изменяют слово состояния операций с плавающей запятой
с непредсказуемыми результатами. Оптимизация может изменять, объединять и
исключать операции с плавающей запятой вокруг вызовов _status87 , _statusfp и
связанных функций. Используйте параметр компилятора /Od (Disable (Debug)) или
директиву fenv_access pragma, чтобы предотвратить оптимизацию, которая
переупоряет порядок операций с плавающей запятой. Чем меньше операций с
плавающей запятой выполняется между известными значениями слова состояния
модуля операций с плавающей запятой, тем надежнее возвращаемые из функций
_clearfp и _statusfp значения, а также возвращаемые параметры функции
_statusfp2 .
Комментарии
Функция _statusfp получает слово состояния модуля операций с плавающей
запятой. Слово состояния содержит состояние модуля операций с плавающей
запятой и другие условия, обнаруженные обработчиком исключений операций с
плавающей запятой, — например, переполнение стека или потеря точности. Перед
возвращением содержимого слова состояния проверяются немаскированные
исключения. Иными словами, вызывающий объект уведомляется об ожидающих
исключениях. На платформах x86 функция _statusfp возвращает комбинацию
состояний x87 и SSE2 модуля операций с плавающей запятой. На 64-разрядных
платформах возвращаемое состояние зависит от состояния MXCSR SSE. На
платформах _statusfp ARM64 возвращает состояние из регистра FPSCR.

_statusfp  — независимая от платформы, переносимая версия функции _status87 .

Он идентичен _status87 на платформах Intel (x86) и также поддерживается


платформами x64 и ARM64. Чтобы код, выполняющий операции с плавающей
запятой, был переносимым на все архитектуры, используйте функцию _statusfp .
Если вы нацелены только на платформы x86, можно использовать или
_status87 _statusfp .

Для процессоров, поддерживающих как набор команд x87, так и SSE2 (например,
Pentium IV), рекомендуется использовать функцию _statusfp2 . В случае функции
_statusfp2 адреса заполняются с использованием слова состояния процессора

операций с плавающей запятой как для x87, так и для SSE2. Для микросхемы,
поддерживающей процессоры x87 и SSE2 с плавающей запятой, устанавливается
значение 1, EM_AMBIGUOUS если _statusfp используется или _controlfp и действие
было неоднозначным, так как оно может ссылаться на x87 или слово состояния
SSE2 с плавающей запятой. Функция _statusfp2 поддерживается только на
платформах x86.

Эти функции не полезны для /clr (компиляция СРЕДЫ CLR), так как среда CLR
поддерживает только точность с плавающей запятой по умолчанию.

Требования
Подпрограмма Обязательный заголовок

_status87 , _statusfp , _statusfp2 <float.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_statusfp.c

// Build by using: cl /W4 /Ox /nologo crt_statusfp.c

// This program creates various floating-point errors and

// then uses _statusfp to display messages that indicate these problems.

#include <stdio.h>

#include <float.h>

#pragma fenv_access(on)

double test( void )

double a = 1e-40;

float b;

double c;

printf("Status = 0x%.8x - clear\n", _statusfp());

// Assignment into b is inexact & underflows:

b = (float)(a + 1e-40);

printf("Status = 0x%.8x - inexact, underflow\n", _statusfp());

// c is denormal:

c = b / 2.0;

printf("Status = 0x%.8x - inexact, underflow, denormal\n",

_statusfp());

// Clear floating point status:

_clearfp();

return c;

int main(void)

return (int)test();

Output

Status = 0x00000000 - clear

Status = 0x00000003 - inexact, underflow

Status = 0x00080003 - inexact, underflow, denormal

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
_clear87, _clearfp

_control87, _controlfp, __control87_2


strcat , wcscat , _mbscat
Статья • 03.04.2023

Дополняет строку. Доступны более безопасные версии этих функций; См.


,strcat_swcscat_s , _mbscat_s.

) Важно!

_mbscat_s не может использоваться в приложениях, запускаемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *strcat(

char *strDestination,

const char *strSource

);

wchar_t *wcscat(

wchar_t *strDestination,

const wchar_t *strSource

);

unsigned char *_mbscat(

unsigned char *strDestination,

const unsigned char *strSource

);

template <size_t size>

char *strcat(

char (&strDestination)[size],

const char *strSource

); // C++ only

template <size_t size>

wchar_t *wcscat(

wchar_t (&strDestination)[size],

const wchar_t *strSource

); // C++ only

template <size_t size>

unsigned char *_mbscat(

unsigned char (&strDestination)[size],

const unsigned char *strSource

); // C++ only

Параметры
strDestination

Строка назначения, завершающаяся нуль-символом.

strSource

Исходная строка, завершающаяся символом NULL.

Возвращаемое значение
Каждая из этих функций возвращает строку назначения ( strDestination ). Нет
зарезервированных возвращаемых значений для указания ошибки.

Комментарии
Функция strcat добавляет strSource в strDestination и завершает
результирующую строку символом NULL. Начальный символ строки strSource
переопределяет завершающий нуль-символ строки strDestination . При
перекрытии исходного и конечного буферов поведение strcat не определено.

) Важно!

strcat не проверяет, достаточно ли места в строке strDestination , перед

добавлением strSource , в связи с чем может возникнуть ошибка


переполнения буфера. Вместо него рекомендуется использовать класс strncat.

Функции wcscat и _mbscat are wide-character и multibyte-character versions of


strcat для расширенных и многобайтовых символов. Аргументы и возвращаемое
значение являются wcscat строками расширенных символов. Аргументы и
возвращаемое значение являются _mbscat многобайтовыми строками символов. В
остальном эти три функции ведут себя идентично.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Сопоставления подпрограмм с универсальным


текстом
TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tcscat strcat _mbscat wcscat

Требования
Подпрограмма Обязательный заголовок

strcat <string.h>

wcscat <string.h> или <wchar.h>

_mbscat <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для strcpy.

См. также раздел


Манипуляция со строками

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strcat_s , wcscat_s , _mbscat_s ,
_mbscat_s_l
Статья • 03.04.2023

Дополняет строку. Эти версии strcat, имеют wcscat_mbscat улучшения


безопасности, как описано в разделе Функции безопасности в CRT.

) Важно!

Функции _mbscat_s и _mbscat_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t strcat_s(

char *strDestination,

size_t numberOfElements,

const char *strSource

);

errno_t wcscat_s(

wchar_t *strDestination,

size_t numberOfElements,

const wchar_t *strSource

);

errno_t _mbscat_s(

unsigned char *strDestination,

size_t numberOfElements,

const unsigned char *strSource

);

errno_t _mbscat_s_l(

unsigned char *strDestination,

size_t numberOfElements,

const unsigned char *strSource,

_locale_t locale

);

template <size_t size>

errno_t strcat_s(

char (&strDestination)[size],

const char *strSource

); // C++ only

template <size_t size>

errno_t wcscat_s(

wchar_t (&strDestination)[size],

const wchar_t *strSource

); // C++ only

template <size_t size>

errno_t _mbscat_s(

unsigned char (&strDestination)[size],

const unsigned char *strSource

); // C++ only

template <size_t size>

errno_t _mbscat_s_l(

unsigned char (&strDestination)[size],

const unsigned char *strSource,

_locale_t locale

); // C++ only

Параметры
strDestination

Строковый буфер назначения, завершающийся символом NULL.

numberOfElements

Размер строкового буфера назначения.

strSource

Исходная строка, завершающаяся нулем.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает нуль в случае успеха или код ошибки в случае неудачи.

Условия ошибок

strDestination numberOfElements strSource Возвращаемое Содержимое


значение strDestination

NULL или без признака any any EINVAL не изменено


завершения

any any NULL EINVAL strDestination[0]


имеет значение
0;
strDestination numberOfElements strSource Возвращаемое Содержимое
значение strDestination

any 0 или слишком any ERANGE strDestination[0]


мал имеет значение
0;

Комментарии
Функция strcat_s добавляет strSource в strDestination и завершает
результирующую строку символом NULL. Начальный символ строки strSource
переопределяет завершающий нуль-символ строки strDestination . При
перекрытии исходного и конечного буферов поведение strcat_s не определено.

Второй параметр — это общий размер буфера, а не оставшийся размер:

char buf[16];

strcpy_s(buf, 16, "Start");

strcat_s(buf, 16, " End"); // Correct

strcat_s(buf, 16 - strlen(buf), " End"); // Incorrect

Функции wcscat_s и _mbscat_s are wide-character и multibyte-character versions of


strcat_s для расширенных и многобайтовых символов. Аргументы и возвращаемое

значение являются wcscat_s строками расширенных символов. Аргументы и


возвращаемое значение являются _mbscat_s многобайтовыми строками символов.
В остальном эти три функции ведут себя идентично.

Если strDestination является пустым указателем или не завершается со значением


NULL, если strSource является NULL указателем или если конечная строка слишком
мала, вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если продолжение выполнения разрешено, эти функции
возвращают EINVAL и устанавливают для errno значение EINVAL .

Версии функций с суффиксом _l имеют то же поведение, но используют


переданный параметр языкового стандарта вместо текущего языкового стандарта.
Для получения дополнительной информации см. Locale.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcscat_s strcat_s _mbscat_s wcscat_s

Требования
Подпрограмма Обязательный заголовок

strcat_s <string.h>

wcscat_s <string.h> или <wchar.h>

_mbscat_s <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример кода в strcpy_s, wcscpy_s, _mbscpy_s.

См. также раздел


Манипуляция со строками

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strchr , wcschr , _mbschr , _mbschr_l
Статья • 03.04.2023

Находит символ в строке, используя текущий языковой стандарт или указанную


LC_CTYPE категорию состояния преобразования.

) Важно!

Функции _mbschr и _mbschr_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strchr(

const char *str,

int c

); // C only

char *strchr(

char * str,

int c

); // C++ only

const char *strchr(

const char * str,

int c

); // C++ only

wchar_t *wcschr(

const wchar_t *str,

wchar_t c

); // C only

wchar_t *wcschr(

wchar_t *str,

wchar_t c

); // C++ only

const wchar_t *wcschr(

const wchar_t *str,

wchar_t c

); // C++ only

unsigned char *_mbschr(

const unsigned char *str,

unsigned int c

); // C only

unsigned char *_mbschr(

unsigned char *str,

unsigned int c

); // C++ only

const unsigned char *_mbschr(

const unsigned char *str,

unsigned int c

); // C++ only

unsigned char *_mbschr_l(

const unsigned char *str,

unsigned int c,

_locale_t locale

); // C only

unsigned char *_mbschr_l(

unsigned char *str,

unsigned int c,

_locale_t locale

); // C++ only

const unsigned char *_mbschr_l(

const unsigned char *str,

unsigned int c,

_locale_t locale

); // C++ only

Параметры
str

Исходная строка, завершающаяся символом NULL.

Символ, который требуется найти.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает указатель на первое вхождение c в str или ,
NULL если c не найден.

Комментарии
Функция strchr находит первое вхождение c в str или возвращает NULL , если c
не найден. Область поиска включает завершающий символ NULL.
Функции wcschr , _mbschr и _mbschr_l являются версиями функции strchr для
расширенных и многобайтовых символов. Аргументы и возвращаемое значение
являются wcschr строками расширенных символов. Аргументы и возвращаемое
значение являются _mbschr многобайтовыми строками символов. _mbschr
распознает последовательности многобайтовых символов. Кроме того, если строка
является пустым указателем, _mbschr вызывает обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение может
быть продолжено, функция _mbschr возвращает значение NULL и устанавливает
параметр errno в значение EINVAL . strchr и wcschr не проверяют свои параметры.
В остальном эти три функции ведут себя идентично.

На выходное значение влияет параметр LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделе setlocale. Версии этих функций без
суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

В языке C эти функции принимают указатель const в качестве первого аргумента. В


языке C++ доступны две перегрузки. Перегрузка, принимающая указатель на
const , возвращает указатель на const ; версия, которая принимает указатель на не-
const , возвращает указатель на не- const . Макрос _CRT_CONST_CORRECT_OVERLOADS

определяется, const если доступны и версии, не const являющиеся версиями этих


функций. Если для обеих перегрузок C++ требуется поведение, отличное const от ,
определите символ _CONST_RETURN .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcschr strchr _mbschr wcschr

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

strchr <string.h>

wcschr <string.h> либо <wchar.h>

_mbschr , _mbschr_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_strchr.c

//

// This program illustrates searching for a character

// with strchr (search forward) or strrchr (search backward).

//

#include <string.h>

#include <stdio.h>

int ch = 'r';

char string[] = "The quick brown dog jumps over the lazy fox";

char fmt1[] = " 1 2 3 4 5";

char fmt2[] = "12345678901234567890123456789012345678901234567890";

int main( void )

char *pdest;

int result;

printf_s( "String to be searched:\n %s\n", string );

printf_s( " %s\n %s\n\n", fmt1, fmt2 );

printf_s( "Search char: %c\n", ch );

// Search forward.

pdest = strchr( string, ch );

result = (int)(pdest - string + 1);

if ( pdest != NULL )
printf_s( "Result: first %c found at position %d\n",

ch, result );

else

printf_s( "Result: %c not found\n", ch );

// Search backward.

pdest = strrchr( string, ch );

result = (int)(pdest - string + 1);

if ( pdest != NULL )
printf_s( "Result: last %c found at position %d\n", ch, result );

else

printf_s( "Result:\t%c not found\n", ch );

Output

String to be searched:

The quick brown dog jumps over the lazy fox

1 2 3 4 5

12345678901234567890123456789012345678901234567890

Search char: r

Result: first r found at position 12

Result: last r found at position 30

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcspn, wcscspn, _mbscspn, _mbscspn_l

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strpbrk, wcspbrk, _mbspbrk, _mbspbrk_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strstr, wcsstr, _mbsstr, _mbsstr_l


strcmp , wcscmp , _mbscmp , _mbscmp_l
Статья • 03.04.2023

Сравнивают строки.

) Важно!

Функции _mbscmp и _mbscmp_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int strcmp(

const char *string1,


const char *string2

);

int wcscmp(

const wchar_t *string1,

const wchar_t *string2

);

int _mbscmp(

const unsigned char *string1,

const unsigned char *string2

);

int _mbscmp_l(

const unsigned char *string1,

const unsigned char *string2,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

locale

Используемый языковой стандарт.


Возвращаемое значение
Возвращаемое значение каждой из этих функций отображает порядковое
отношение строки string1 к строке string2 .

Значение Связь с string1 string2

<0 string1 меньше string2

0 string1 идентична string2

>0 string1 больше string2

При ошибке _mbscmp проверки параметра и _mbscmp_l возвращают _NLSCMPERROR ,


которая определена в <string.h> и <mbstring.h> .

Комментарии
Функция strcmp выполняет порядковое сравнение строк string1 и string2 и
возвращает значение, которое указывает их отношение. Функции wcscmp и _mbscmp
являются версиями функции strcmp для расширенных и многобайтовых символов
соответственно. _mbscmp распознает последовательности многобайтовых символов
в соответствии с текущей многобайтовой кодовой страницей и возвращает
_NLSCMPERROR при ошибке. _mbscmp_l имеет то же поведение, но использует

переданный параметр языкового стандарта вместо текущего языкового стандарта.


Дополнительные сведения см. в разделе Кодовая страница. Кроме того, если
string1 или string2 является пустым указателем, _mbscmp вызывает обработчик

недопустимых параметров, как описано в разделе Проверка параметров. Если


выполнение может быть продолжено, то функции _mbscmp и _mbscmp_l возвращают
ошибку _NLSCMPERROR и устанавливают для errno значение EINVAL . strcmp и wcscmp
не проверяют свои параметры. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcscmp strcmp _mbscmp wcscmp


Функции strcmp отличаются от функций тем strcoll , что strcmp сравнения
являются порядковой и не зависят от языкового стандарта. strcoll сравнивает
строки лексикографически с использованием категории LC_COLLATE текущего
языкового стандарта. Дополнительные сведения о категории см. в LC_COLLATE
разделе setlocale, _wsetlocale.

В языковом стандарте "C" порядок символов в наборе символов (набор символов


ASCII) совпадает с лексикографическим порядком символов. Однако в других
языковых стандартах порядок символов в наборе символов может отличаться от
лексикографического порядка. Например, в некоторых европейских языковых
стандартах символ " a " (значение 0x61) перед символом " ä " (значение 0xE4) в
наборе символов, а символ " ä " — перед символом " a " лексикографически.

При использовании языковых стандартов, в которых порядок символов в


кодировке и лексикографический порядок различаются, используйте strcoll
вместо strcmp для лексикографического сравнения строк. Также можно
использовать функцию strxfrm для исходных строк, а затем использовать функцию
strcmp для результирующих строк.

Функции strcmp учитывают регистр. Функции _stricmp , _wcsicmp и _mbsicmp перед


сравнением преобразуют строки в нижний регистр. Две строки, содержащие
символы, расположенные между "Z" и "a" в таблице ASCII (" [ , " \\ ", "", " ] ", " ^ ", " _ "
и " ` "), сравниваются по-разному в зависимости от их регистра. Например, две
строки " ABCDE " и " ABCD^ " сравнивают один из способов, если сравнение имеет
нижний регистр (" abcde " > " abcd^ ") и в другом (" ABCDE " < " ABCD ^"), если сравнение
является прописным.

Требования
Подпрограмма Обязательный заголовок

strcmp <string.h>

wcscmp <string.h> или <wchar.h>

_mbscmp <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_strcmp.c

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

char string1[] = "The quick brown dog jumps over the lazy fox";

char string2[] = "The QUICK brown dog jumps over the lazy fox";

int main( void )

char tmp[20];

int result;

// Case sensitive

printf( "Compare strings:\n %s\n %s\n\n", string1, string2 );

result = strcmp( string1, string2 );

if( result > 0 )

strcpy_s( tmp, _countof(tmp), "greater than" );

else if( result < 0 )

strcpy_s( tmp, _countof (tmp), "less than" );

else

strcpy_s( tmp, _countof (tmp), "equal to" );

printf( " strcmp: String 1 is %s string 2\n", tmp );

// Case insensitive (could use equivalent _stricmp)

result = _stricmp( string1, string2 );

if( result > 0 )

strcpy_s( tmp, _countof (tmp), "greater than" );

else if( result < 0 )

strcpy_s( tmp, _countof (tmp), "less than" );

else

strcpy_s( tmp, _countof (tmp), "equal to" );

printf( " _stricmp: String 1 is %s string 2\n", tmp );

Output

Compare strings:

The quick brown dog jumps over the lazy fox

The QUICK brown dog jumps over the lazy fox

strcmp: String 1 is greater than string 2

_stricmp: String 1 is equal to string 2

См. также раздел


Манипуляция со строками

memcmp, wmemcmp

_memicmp, _memicmp_l

Функции strcoll

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


strcmpi
Статья • 03.04.2023

Имя strcmpi функции, зависят от Майкрософт, является устаревшим псевдонимом


_stricmp для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _stricmp . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
strcoll , wcscoll , _mbscoll , _strcoll_l ,
_wcscoll_l , _mbscoll_l
Статья • 03.04.2023

Сравнивает строки с использованием текущего языкового стандарта или указанной


LC_COLLATE категории состояния преобразования.

) Важно!

Функции _mbscoll и _mbscoll_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int strcoll(

const char *string1,


const char *string2

);

int wcscoll(

const wchar_t *string1,

const wchar_t *string2

);

int _mbscoll(

const unsigned char *string1,

const unsigned char *string2

);

int _strcoll_l(

const char *string1,


const char *string2,
_locale_t locale

);

int wcscoll_l(

const wchar_t *string1,

const wchar_t *string2,

_locale_t locale

);

int _mbscoll_l(

const unsigned char *string1,

const unsigned char *string2,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает значение, которое соответствует отношению
между string1 и string2 , как показано ниже.

Возвращаемое значение Связь с string1 string2

<0 string1 меньше string2

0 string1 идентично string2

>0 string1 больше string2

Каждая из этих функций возвращает _NLSCMPERROR в случае ошибки. Чтобы


использовать функцию _NLSCMPERROR , включите STRING.H или MBSTRING.H. wcscoll
может завершиться ошибкой, если string1 параметр или string2 имеет NULL или
содержит коды расширенных символов за пределами домена сортировки
последовательности. При возникновении ошибки wcscoll может присвоить
параметру errno значение EINVAL . Чтобы убедиться, не возникает ли ошибка при
вызове функции wcscoll , присвойте параметру errno значение 0 и проверьте
errno после вызова функции wcscoll .

Комментарии
Каждая из этих функций сравнивает с учетом регистра строки string1 и string2 в
соответствии с используемой в настоящее время кодовой страницей. Эти функции
следует использовать только в том случае, если на текущей кодовой странице есть
разница между порядком набора символов и лексикографическим порядком
символов, и это различие представляет интерес для сравнения строк.

Все эти функции проверяют свои параметры. Если значение string1 или string2
является пустым указателем или count больше INT_MAX , вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров . Если
продолжение выполнения разрешено, эти функции возвращают _NLSCMPERROR и
устанавливают для errno значение EINVAL .

Сравнение двух строк — это операция, зависящая от языкового стандарта, так как
каждый языковой стандарт теперь имеет разные правила для сортировки
символов. Версии этих функций без суффикса _l используют текущий языковой
стандарт потока для данного поведения, зависимого от языкового стандарта.
Версии с суффиксом _l идентичны соответствующей функции без суффикса,
однако они используют переданный языковой стандарт в качестве параметра
вместо текущего языкового стандарта. Для получения дополнительной
информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcscoll strcoll _mbscoll wcscoll

Требования
Подпрограмма Обязательный заголовок

strcoll <string.h>

wcscoll <wchar.h>, <string.h>

_mbscoll , _mbscoll_l <mbstring.h>

_strcoll_l <string.h>

_wcscoll_l <wchar.h>, <string.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Локаль

Манипуляция со строками

Функции strcoll

localeconv

_mbsnbcoll, _mbsnbcoll_l, _mbsnbicoll, _mbsnbicoll_l

setlocale, _wsetlocale

strcmp, wcscmp, _mbscmp

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


strcpy , wcscpy , _mbscpy
Статья • 03.04.2023

Копирует строку. Доступны более безопасные версии этих функций; см.


,strcpy_swcscpy_s , . _mbscpy_s

) Важно!

_mbscpy не может использоваться в приложениях, запускаемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *strcpy(

char *strDestination,

const char *strSource

);

wchar_t *wcscpy(

wchar_t *strDestination,

const wchar_t *strSource

);

unsigned char *_mbscpy(

unsigned char *strDestination,

const unsigned char *strSource

);

template <size_t size>

char *strcpy(

char (&strDestination)[size],

const char *strSource

); // C++ only

template <size_t size>

wchar_t *wcscpy(

wchar_t (&strDestination)[size],

const wchar_t *strSource

); // C++ only

template <size_t size>

unsigned char *_mbscpy(

unsigned char (&strDestination)[size],

const unsigned char *strSource

); // C++ only

Параметры
strDestination

Конечная строка.

strSource

Исходная строка, завершающаяся символом NULL.

Возвращаемое значение
Каждая из этих функций возвращает строку назначения. Нет зарезервированных
возвращаемых значений для указания ошибки.

Комментарии
Функция strcpy копирует strSource , включая завершающий символ нуля, в
указанное расположение, заданное strDestination . При перекрытии исходного и
конечного буферов поведение strcpy не определено.

) Важно!

strcpy не проверяет, достаточно ли места в строке strDestination , перед


копированием strSource , в связи с чем может возникнуть ошибка
переполнения буфера. Поэтому вместо этого рекомендуется использовать
strcpy_s .

Функции wcscpy и _mbscpy являются версиями функции strcpy для расширенных и


многобайтовых символов соответственно. Аргументы и возвращаемое значение
являются wcscpy строками расширенных символов. Аргументы и возвращаемое
значение являются _mbscpy многобайтовыми строками символов. В остальном эти
три функции ведут себя идентично.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста


TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tcscpy strcpy _mbscpy wcscpy

Требования
Подпрограмма Обязательный заголовок

strcpy <string.h>

wcscpy <string.h> или <wchar.h>

_mbscpy <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strcpy.c

// compile with: /W3

// This program uses strcpy

// and strcat to build a phrase.

#include <string.h>

#include <stdio.h>

int main( void )

char string[80];

// If you change the previous line to

// char string[20];

// strcpy and strcat will happily overrun the string

// buffer. See the examples for strncpy and strncat

// for safer string handling.

strcpy( string, "Hello world from " ); // C4996

// Note: strcpy is deprecated; use strcpy_s instead

strcat( string, "strcpy " ); // C4996

// Note: strcat is deprecated; use strcat_s instead

strcat( string, "and " ); // C4996

strcat( string, "strcat!" ); // C4996

printf( "String = %s\n", string );

Output

String = Hello world from strcpy and strcat!

См. также раздел


Манипуляция со строками

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strcpy_s , wcscpy_s , _mbscpy_s ,
_mbscpy_s_l
Статья • 03.04.2023

Копирует строку. Эти версии strcpy, имеют wcscpy_mbscpy улучшения


безопасности, как описано в разделе Функции безопасности в CRT.

) Важно!

Функции _mbscpy_s и _mbscpy_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t strcpy_s(

char *dest,

rsize_t dest_size,

const char *src

);

errno_t wcscpy_s(

wchar_t *dest,

rsize_t dest_size,

const wchar_t *src

);

errno_t _mbscpy_s(

unsigned char *dest,


rsize_t dest_size,

const unsigned char *src

);

errno_t _mbscpy_s_l(

unsigned char *dest,


rsize_t dest_size,

const unsigned char *src,

_locale_t locale

);

C++
// Template functions are C++ only:

template <size_t size>

errno_t strcpy_s(

char (&dest)[size],

const char *src

); // C++ only

template <size_t size>

errno_t wcscpy_s(

wchar_t (&dest)[size],

const wchar_t *src

); // C++ only

template <size_t size>

errno_t _mbscpy_s(

unsigned char (&dest)[size],

const unsigned char *src

); // C++ only

template <size_t size>

errno_t _mbscpy_s_l(

unsigned char (&dest)[size],

const unsigned char *src,

_locale_t locale

); // C++ only

Параметры
dest

Расположение строкового буфера назначения.

dest_size

Размер строкового буфера назначения в единицах char для узкой и


многобайтовых функций и в единицах wchar_t для расширенных функций. Это
значение должно быть больше нуля и не больше RSIZE_MAX . Убедитесь, что этот
размер учитывает завершающую строку NULL .

src

Исходная строка, завершающаяся нулем.

locale

Используемый языковой стандарт.

Возвращаемое значение
Ноль в случае успешного выполнения; в противном случае — код ошибки.
Условия ошибок

dest dest_size src Возвращаемое значение Содержимое dest

NULL any any EINVAL не изменено

any any NULL EINVAL dest[0] имеет значение 0;

any 0 или слишком мал any ERANGE dest[0] имеет значение 0;

Комментарии
Функция strcpy_s копирует содержимое по адресу src , включая завершающий
символ нуля, в указанное расположение, заданное dest . Строка назначения
должна быть достаточно велика для сохранения исходной строки и завершающего
нуля. При перекрытии исходного и конечного буферов поведение strcpy_s не
определено.

wcscpy_s является версией strcpy_s с расширенными символами, а _mbscpy_s  —

версией с многобайтовыми символами. Аргументы являются wcscpy_s строками


расширенных символов. Аргументы _mbscpy_s и _mbscpy_s_l являются
многобайтовыми строками символов. В остальном эти функции ведут себя
одинаково. _mbscpy_s_l идентичен за _mbscpy_s исключением того, что использует
переданный параметр языкового стандарта вместо текущего языкового стандарта.
Для получения дополнительной информации см. locale.

Если dest или src является пустым указателем или если размер dest_size строки
назначения слишком мал, вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если выполнение может быть
продолжено, эти функции возвращают EINVAL и задают для параметра errno
значение EINVAL , если dest или src являются пустыми указателями. Они
возвращают ERANGE и errno для ERANGE , если строка назначения слишком мала.

После успешного выполнения конечная строка всегда завершается нулем.

В C++ использование этих функций упрощается за счет перегрузок шаблонов,


которые могут автоматически определять длину буфера, чтобы не указывать
аргумент размера. Кроме того, они могут автоматически заменить старые, менее
безопасные функции новыми, более безопасными аналогами. Дополнительные
сведения см. в разделе Безопасные перегрузки шаблонов.
Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcscpy_s strcpy_s _mbscpy_s wcscpy_s

Требования
Подпрограмма Обязательный заголовок

strcpy_s <string.h>

wcscpy_s <string.h> или <wchar.h>

_mbscpy_s <mbstring.h>

Эти функции относятся к корпорации Майкрософт. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
В отличие от кода качества в рабочей среде, этот пример вызывает безопасные
строковые функции без проверки на наличие ошибок:

// crt_strcpy_s.c

// Compile by using: cl /W4 crt_strcpy_s.c

// This program uses strcpy_s and strcat_s

// to build a phrase.

#include <string.h> // for strcpy_s, strcat_s

#include <stdlib.h> // for _countof

#include <stdio.h> // for printf

#include <errno.h> // for return values

int main(void)

char stringBuffer[80];

strcpy_s(stringBuffer, _countof(stringBuffer), "Hello world from ");

strcat_s(stringBuffer, _countof(stringBuffer), "strcpy_s ");

strcat_s(stringBuffer, _countof(stringBuffer), "and ");

strcat_s(stringBuffer, _countof(stringBuffer), "strcat_s!");

printf("stringBuffer = %s\n", stringBuffer);

Output

stringBuffer = Hello world from strcpy_s and strcat_s!

При создании кода C++ версии шаблонов могут быть проще в использовании.

C++

// crt_wcscpy_s.cpp

// Compile by using: cl /EHsc /W4 crt_wcscpy_s.cpp

// This program uses wcscpy_s and wcscat_s

// to build a phrase.

#include <cstring> // for wcscpy_s, wcscat_s

#include <cstdlib> // for _countof

#include <iostream> // for cout, includes <cstdlib>, <cstring>

#include <errno.h> // for return values

int main(void)

wchar_t stringBuffer[80];

// using template versions of wcscpy_s and wcscat_s:

wcscpy_s(stringBuffer, L"Hello world from ");

wcscat_s(stringBuffer, L"wcscpy_s ");

wcscat_s(stringBuffer, L"and ");

// of course we can supply the size explicitly if we want to:

wcscat_s(stringBuffer, _countof(stringBuffer), L"wcscat_s!");

std::wcout << L"stringBuffer = " << stringBuffer << std::endl;

Output

stringBuffer = Hello world from wcscpy_s and wcscat_s!

См. также раздел


Манипуляция со строками

strcat, wcscat, _mbscat, _mbscat_l

strcmp, wcscmp, _mbscmp, _mbscmp_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strcspn , wcscspn , _mbscspn , _mbscspn_l
Статья • 03.04.2023

Возвращает индекс первого вхождения в строке символа, который относится к


набору символов.

) Важно!

Функции _mbschr и _mbschr_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

size_t strcspn(

const char *str,

const char *strCharSet

);

size_t wcscspn(

const wchar_t *str,

const wchar_t *strCharSet

);

size_t _mbscspn(

const unsigned char *str,

const unsigned char *strCharSet

);

size_t _mbscspn_l(

const unsigned char *str,

const unsigned char *strCharSet,

_locale_t locale

);

Параметры
str

Строка, завершающаяся символом NULL, для поиска.

strCharSet

Набор символов, завершающийся символом NULL.


locale

Используемый языковой стандарт.

Возвращаемое значение
Эти функции возвращают индекс первого символа в str , который находится в
strCharSet . Если ни один из символов в str не находится в strCharSet , то

возвращаемое значение представляет собой длину str .

Нет зарезервированных возвращаемых значений для указания ошибки.

Комментарии
Функции wcscspn и _mbscspn are wide-character и multibyte-character versions of
strcspn для расширенных и многобайтовых символов. Аргументы представляют

wcscspn собой строки расширенных символов. Аргументы и возвращаемое


значение являются _mbscspn многобайтовыми строками символов.

_mbscspn проверяет свои параметры. Если или str strCharSet является пустым

указателем, вызывается обработчик недопустимых параметров, как описано в


разделе Проверка параметров. Если выполнение может быть продолжено,
функция возвращает 0 и устанавливает errno в значение EINVAL . strcspn и wcscspn
не проверяют свои параметры. В остальном эти три функции ведут себя идентично.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные
Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные Определенные

_tcscspn strcspn _mbscspn wcscspn

Требования
Подпрограмма Обязательный заголовок

strcspn <string.h>

wcscspn <string.h> или <wchar.h>

_mbscspn , _mbscspn_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strcspn.c

#include <string.h>

#include <stdio.h>

void test( const char * str, const char * strCharSet )

int pos = strcspn( str, strCharSet );

printf( "strcspn( \"%s\", \"%s\" ) = %d\n", str, strCharSet, pos );

int main( void )

test( "xyzbxz", "abc" );

test( "xyzbxz", "xyz" );

test( "xyzbxz", "no match" );

test( "xyzbxz", "" );

test( "", "abc" );

test( "", "" );

Output

strcspn( "xyzbxz", "abc" ) = 3

strcspn( "xyzbxz", "xyz" ) = 0

strcspn( "xyzbxz", "no match" ) = 6

strcspn( "xyzbxz", "" ) = 6

strcspn( "", "abc" ) = 0

strcspn( "", "" ) = 0

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l


_strdate , _wstrdate
Статья • 03.04.2023

Скопируйте текущую системную дату в буфер. Доступны более безопасные версии


этих функций; см. ,_strdate_s_wstrdate_s .

Синтаксис
C

char *_strdate(

char *datestr

);

wchar_t *_wstrdate(

wchar_t *datestr

);

template <size_t size>

char *_strdate(

char (&datestr)[size]

); // C++ only

template <size_t size>

wchar_t *_wstrdate(

wchar_t (&datestr)[size]

); // C++ only

Параметры
datestr

Указатель на буфер, содержащий отформатированную строку с датой.

Возвращаемое значение
Каждая из этих функций возвращает указатель на результирующую строку
символов datestr .

Комментарии
Доступны более безопасные версии этих функций; см. ,_strdate_s_wstrdate_s .
Рекомендуется использовать более безопасные функции везде, где это возможно.
Функция _strdate копирует текущую системную дату в буфер, на который
datestr указывает , отформатированный мм/дд/гггг, где мм — две цифры,
представляющие месяц, дд — две цифры, представляющие день, и гг — последние
две цифры года. Например, строка 12/05/99 представляет 5 декабря 1999 г. Размер
буфера должен быть не менее 9 байтов.

Если datestr указатель является указателем NULL , вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
разрешается продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

_wstrdate — это версия с расширенными символами для _strdate ; аргумент и

возвращаемое значение _wstrdate являются строками с расширенными


символами. В остальном эти функции ведут себя одинаково.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tstrdate _strdate _strdate _wstrdate

Требования
Подпрограмма Обязательный заголовок

_strdate <time.h>

_wstrdate <time.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// strdate.c

// compile with: /W3

#include <time.h>

#include <stdio.h>

int main()

char tmpbuf[9];

// Set time zone from TZ environment variable. If TZ is not set,

// the operating system is queried to obtain the default value


// for the variable.

//

_tzset();

printf( "OS date: %s\n", _strdate(tmpbuf) ); // C4996

// Note: _strdate is deprecated; consider using _strdate_s instead

Output

OS date: 04/25/03

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

mktime, _mktime32, _mktime64

time, _time32, _time64

_tzset
_strdate_s , _wstrdate_s
Статья • 03.04.2023

Скопируйте текущую системную дату в буфер. Эти функции являются версиями , с


улучшениями _strdateбезопасности, _wstrdate как описано в функциях
безопасности в CRT.

Синтаксис
C

errno_t _strdate_s(

char *buffer,

size_t size

);

errno_t _wstrdate_s(

wchar_t *buffer,

size_t size

);

template <size_t size>

errno_t _strdate_s(

char (&buffer)[size]

); // C++ only

template <size_t size>

errno_t _wstrdate_s(

wchar_t (&buffer)[size]

); // C++ only

Параметры
buffer

Указатель на буфер для вставки форматируемой строки даты.

size

Размер буфера в единицах символов.

Возвращаемое значение
Нуль при успешном завершении. Возвращаемое значение — это код ошибки, если
произошел сбой. Коды ошибок определены в ERRNO. H; см. в таблице ниже точные
ошибки, создаваемые этой функцией. Дополнительные сведения о кодах ошибок
см. в разделе errno.
Условия ошибок
buffer size Возвращает Содержимое buffer

NULL (любые) EINVAL Без изменений

Не NULL (указывает на 0 EINVAL Без изменений


допустимый буфер)

Не NULL (указывает на 0 EINVAL Пустая строка.


допустимый буфер) < size <
9

Не NULL (указывает на size >= 0 Текущая дата, отформатированная,


допустимый буфер) 9 как указано в разделе «Примечания»

Проблемы с безопасностью
Если передать недопустимое значение buffer , отличное от NULL, это приведет к
нарушению доступа, если size параметр больше девяти.

Передача значения больше size фактического размера приводит к переполнению


буфера buffer .

Комментарии
Эти функции обеспечивают более безопасные версии _strdate и _wstrdate .
Функция _strdate_s копирует текущую системную дату в буфер, на который
указывает . buffer Форматируется mm/dd/yy , где mm является двухзначный месяц, dd
является двухзначным днем и yy является последними двумя цифрами года.
Например, строка 12/05/99 представляет 5 декабря 1999 г. Буфер должен
содержать не менее девяти символов.

_wstrdate_s — это версия с расширенными символами для _strdate_s ; аргумент и

возвращаемое значение _wstrdate_s являются строками с расширенными


символами. В остальном эти функции ведут себя одинаково.

Если buffer указатель NULL меньше size девяти символов, вызывается обработчик
недопустимых параметров. Он описан в разделе "Проверка параметров". Если
выполнение разрешено продолжать, эти функции возвращают значение -1. Они
задают значение EINVAL errno , если буфер или NULL size меньше или равен 0. Или,
errno ERANGE если size значение меньше 9.
В C++ использование этих функций упрощается перегрузками шаблонов.
Перегрузки могут автоматически определять длину буфера, что устраняет
необходимость указания аргумента size . Кроме того, они могут автоматически
заменять небезопасные функции более новыми, более безопасными аналогами.
Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставление подпрограмм универсального текста:

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tstrdate_s _strdate_s _strdate_s _wstrdate_s

Требования
Подпрограмма Обязательный заголовок

_strdate <time.h>

_wstrdate <time.h> или <wchar.h>

_strdate_s <time.h>

Пример
См. пример для time.

См. также раздел


Управление временем

asctime_s, _wasctime_s

ctime_s, _ctime32_s, _ctime64_s, _wctime_s, _wctime32_s, _wctime64_s

gmtime_s, _gmtime32_s, _gmtime64_s

localtime_s, _localtime32_s, _localtime64_s

mktime, _mktime32, _mktime64

time, _time32, _time64

_tzset
_strdec , _wcsdec , _mbsdec , _mbsdec_l
Статья • 29.03.2023

Перемещают указатель строки на один символ назад.

) Важно!

Функции _mbsdec и _mbsdec_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

unsigned char *_strdec(

const unsigned char *start,

const unsigned char *current

);

unsigned wchar_t *_wcsdec(

const unsigned wchar_t *start,

const unsigned wchar_t *current

);

unsigned char *_mbsdec(

const unsigned char *start,

const unsigned char *current

);

unsigned char *_mbsdec_l(

const unsigned char *start,

const unsigned char *current,

_locale_t locale

);

Параметры
start

Указатель на любой символ (или для _mbsdec и _mbsdec_l , первый байт любого
многобайтового символа) в исходной строке; start должен предшествовать
current в исходной строке.
current

Указатель на любой символ (или для _mbsdec и _mbsdec_l , первый байт любого
многобайтового символа) в исходной строке; current должен следовать в start
исходной строке.

locale

Используемый языковой стандарт.

Возвращаемое значение
_mbsdec , _mbsdec_l , _strdec и _wcsdec возвращают указатель на символ, который

непосредственно предшествует current ; _mbsdec возвращает NULL значение , если


значение больше или равно значению start current . _tcsdec сопоставляется с
одной из этих функций, и ее возвращаемое значение зависит от сопоставления.

Комментарии
Функции _mbsdec и _mbsdec_l возвращают указатель на первый байт
многобайтового символа, который непосредственно предшествует current в
строке, содержащей start .

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделеsetlocale . _wsetlocale _mbsdec распознает
последовательности многобайтовых символов в соответствии с используемым в
данный момент языковым стандартом; функция _mbsdec_l идентична, за
исключением того, что она использует переданный параметр языкового стандарта.
Для получения дополнительной информации см. Locale.

Если start или current имеет значение NULL , вызывается обработчик


недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, эта функция возвращает EINVAL и задает для
errno значение EINVAL .

) Важно!

Эти функции могут быть подвержены угрозам переполнения буфера.


Переполнение буфера можно использовать для атак на систему, поскольку
оно может привести к несанкционированному повышению уровня
привилегий. Дополнительные сведения см . в статье Предотвращение
переполнения буфера.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsdec _strdec _mbsdec _wcsdec

_strdec и _wcsdec — версии _mbsdec и _mbsdec_l с однобайтовыми или

расширенными символами. _strdec и _wcsdec предоставляются только для этого


сопоставления и не должны использоваться в противном случае.

Дополнительные сведения см. в разделах Использование сопоставлений


универсального текста и Сопоставления универсального текста.

Требования
Подпрограмма Обязательный заголовок Необязательный заголовок

_mbsdec <mbstring.h> <mbctype.h>

_mbsdec_l <mbstring.h> <mbctype.h>

_strdec <tchar.h>

_wcsdec <tchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
В следующем примере показано использование функции _tcsdec .

C++

// crt_tcsdec.cpp

// Compile by using: cl /EHsc crt_tcsdec.cpp

#include <iostream>

#include <tchar.h>

using namespace std;

int main()

const TCHAR *str = _T("12345");

cout << "str: " << str << endl;

const TCHAR *str2;

str2 = str + 2;

cout << "str2: " << str2 << endl;

TCHAR *answer;

answer = _tcsdec( str, str2 );


cout << "answer: " << answer << endl;

return (0);

В следующем примере показано использование функции _mbsdec .

C++

// crt_mbsdec.cpp

// Compile by using: cl /EHsc crt_mbsdec.c

#include <iostream>

#include <mbstring.h>

using namespace std;

int main()

char *str = "12345";


cout << "str: " << str << endl;

char *str2;

str2 = str + 2;

cout << "str2: " << str2 << endl;

unsigned char *answer;

answer = _mbsdec( reinterpret_cast<unsigned char *>( str ),


reinterpret_cast<unsigned char *>( str2 ));

cout << "answer: " << answer << endl;

return (0);

См. также раздел


Манипуляция со строками

_strinc, _wcsinc, _mbsinc, _mbsinc_l

_strnextc, _wcsnextc, _mbsnextc, _mbsnextc_l

_strninc, _wcsninc, _mbsninc, _mbsninc_l


strdup , wcsdup
Статья • 03.04.2023

Имена strdup функций POSIX, реализованные корпорацией Майкрософт, являются


wcsdup устаревшими псевдонимами для _strdup функций и _wcsdup функций. По
умолчанию они создают предупреждение компилятора (уровень 3) C4996. Имена
являются устаревшими, так как они не соответствуют стандартным правилам C для
имен, относящихся к реализации. Однако функции по-прежнему поддерживаются.

Мы рекомендуем использовать _strdup и _wcsdup вместо этого. Вы также можете


продолжать использовать эти имена функций и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_strdup , _wcsdup , _mbsdup
Статья • 03.04.2023

Повторяющиеся строки.

) Важно!

_mbsdup не может использоваться в приложениях, запускаемых в среде

выполнения Windows. Дополнительные сведения: Функции CRT, которые не


поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

char *_strdup(

const char *strSource

);

wchar_t *_wcsdup(

const wchar_t *strSource

);

unsigned char *_mbsdup(

const unsigned char *strSource

);

Параметры
strSource

Исходная строка, завершающаяся символом NULL.

Возвращаемое значение
Каждая из этих функций возвращает указатель на расположение хранилища для
скопированной строки или NULL значение , если хранилище не может быть
выделено.

Комментарии
Функция _strdup вызывает malloc для выделения дискового пространства для
копии , strSource а затем копирует strSource в выделенное пространство.

Функции _wcsdup и _mbsdup are wide-character и multibyte-character versions of


_strdup для расширенных и многобайтовых символов. Аргументы и возвращаемое
значение являются _wcsdup строками расширенных символов. Аргументы и
возвращаемое значение являются _mbsdup многобайтовыми строками символов. В
остальном эти три функции ведут себя идентично.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsdup _strdup _mbsdup _wcsdup

Так как _strdup вызовы malloc для выделения дискового strSource пространства
для копии рекомендуется всегда освобождать эту память, вызывая free
подпрограмму для указателя, возвращаемого вызовом _strdup .

Если _DEBUG определены и _CRTDBG_MAP_ALLOC , _strdup и _wcsdup заменяются


вызовами _strdup_dbg и _wcsdup_dbg , чтобы разрешить отладку выделения памяти.
Дополнительные сведения см. в разделе_strdup_dbg . _wcsdup_dbg

Требования
Подпрограмма Обязательный заголовок

_strdup <string.h>

_wcsdup <string.h> или <wchar.h>

_mbsdup <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strdup.c

#include <string.h>

#include <stdio.h>

int main( void )

char buffer[] = "This is the buffer text";

char *newstring;

printf( "Original: %s\n", buffer );

newstring = _strdup( buffer );


printf( "Copy: %s\n", newstring );

free( newstring );

Output

Original: This is the buffer text


Copy: This is the buffer text

См. также раздел


Манипуляция со строками

memset, wmemset

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l


_strdup_dbg , _wcsdup_dbg
Статья • 03.04.2023

_strdup Версии и _wcsdup , использующие отладочную версию malloc .

Синтаксис
C

char *_strdup_dbg(

const char *strSource,

int blockType,

const char *filename,

int linenumber

);

wchar_t *_wcsdup_dbg(

const wchar_t *strSource,

int blockType,

const char *filename,

int linenumber

);

Параметры
strSource

Исходная строка, завершающаяся символом NULL.

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Каждая из этих функций возвращает указатель на расположение хранилища для
скопированной строки или NULL значение , если хранилище не может быть
выделено.

Комментарии
Функции _strdup_dbg и _wcsdup_dbg идентичны _strdup и _wcsdup за исключением
того, что если определен флаг _DEBUG , эти функции используют отладочную версию
функций malloc и _malloc_dbg для выделения памяти для повторяющейся строки.
Сведения о функциях отладки _malloc_dbg см. в разделе _malloc_dbg.

В большинстве случаев не нужно вызывать эти функции явным образом. Вместо


этого можно определить флаг _CRTDBG_MAP_ALLOC . Если определен флаг
_CRTDBG_MAP_ALLOC , вызовы функций _strdup и _wcsdup повторно сопоставляются с
_strdup_dbg и _wcsdup_dbg соответственно, а для параметра blockType задается флаг

_NORMAL_BLOCK . Таким образом, вам не нужно вызывать эти функции явным


образом, если вы не хотите пометить блоки кучи как _CLIENT_BLOCK .
Дополнительные сведения о типах блоков см. в разделе Типы блоков в отладочной
куче.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные defined

_tcsdup_dbg _strdup_dbg _mbsdup _wcsdup_dbg

Требования
Подпрограмма Обязательный заголовок

_strdup_dbg , _wcsdup_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все отладочные версии библиотек времени выполнения C.

См. также раздел


Манипуляция со строками

_strdup, _wcsdup, _mbsdup

Версии отладки функций выделения кучи


strerror , _strerror , _wcserror ,
__wcserror
Статья • 03.06.2023

Получает системную строку сообщения об ошибке ( strerror , _wcserror ) или


форматирует пользовательскую строку сообщения об ошибке ( _strerror ,
__wcserror ). Доступны более безопасные версии этих функций; см.
,strerror_s_strerror_s , , _wcserror_s. __wcserror_s

Синтаксис
C

char * strerror(

int errnum );

char * _strerror(

const char *strErrMsg );

wchar_t * _wcserror(

int errnum );

wchar_t * __wcserror(

const wchar_t *strErrMsg );

Параметры
errnum

Номер ошибки.

strErrMsg

Пользовательское сообщение.

Возвращаемое значение
Все эти функции возвращают указатель на строку сообщения об ошибке в буфере
локального хранилища потока, принадлежащей среде выполнения. Последующие
вызовы в том же потоке могут перезаписать эту строку.
Комментарии
Функция strerror сопоставляет errnum со строкой сообщения об ошибке и
возвращает указатель на строку. Функции strerror и _strerror на самом деле не
печатают сообщение. Для печати вызовите функцию вывода, например fprintf:

if (( _access( "datafile", 2 )) == -1 )

fprintf( stderr, _strerror(NULL) );

Если strErrMsg передается как NULL , _strerror возвращает указатель на строку. Он


содержит системное сообщение об ошибке для последнего вызова библиотеки,
который вызвал ошибку. При вызове __wcserror строка сообщения об ошибке
завершается символом новой строки ( '\n' ). Другие функции не добавляют '\n' .
Если strErrMsg значение не NULL равно , строка содержит по порядку: строка
strErrMsg , двоеточие, пробел, системное сообщение об ошибке. Строковое

сообщение может содержать не более 94 символов в виде узких ( _strerror ) или


расширенных ( __wcserror ).

Фактический номер ошибки для _strerror хранится в переменной errno. Чтобы


получить точные результаты, вызовите _strerror сразу после того, как
подпрограмма библиотеки возвращает ошибку. В противном случае последующие
вызовы подпрограмм библиотеки могут перезаписать errno значение.

_wcserror и __wcserror — это версии strerror и _strerror с расширенными

символами.

_strerror , _wcserror и __wcserror относятся к корпорации Майкрософт, а не


являются частью стандартной библиотеки C. Мы не рекомендуем использовать их
там, где требуется переносимый код. Для совместимости со стандартом C
используйте strerror вместо него .

Чтобы получить строки ошибок, мы рекомендуем strerror вместо _wcserror


нерекомендуемых макросов _sys_errlist и _sys_nerr и устаревшие внутренние
функции __sys_errlist и __sys_nerr .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста


Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные Определенные

_tcserror strerror strerror _wcserror

Требования
Подпрограмма Обязательный заголовок

strerror <string.h>

_strerror <string.h>

_wcserror , __wcserror <string.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для perror.

См. также раздел


Манипуляция со строками

clearerr

ferror

perror, _wperror
strerror_s , _strerror_s , _wcserror_s ,
__wcserror_s
Статья • 03.06.2023

Получают системное сообщение об ошибке ( strerror_s , _wcserror_s ) или выводят


указанное пользователем сообщение об ошибке ( _strerror_s , __wcserror_s ). Эти
функции являются версиями strerror, _strerror, _wcserrorс __wcserror улучшениями
безопасности, как описано в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t strerror_s(

char *buffer,

size_t sizeInBytes,

int errnum

);

errno_t _strerror_s(

char *buffer,

size_t sizeInBytes,

const char *strErrMsg

);

errno_t _wcserror_s(

wchar_t *buffer,

size_t sizeInWords,

int errnum

);

errno_t __wcserror_s(

wchar_t *buffer,

size_t sizeInWords,

const wchar_t *strErrMsg

);

C++

template <size_t size>

errno_t strerror_s(

char (&buffer)[size],

int errnum

); // C++ only

template <size_t size>

errno_t _strerror_s(

char (&buffer)[size],

const char *strErrMsg

); // C++ only

template <size_t size>

errno_t _wcserror_s(

wchar_t (&buffer)[size],

int errnum

); // C++ only

template <size_t size>

errno_t __wcserror_s(

wchar_t (&buffer)[size],

const wchar_t *strErrMsg

); // C++ only

Параметры
buffer

Буфер для строки ошибки.

sizeInBytes

Количество байтов в буфере.

sizeInWords

Количество слов в буфере.

errnum

Номер ошибки.

strErrMsg

Пользовательское сообщение.

Возвращаемое значение
Нуль в случае успеха или код ошибки в случае неудачи.

Условия ошибок

buffer sizeInBytes / sizeInWords strErrMsg Содержимое buffer

NULL any any Недоступно

any 0 any не изменено

Комментарии
Функция strerror_s является потокобезопасной.
Функция strerror_s сопоставляет параметр errnum со строкой сообщения об
ошибке, возвращая строку в buffer . _strerror_s не принимает номер ошибки; она
использует текущее значение errno для определения соответствующего
сообщения. Сообщение не печатается и не отображается с помощью strerror_s
или _strerror_s . Чтобы вывести сообщение, необходимо вызвать выходную
функцию, fprintfнапример :

if (( _access( "datafile",2 )) == -1 )

_strerror_s(buffer, 80, NULL);

fprintf( stderr, buffer );

Если strErrMsg имеет значение NULL , _strerror_s возвращает строку в buffer ,


содержащую системное сообщение об ошибке для последнего вызова библиотеки,
который вызвал ошибку. Если strErrMsg значение не равно NULL , возвращает
_strerror_s строку в buffer , которая содержит (по порядку) строковое

сообщение, двоеточие, пробел, системное сообщение об ошибке для последнего


вызова библиотеки, который вызвал ошибку. Длина сообщения строки не должна
превышать 94 символа.

Эти функции усекает сообщение об ошибке, если его длина превышает размер
буфера — 1. Результирующая строка в buffer всегда завершается символом NULL.

Фактический номер ошибки для _strerror_s хранится в переменной errno. Доступ


к системным сообщениям об ошибках осуществляется через переменную
_sys_errlist, которая представляет собой массив сообщений, упорядоченных по
номеру ошибки. Функция _strerror_s получает доступ к соответствующему
сообщению об ошибке, используя значение errno в качестве индекса для массива
_sys_errlist . Значение переменной _sys_nerr определяется как максимальное
число элементов в массиве _sys_errlist . Чтобы получить точные результаты,
вызовите _strerror_s сразу после возврата подпрограммы библиотеки с ошибкой.
В противном случае последующие вызовы strerror_s или _strerror_s могут
перезаписать значение errno .

_wcserror_s и __wcserror_s — это версии strerror_s и _strerror_s с


расширенными символами.

Эти функции проверяют свои параметры. Если параметр buffer равен NULL или
параметр size равен 0, вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров . Если выполнение может быть
продолжено, эти функции возвращают EINVAL и устанавливают параметр errno в
значение EINVAL .

_strerror_s , _wcserror_s и __wcserror_s не являются частью определения ANSI, а


являются расширениями Майкрософт для него. Не используйте их там, где
необходимо переносимость; Для обеспечения совместимости с ANSI используйте
strerror_s вместо .

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcserror_s strerror_s strerror_s _wcserror_s

Требования
Подпрограмма Обязательный заголовок

strerror_s , _strerror_s <string.h>

_wcserror_s , __wcserror_s <string.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для perror.
См. также раздел
Манипуляция со строками

clearerr

ferror

perror, _wperror
strftime , wcsftime , _strftime_l ,
_wcsftime_l
Статья • 03.04.2023

Форматируют строку времени.

Синтаксис
C

size_t strftime(

char *strDest,

size_t maxsize,

const char *format,

const struct tm *timeptr

);

size_t _strftime_l(

char *strDest,

size_t maxsize,

const char *format,

const struct tm *timeptr,

_locale_t locale

);

size_t wcsftime(

wchar_t *strDest,

size_t maxsize,

const wchar_t *format,

const struct tm *timeptr

);

size_t _wcsftime_l(

wchar_t *strDest,

size_t maxsize,

const wchar_t *format,

const struct tm *timeptr,

_locale_t locale

);

Параметры
strDest

Выходная строка.

maxsize

Размер буфера strDest , измеренный в символах ( char или wchar_t ).


format

Строка управления форматом.

timeptr

Структура данных tm .

locale

Используемый языковой стандарт.

Возвращаемое значение
Функция strftime возвращает количество символов в strDest , а функция wcsftime
возвращает соответствующее количество расширенных символов.

Если общее количество символов, включая NULL в конце строки, больше maxsize ,
функции strftime и wcsftime возвращают значение "0" и содержимое strDest не
определено.

Число символов в strDest равно количеству литеральных символов в format , а


также всех символов, к которым можно добавить format с помощью кодов
форматирования. Завершающее значение NULL строки не учитывается в
возвращаемом значении.

Комментарии
Функции strftime и wcsftime форматируют значение времени tm в параметре
timeptr в соответствии с предоставленным аргументом format и сохраняют

результат в буфере strDest . В строку помещается не более maxsize символов.


Описание полей в структуре см. в timeptr разделе asctime. wcsftime  — это
эквивалент функции strftime для расширенных символов; ее указывающий на
строку аргумент указывает на строку из расширенных символов. В остальном эти
функции ведут себя одинаково.

Эта функция проверяет свои параметры. Если strDest , format или timeptr является
пустым указателем или если tm структура данных, к которым timeptr обращается,
является недопустимой (например, если она содержит значения вне диапазона для
времени или даты) или если format строка содержит недопустимый код
форматирования, вызывается обработчик недопустимых параметров, как описано
в разделе Проверка параметров. Если выполнение может быть продолжено,
функция возвращает 0 и устанавливает errno в значение EINVAL .
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsftime strftime strftime wcsftime

Аргумент format состоит из одного или нескольких кодов; как и для функции
printf , коды форматирования начинаются знаком процента ( % ). Символы,
которые не начинаются с % , копируются без изменений в strDest . Категория
LC_TIME текущего языкового стандарта влияет на форматирование выходных
данных функции strftime . (Дополнительные сведения о см. в LC_TIME разделе
setlocale.) Функции strftime и wcsftime используют заданный в данный момент
языковой стандарт. Версии _strftime_l и _wcsftime_l этих функций идентичны, за
исключением того, что они принимают языковой стандарт в качестве параметра и
используют его вместо заданного в данный момент языкового стандарта. Для
получения дополнительной информации см. Locale.

Функции strftime поддерживают следующие коды форматирования:

Код Строка замены

%a Сокращенное название дня недели в языковом стандарте

%A Полное название дня недели в языковом стандарте

%b Сокращенное название месяца в языковом стандарте

%B Полное название месяца в языковом стандарте

%c Представление даты и времени, соответствующее языковому стандарту

%C Год, разделенный на 100 и усеченный до целого числа в виде десятичного числа (00–
99)

%d День месяца в виде десятичного числа (01 – 31)

%D Эквивалентно %m/%d/%y .

%e День месяца в виде десятичного числа (от 1 до 31), где отдельные цифры
предшествуют пробелом
Код Строка замены

%F Эквивалентно %Y-%m-%d .

%g Последние 2 цифры года на основе недели ISO 8601 в виде десятичного числа (00–99)

%G Год на основе недели ISO 8601 в виде десятичного числа

%h Сокращенное название месяца (эквивалент ) %b

%H Час в 24-часовом формате (00–23)

%I Час в 12-часовом формате (01–12)

%j День года в виде десятичного числа (001 – 366)

%m Месяц в виде десятичного числа (01–12)

%M Minute в виде десятичного числа (от 00 до 59)

%n Символ новой строки ( \n )

%p Индикатор A.M./P.M. языкового стандарта для 12-часовых часов

%r 12-часовое время языкового стандарта

%R Эквивалентно %H:%M .

%S Second в виде десятичного числа (от 00 до 59)

%t Символ горизонтальной табуляции ( \t )

%T %H:%M:%S Эквивалент , формат времени ISO 8601

%u Iso 8601 weekday в виде десятичного числа (1 – 7; Понедельник 1)

%U Номер недели года в виде десятичного числа (00–53), где первое воскресенье —
первый день недели 1

%V Номер недели ISO 8601 в виде десятичного числа (от 00 до 53)

%w Будний день в виде десятичного числа (от 0 до 6; Воскресенье 0)

%W Номер недели года в виде десятичного числа (от 00 до 53), где первый понедельник
является первым днем недели 1

%x Представление даты для языкового стандарта

%X Представление времени для языкового стандарта

%y Год без века, как десятичное число (00 – 99)


Код Строка замены

%Y Год с веком как десятичное число

%z Смещение от UTC в формате ISO 8601; нет символов, если часовой пояс неизвестен

%Z Имя часового пояса или сокращение часового пояса языкового стандарта в


зависимости от параметров реестра; нет символов, если часовой пояс неизвестен

%% Знак процента

Как и в функции printf , любому коду форматирования может предшествовать


флаг # . В этом случае значение кода формата изменяется следующим образом.

Код формата Значение

%#a , %#A , %#b , %#B , %#g , %#G , %#h , Флаг # игнорируется.


%#n , %#p , %#t , %#u , %#w , %#X , %#z ,
%#Z , %#%

%#c Длинное представление даты и времени,


соответствующее языковому стандарту. Например:
"Tuesday, March 14, 1995, 12:41:29".

%#x Длинное представление даты, соответствующее


языковому стандарту. Например: "Tuesday, March 14,
1995".

%#d , %#D , %#e , %#F , %#H , %#I , %#j , Удалите начальные нули или пробелы (если таковые
%#m , %#M , %#r , %#R , %#S , %#T , %#U , есть).
%#V , %#W , %#y , %#Y

В стандарте ISO 8601 week и week-based year, созданных %V , %g и %G используется


неделя, которая начинается с понедельника. Неделя 1 — это неделя, содержащая
четвертый день января, который является первой неделей, которая включает в
себя по крайней мере четыре дня года. Если первый понедельник года является 2-
м, 3-м или 4-м, то предыдущие дни являются частью последней недели
предыдущего года. Для этих дней %V заменяется 53, а оба %g и %G заменяются
цифрами предыдущего года.

7 Примечание

При использовании одной из strftime функций с указателем, возвращенным


tm из gmtime , значения, напечатанные с помощью %Z описателей и %z , не

будут точными. Это связано с тем, tm что в структуре, заданной стандартом C,


не содержатся сведения об имени часового пояса или смещения. Вместо этого
сведения о часовом поясе заполняются с помощью глобальных переменных
_timezone и _dstbias.

Требования
Подпрограмма Обязательный заголовок

strftime <time.h>

wcsftime <time.h> или <wchar.h>

_strftime_l <time.h>

_wcsftime_l <time.h> или <wchar.h>

Функции _strftime_l и _wcsftime_l зависят от Корпорации Майкрософт.


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для time.

См. также раздел


Локаль

Управление временем

Манипуляция со строками

localeconv

setlocale, _wsetlocale

Функции strcoll

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


stricmp , wcsicmp
Статья • 03.04.2023

Имена stricmp функций майкрософт и wcsicmp являются устаревшими


псевдонимами для _stricmp функций и _wcsicmp . По умолчанию они создают
предупреждение компилятора (уровень 3) C4996. Имена являются устаревшими,
так как они не соответствуют стандартным правилам C для имен, относящихся к
реализации. Однако функции по-прежнему поддерживаются.

Вместо этого рекомендуется использовать _stricmp или _wcsicmp . Или вы можете


продолжать использовать эти имена функций и отключить предупреждение.
Дополнительные сведения см. в разделах Отключение предупреждений и Имена
функций POSIX.
_stricmp , _wcsicmp , _mbsicmp ,
_stricmp_l , _wcsicmp_l , _mbsicmp_l
Статья • 03.04.2023

Выполняет сравнение строк без учета регистра.

) Важно!

Функции _mbsicmp и _mbsicmp_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int _stricmp(

const char *string1,


const char *string2

);

int _wcsicmp(

const wchar_t *string1,

const wchar_t *string2

);

int _mbsicmp(

const unsigned char *string1,

const unsigned char *string2

);

int _stricmp_l(

const char *string1,


const char *string2,
_locale_t locale

);

int _wcsicmp_l(

const wchar_t *string1,

const wchar_t *string2,

_locale_t locale

);

int _mbsicmp_l(

const unsigned char *string1,

const unsigned char *string2,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращаемое значение отражает взаимосвязь string1 со string2 , как показано
ниже.

Возвращаемое значение Описание

<0 string1 меньше string2

0 string1 идентично string2

>0 string1 больше string2

При ошибке возвращает _NLSCMPERROR значение , _mbsicmp определенное в


<string.h> и <mbstring.h> .

Комментарии
Функция _stricmp сравнивает string1 и string2 после преобразования каждого
символа в нижний регистр и возвращает значение, указывающее их связь.
_stricmp отличается от _stricoll тем, что на сравнение _stricmp влияет только тип
LC_CTYPE , определяющий регистр символов. Функция _stricoll сравнивает строки

в соответствии с категориями LC_CTYPE и LC_COLLATE языкового стандарта, который


включает как регистр, так и порядок сортировки. Дополнительные сведения о
категории см. в разделах LC_COLLATE setlocale Категории языковых стандартов и
Языковые стандарты. Версии этих функций без суффикса _l используют текущий
языковой стандарт во время операций, зависящих от языкового стандарта. Версии
с суффиксом идентичны за исключением того, что вместо этого они используют
переданный языковой стандарт. Если языковой стандарт не задан, используется
языковой стандарт C. Для получения дополнительной информации см. Locale.

7 Примечание
_stricmp равно _strcmpi . Они взаимозаменяемы, но предпочтительнее

стандарт _stricmp .

Функция _strcmpi эквивалентна _stricmp и предоставляется только для


обеспечения обратной совместимости.

Так как _stricmp производит сравнение в нижнем регистре, это может стать
причиной непредвиденного поведения.

Чтобы проиллюстрировать, когда преобразование регистра влияет _stricmp на


результат сравнения, предположим, что у вас есть две строки JOHNSTON и
JOHN_HENRY . Строка JOHN_HENRY будет считаться меньше, чем JOHNSTON потому, что
" _ " имеет более низкое значение ASCII, чем S в нижнем регистре. На самом деле
любой символ со значением ASCII от 91 до 96 будет считаться меньше любой
буквы.

strcmp Если функция используется вместо _stricmp , JOHN_HENRY будет больше


JOHNSTON .

Функции _wcsicmp и _mbsicmp are wide-character и multibyte-character versions of


_stricmp для расширенных и многобайтовых символов. Аргументы и возвращаемое

значение являются _wcsicmp строками расширенных символов. Аргументы и


возвращаемое значение являются _mbsicmp многобайтовыми строками символов.
_mbsicmp распознает последовательности многобайтовых символов в соответствии
с текущей многобайтовой кодовой страницей и возвращает _NLSCMPERROR при
ошибке. Дополнительные сведения см. в разделе Кодовая страница. В остальном
эти три функции ведут себя идентично.

_wcsicmp и wcscmp ведут себя одинаково, за исключением того, что wcscmp не

преобразует аргументы в нижний регистр перед их сравнением. _mbsicmp и


_mbscmp ведут себя одинаково, за исключением того, что _mbscmp не преобразует

аргументы в нижний регистр перед их сравнением.

Для работы с латинскими символами 1 потребуется вызвать setlocale _wcsicmp


команду . Языковой стандарт C действует по умолчанию, поэтому, например, ä не
будет сравниваться с Ä. Вызовите setlocale с любым языковым стандартом,
отличным от C, перед вызовом _wcsicmp . Следующий пример демонстрирует,
насколько функция _wcsicmp чувствительна к языковому стандарту:

C
// crt_stricmp_locale.c

By default, this function's global state is scoped to the application. To


change this behavior, see [Global state in the CRT](../global-state.md).

#include <string.h>

#include <stdio.h>

#include <locale.h>

int main() {

setlocale(LC_ALL,"C"); // in effect by default

printf("\n%d",_wcsicmp(L"ä", L"Ä")); // compare fails

setlocale(LC_ALL,"");

printf("\n%d",_wcsicmp(L"ä", L"Ä")); // compare succeeds

Альтернативой является вызов_create_locale_wcreate_locale и передача


возвращенного объекта языкового стандарта в качестве параметра в _wcsicmp_l .

Все эти функции проверяют свои параметры. Если или string1 string2 являются
пустыми указателями, вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров . Если продолжение выполнения
разрешено, эти функции возвращают _NLSCMPERROR и устанавливают для errno
значение EINVAL .

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsicmp _stricmp _mbsicmp _wcsicmp

Требования
Подпрограмма Обязательный заголовок

_stricmp , _stricmp_l <string.h>

_wcsicmp , _wcsicmp_l <string.h> либо <wchar.h>

_mbsicmp , _mbsicmp_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_stricmp.c

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

char string1[] = "The quick brown dog jumps over the lazy fox";

char string2[] = "The QUICK brown dog jumps over the lazy fox";

int main( void )

char tmp[20];

int result;

// Case sensitive

printf( "Compare strings:\n %s\n %s\n\n", string1, string2 );

result = strcmp( string1, string2 );

if( result > 0 )

strcpy_s( tmp, _countof(tmp), "greater than" );

else if( result < 0 )

strcpy_s( tmp, _countof(tmp), "less than" );

else

strcpy_s( tmp, _countof(tmp), "equal to" );

printf( " strcmp: String 1 is %s string 2\n", tmp );

// Case insensitive (could use equivalent _stricmp)

result = _stricmp( string1, string2 );

if( result > 0 )

strcpy_s( tmp, _countof(tmp), "greater than" );

else if( result < 0 )

strcpy_s( tmp, _countof(tmp), "less than" );

else

strcpy_s( tmp, _countof(tmp), "equal to" );

printf( " _stricmp: String 1 is %s string 2\n", tmp );

Output

Compare strings:

The quick brown dog jumps over the lazy fox

The QUICK brown dog jumps over the lazy fox

strcmp: String 1 is greater than string 2

_stricmp: String 1 is equal to string 2

См. также раздел


Манипуляция со строками

memcmp, wmemcmp

_memicmp, _memicmp_l

strcmp, wcscmp, _mbscmp

Функции strcoll

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


_stricoll , _wcsicoll , _mbsicoll ,
_stricoll_l , _wcsicoll_l , _mbsicoll_l
Статья • 03.04.2023

Сравнивает строки на основе данных языкового стандарта.

) Важно!

Функции _mbsicoll и _mbsicoll_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int _stricoll(

const char *string1,


const char *string2

);

int _wcsicoll(

const wchar_t *string1,

const wchar_t *string2

);

int _mbsicoll(

const unsigned char *string1,

const unsigned char *string2

);

int _stricoll_l(

const char *string1,


const char *string2,
_locale_t locale

);

int _wcsicoll_l(

const wchar_t *string1,

const wchar_t *string2,

_locale_t locale

);

int _mbsicoll_l(

const unsigned char *string1,

const unsigned char *string2,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает значение, которое соответствует отношению
между string1 и string2 , как показано ниже.

Возвращаемое значение Связь с string1 string2

<0 string1 меньше string2

0 string1 идентично string2

>0 string1 больше string2

_NLSCMPERROR Произошла ошибка.

Каждая из этих функций возвращает _NLSCMPERROR . Чтобы использовать


_NLSCMPERROR , включите <string.h> или <mbstring.h>. _wcsicoll может завершиться
ошибкой, если string1 или string2 содержит коды расширенных символов, не
входящие в последовательность сортировки. При возникновении ошибки
_wcsicoll может присвоить параметру errno значение EINVAL . Чтобы убедиться, не

возникает ли ошибка при вызове функции _wcsicoll , присвойте параметру errno


значение 0 и проверьте errno после вызова функции _wcsicoll .

Комментарии
Каждая из этих функций сравнивает без учета регистра строки string1 и string2 в
соответствии с используемой в настоящее время кодовой страницей. Эти функции
следует использовать только в том случае, если на текущей кодовой странице есть
разница между порядком набора символов и лексикографическим порядком
символов, и это различие представляет интерес для сравнения строк.

_stricmp отличается от _stricoll тем, что на сравнение _stricmp влияет LC_CTYPE ,


тогда как _stricoll сравнение осуществляется в соответствии с категориями
LC_CTYPE и LC_COLLATE языкового стандарта. Дополнительные сведения о категории
см. в разделах LC_COLLATE setlocale Категории языковых стандартов и Языковые
стандарты. Версии этих функций без суффикса _l используют текущий языковой
стандарт. Версии с суффиксом _l идентичны им, но они используют языковой
стандарт, переданный в качестве аргумента. Для получения дополнительной
информации см. Locale.

Все эти функции проверяют свои параметры. Если или string1 string2 являются
NULL указателями, вызывается обработчик недопустимых параметров, как описано
в разделе Проверка параметров. Если продолжение выполнения разрешено, эти
функции возвращают _NLSCMPERROR и устанавливают для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsicoll _stricoll _mbsicoll _wcsicoll

Требования
Подпрограмма Обязательный заголовок

_stricoll , _stricoll_l <string.h>

_wcsicoll , _wcsicoll_l <wchar.h>, <string.h>

_mbsicoll , _mbsicoll_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Локаль

Манипуляция со строками

Функции strcoll

localeconv

_mbsnbcoll, _mbsnbcoll_l, _mbsnbicoll, _mbsnbicoll_l

setlocale, _wsetlocale

strcmp, wcscmp, _mbscmp

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


_strinc , _wcsinc , _mbsinc , _mbsinc_l
Статья • 03.04.2023

Увеличивает строковый указатель на один символ.

) Важно!

Функции _mbsinc и _mbsinc_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strinc(

const char *current,


_locale_t locale

);

wchar_t *_wcsinc(

const wchar_t *current,

_locale_t locale

);

unsigned char *_mbsinc(

const unsigned char *current

);

unsigned char *_mbsinc_l(

const unsigned char *current,

_locale_t locale

);

Параметры
current

Указатель символа.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает указатель на символ, который следует
сразу за current .

Комментарии
Функция _mbsinc возвращает указатель на первый байт многобайтового символа,
который следует сразу за current . _mbsinc распознает последовательности
многобайтовых символов согласно используемой в данный момент многобайтовой
кодовой странице; функция _mbsinc_l идентична, за исключением того, что она
использует переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

Функция универсального текста _tcsinc , определенная в Tchar.h, сопоставляется с


_mbsinc , если определен флаг _MBCS , или с _wcsinc , если определен флаг _UNICODE .
В противном случае _tcsinc сопоставляется с _strinc . _strinc и _wcsinc — версии
_mbsinc с однобайтовыми или расширенными символами. _strinc и _wcsinc

предоставляются только для этого сопоставления и не должны использоваться в


противном случае. Дополнительные сведения см. в разделах Использование
сопоставлений универсального текста и Сопоставления универсального текста.

Если current имеет значение NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эта функция возвращает EINVAL и задает для errno
значение EINVAL .

) Важно!

Эти функции могут быть подвержены угрозам переполнения буфера.


Переполнение буфера можно использовать для атак на систему, поскольку
оно может привести к несанкционированному повышению уровня
привилегий. Дополнительные сведения см . в статье Предотвращение
переполнения буфера.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_mbsinc <mbstring.h>

_mbsinc_l <mbstring.h>

_strinc <tchar.h>

_wcsinc <tchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Манипуляция со строками

_strdec, _wcsdec, _mbsdec, _mbsdec_l

_strnextc, _wcsnextc, _mbsnextc, _mbsnextc_l

_strninc, _wcsninc, _mbsninc, _mbsninc_l


strlen , wcslen , _mbslen , _mbslen_l ,
_mbstrlen , _mbstrlen_l
Статья • 03.04.2023

Получает длину строки, используя текущий или указанный языковой стандарт.


Доступны более безопасные версии этих функций; см. ,strnlenstrnlen_s , wcsnlen,
wcsnlen_s, _mbsnlen_l_mbsnlen, _mbstrnlen, , . _mbstrnlen_l

) Важно!

_mbslen , _mbslen_l , _mbstrlen и _mbstrlen_l нельзя использовать в

приложениях, выполняемых в среде выполнения Windows. Дополнительные


сведения: Функции CRT, которые не поддерживаются в приложениях
универсальной платформы Windows.

Синтаксис
C

size_t strlen(

const char *str

);

size_t wcslen(

const wchar_t *str

);

size_t _mbslen(

const unsigned char *str

);

size_t _mbslen_l(

const unsigned char *str,

_locale_t locale

);

size_t _mbstrlen(

const char *str

);

size_t _mbstrlen_l(

const char *str,

_locale_t locale

);

Параметры
str

Строка, завершающаяся символом NULL.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает количество символов в str , за исключением
конечного null. Зарезервированное возвращаемое значение для обозначения
ошибки отсутствует, за исключением _mbstrlen и _mbstrlen_l , которые возвращают
((size_t)(-1)) , если строка содержит недопустимый многобайтовый символ.

Комментарии
strlen интерпретирует строку как строку однобайтовых символов, поэтому
возвращаемое значение всегда равно числу байт, даже если строка содержит
многобайтовые символы. wcslen — это версия strlen с расширенными
символами; аргумент wcslen — строка расширенных символов, а число символов
выражается в расширенных (двухбайтовых) символах. Поведение wcslen и strlen
идентично в противном случае.

Примечание о безопасности. Эти функции предполагают потенциальную угрозу,


связанную с проблемой переполнения буфера. Проблемы переполнения буфера
— это распространенный метод атак на системы, который приводит к
несанкционированному повышению уровня прав. Дополнительные сведения см . в
статье Предотвращение переполнения буфера.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcslen strlen strlen wcslen

_tcsclen strlen _mbslen wcslen


TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tcsclen_l strlen _mbslen_l wcslen

_mbslen и _mbslen_l возвращают количество многобайтовых символов в

многобайтовой строке, но они не проверяют допустимость многобайтовых


символов. _mbstrlen и _mbstrlen_l проверяют допустимость многобайтовых
символов и распознают их последовательности. Если строка, переданная в
_mbstrlen или _mbstrlen_l , содержит недопустимый многобайтовый символ для
кодовой страницы, функция возвращает значение -1 и задает для errno значение
EILSEQ .

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

Требования
Подпрограмма Обязательный заголовок

strlen <string.h>

wcslen <string.h> либо <wchar.h>

_mbslen , _mbslen_l <mbstring.h>

_mbstrlen , _mbstrlen_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strlen.c

// Determine the length of a string. For the multi-byte character

// example to work correctly, the Japanese language support for

// non-Unicode programs must be enabled by the operating system.

#include <string.h>

#include <locale.h>

int main()

char* str1 = "Count.";

wchar_t* wstr1 = L"Count.";

char * mbstr1;

char * locale_string;

// strlen gives the length of single-byte character string

printf("Length of '%s' : %d\n", str1, strlen(str1) );

// wcslen gives the length of a wide character string

wprintf(L"Length of '%s' : %d\n", wstr1, wcslen(wstr1) );

// A multibyte string: [A] [B] [C] [katakana A] [D] [\0]

// in Code Page 932. For this example to work correctly,

// the Japanese language support must be enabled by the

// operating system.

mbstr1 = "ABC" "\x83\x40" "D";

locale_string = setlocale(LC_CTYPE, "Japanese_Japan");

if (locale_string == NULL)

printf("Japanese locale not enabled. Exiting.\n");


exit(1);

else

printf("Locale set to %s\n", locale_string);

// _mbslen will recognize the Japanese multibyte character if the

// current locale used by the operating system is Japanese

printf("Length of '%s' : %d\n", mbstr1, _mbslen(mbstr1) );

// _mbstrlen will recognize the Japanese multibyte character

// since the CRT locale is set to Japanese even if the OS locale

// isnot.

printf("Length of '%s' : %d\n", mbstr1, _mbstrlen(mbstr1) );

printf("Bytes in '%s' : %d\n", mbstr1, strlen(mbstr1) );

Output

Length of 'Count.' : 6

Length of 'Count.' : 6

Length of 'ABCァD' : 5

Length of 'ABCァD' : 5

Bytes in 'ABCァD' : 6

См. также раздел


Манипуляция со строками

Интерпретация последовательностей многобайтовых символов

Локаль

setlocale, _wsetlocale

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

Функции strcoll

strcpy, wcscpy, _mbscpy

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strlwr , wcslwr
Статья • 03.04.2023

Имена strlwr функций, относящиеся к корпорации Майкрософт, являются wcslwr


устаревшими псевдонимами для _strlwr функций и _wcslwr функций. По умолчанию
они создают предупреждение компилятора (уровень 3) C4996. Имена являются
устаревшими, так как они не соответствуют стандартным правилам C для имен,
относящихся к реализации. Однако функции по-прежнему поддерживаются.

Вместо этого рекомендуется использовать _strlwr или _wcslwr или функции,


улучшенные _strlwr_s для безопасности._wcslwr_s Вы также можете продолжать
использовать эти имена функций и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен функций предупреждения и POSIX".
_strlwr , _wcslwr , _mbslwr , _strlwr_l ,
_wcslwr_l , _mbslwr_l
Статья • 03.04.2023

Преобразует строку в нижний регистр. Доступны более безопасные версии этих


функций; see _strlwr_s, _strlwr_s_l_mbslwr_s, _mbslwr_s_l, _wcslwr_s_wcslwr_s_l.

) Важно!

Функции _mbslwr и _mbslwr_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strlwr(

char * str

);

wchar_t *_wcslwr(

wchar_t * str

);

unsigned char *_mbslwr(

unsigned char * str

);

char *_strlwr_l(

char * str,

_locale_t locale

);

wchar_t *_wcslwr_l(

wchar_t * str,

_locale_t locale

);

unsigned char *_mbslwr_l(

unsigned char * str,


_locale_t locale

);

template <size_t size>

char *_strlwr(

char (&str)[size]

); // C++ only

template <size_t size>

wchar_t *_wcslwr(

wchar_t (&str)[size]

); // C++ only

template <size_t size>

unsigned char *_mbslwr(

unsigned char (&str)[size]

); // C++ only

template <size_t size>

char *_strlwr_l(

char (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

wchar_t *_wcslwr_l(

wchar_t (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

unsigned char *_mbslwr_l(

unsigned char (&str)[size],

_locale_t locale

); // C++ only

Параметры
str

Строка, завершающаяся символом NULL, для преобразования в нижний регистр.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает указатель на преобразованную строку. Так как
изменение осуществляется на месте, возвращенный указатель совпадает с
указателем, переданным в качестве входного аргумента. Нет зарезервированных
возвращаемых значений для указания ошибки.

Комментарии
Функция _strlwr преобразует все буквы в верхнем регистре в str в нижний
регистр, как определено категорией LC_CTYPE языкового стандарта. Другие
символы не затрагиваются. Дополнительные сведения о методе LC_CTYPE см. в
разделе setlocale. Версии этих функций без _l суффикса используют текущий
языковой стандарт для поведения, зависящее от языкового стандарта. Версии с
суффиксом _l идентичны, за исключением того, что они используют переданный
языковой стандарт. Для получения дополнительной информации см. Locale.

Функции _wcslwr и _mbslwr являются версиями функции _strlwr для расширенных


и многобайтовых символов. Аргумент и возвращаемое значение _wcslwr являются
строками расширенных символов. Аргумент и возвращаемое значение _mbslwr
являются многобайтовыми строками. В остальном эти три функции ведут себя
идентично.

Если str указатель является NULL указателем, вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров ". Если
продолжение выполнения разрешено, эти функции возвращают исходную строку и
устанавливают для errno значение EINVAL .

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcslwr _strlwr _mbslwr _wcslwr

_tcslwr_l _strlwr_l _mbslwr_l _wcslwr_l

Требования
Подпрограмма Обязательный заголовок

_strlwr , _strlwr_l <string.h>

_wcslwr , _wcslwr_l <string.h> или <wchar.h>

_mbslwr , _mbslwr_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_strlwr.c

// compile with: /W3

// This program uses _strlwr and _strupr to create

// uppercase and lowercase copies of a mixed-case string.

#include <string.h>

#include <stdio.h>

int main( void )

char string[100] = "The String to End All Strings!";

char * copy1 = _strdup( string ); // make two copies

char * copy2 = _strdup( string );

_strlwr( copy1 ); // C4996

// Note: _strlwr is deprecated; consider using _strlwr_s instead

_strupr( copy2 ); // C4996

// Note: _strupr is deprecated; consider using _strupr_s instead

printf( "Mixed: %s\n", string );

printf( "Lower: %s\n", copy1 );

printf( "Upper: %s\n", copy2 );

free( copy1 );

free( copy2 );

Output

Mixed: The String to End All Strings!

Lower: the string to end all strings!

Upper: THE STRING TO END ALL STRINGS!

См. также раздел


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

Локаль

_strupr, _strupr_l, _mbsupr, _mbsupr_l, _wcsupr_l, _wcsupr


_strlwr_s , _strlwr_s_l , _mbslwr_s ,
_mbslwr_s_l , _wcslwr_s , _wcslwr_s_l
Статья • 03.04.2023

Преобразует буквы в строке в строчные с использованием текущего или


переданного языкового стандарта. Эти версии , _wcslwr, ,
_mbslwr_l_wcslwr_l_strlwr_l_mbslwrимеют улучшения безопасности, как описано в
функциях_strlwrбезопасности в CRT.

) Важно!

Функции _mbslwr_s и _mbslwr_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t _strlwr_s(

char *str,

size_t numberOfElements

);

errno_t _strlwr_s_l(

char *str,

size_t numberOfElements,

_locale_t locale

);

errno_t _mbslwr_s(

unsigned char *str,

size_t numberOfElements

);

errno_t _mbslwr_s_l(

unsigned char *str,

size_t numberOfElements,

_locale_t locale

);

errno_t _wcslwr_s(

wchar_t *str,

size_t numberOfElements

);

errno_t _wcslwr_s_l(

wchar_t *str,

size_t numberOfElements,

_locale_t locale

);

template <size_t size>

errno_t _strlwr_s(

char (&str)[size]

); // C++ only

template <size_t size>

errno_t _strlwr_s_l(

char (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

errno_t _mbslwr_s(

unsigned char (&str)[size]

); // C++ only

template <size_t size>

errno_t _mbslwr_s_l(

unsigned char (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

errno_t _wcslwr_s(

wchar_t (&str)[size]

); // C++ only

template <size_t size>

errno_t _wcslwr_s_l(

wchar_t (&str)[size],

_locale_t locale

); // C++ only

Параметры
str

Строка, завершающаяся символом NULL, для преобразования в нижний регистр.

numberOfElements

Размер буфера.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успеха или ненулевой код ошибки в случае ошибки.

Эти функции проверяют свои параметры. Если str не является допустимой


строкой, завершающейся значением NULL, вызывается обработчик недопустимых
параметров, как описано в разделе "Проверка параметров ". Если выполнение
может быть продолжено, эти функции возвращают EINVAL и устанавливают
параметр errno в значение EINVAL . Если numberOfElements меньше, чем длина
строки, функции также возвращают EINVAL и устанавливают для параметра errno
значение EINVAL .

Комментарии
Функция _strlwr_s преобразует "на месте" каждую прописную букву в строке str
в строчную. _mbslwr_s — это версия функции _strlwr_s с многобайтовой
кодировкой символов. _wcslwr_s  — это версия функции _strlwr_s для
расширенных символов.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcslwr_s _strlwr_s _mbslwr_s _wcslwr_s


Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные Определенные

_tcslwr_s_l _strlwr_s_l _mbslwr_s_l _wcslwr_s_l

Требования
Подпрограмма Обязательный заголовок

_strlwr_s , _strlwr_s_l <string.h>

_mbslwr_s , _mbslwr_s_l <mbstring.h>

_wcslwr_s , _wcslwr_s_l <string.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_strlwr_s.cpp

// This program uses _strlwr_s and _strupr_s to create

// uppercase and lowercase copies of a mixed-case string.

//

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

int main()

char str[] = "The String to End All Strings!";

char *copy1, *copy2;

errno_t err;

err = _strlwr_s( copy1 = _strdup(str), strlen(str) + 1);

err = _strupr_s( copy2 = _strdup(str), strlen(str) + 1);

printf( "Mixed: %s\n", str );

printf( "Lower: %s\n", copy1 );

printf( "Upper: %s\n", copy2 );

free( copy1 );

free( copy2 );

return 0;

Output

Mixed: The String to End All Strings!

Lower: the string to end all strings!

Upper: THE STRING TO END ALL STRINGS!

См. также раздел


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

Локаль

Интерпретация последовательностей многобайтовых символов

_strupr_s, _strupr_s_l, _mbsupr_s, _mbsupr_s_l, _wcsupr_s, _wcsupr_s_l


strncat , _strncat_l , wcsncat ,
_wcsncat_l , _mbsncat , _mbsncat_l
Статья • 03.04.2023

Добавляет символы строки. Доступны более безопасные версии этих функций; см.
разделstrncat_s , _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l.

) Важно!

_mbsncat и _mbsncat_l нельзя использовать в приложениях, которые

выполняются в среда выполнения Windows. Дополнительные сведения:


Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strncat(

char *strDest,

const char *strSource,

size_t count

);

wchar_t *wcsncat(

wchar_t *strDest,

const wchar_t *strSource,

size_t count

);

unsigned char *_mbsncat(

unsigned char *strDest,

const unsigned char *strSource,

size_t count

);

unsigned char *_mbsncat_l(

unsigned char *strDest,

const unsigned char *strSource,

size_t count,

_locale_t locale

);

template <size_t size>

char *strncat(

char (&strDest)[size],

const char *strSource,

size_t count

); // C++ only

template <size_t size>

wchar_t *wcsncat(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count

); // C++ only

template <size_t size>

unsigned char *_mbsncat(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count

); // C++ only

template <size_t size>

unsigned char *_mbsncat_l(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count,

_locale_t locale

); // C++ only

Параметры
strDest

Строка назначения, завершающаяся нуль-символом.

strSource

Исходная строка, завершающаяся символом NULL.

count

Количество символов для добавления.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на целевую строку символов. Нет зарезервированных
возвращаемых значений для указания ошибки.

Комментарии
Функция strncat в основном добавляет первые символы count strSource в
strDest . Начальный символ строки strSource переопределяет завершающий нуль-

символ строки strDest . Если нуль-символ встречается в строке strSource до того,


как будет добавлено count символов, функция strncat добавляет все символы из
строки strSource вплоть до нуль-символа. Если значение count больше длины
строки strSource , вместо параметра strSource используется длина строки count .
Во всех случаях результирующая строка завершается нуль-символом. Если
копирование производится между перекрывающимися строками, поведение не
определено.

) Важно!

strncat не проверяет, достаточно ли места в строке strDest , в связи с чем

может возникнуть ошибка переполнения буфера. Помните, что count


ограничивает количество добавляемых символов, но не размер strDest . См.
пример ниже. Дополнительные сведения см . в статье Предотвращение
переполнения буфера.

Функции wcsncat и _mbsncat are wide-character и multibyte-character versions of


strncat для расширенных и многобайтовых символов. Строковые аргументы и
возвращаемое значение wcsncat являются строками расширенных символов.
Строковые аргументы и возвращаемое значение являются _mbsncat
многобайтовыми строками символов. В остальном эти три функции ведут себя
идентично.

На выходное значение влияет параметр LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для этого поведения,
зависящей от языкового стандарта. Версии с суффиксом _l идентичны, за
исключением того, что вместо них используется переданный параметр языкового
стандарта. Для получения дополнительной информации см. Locale.

В C++ эти функции имеют шаблонные перегрузки. Дополнительные сведения см. в


разделе Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные
TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tcsncat strncat _mbsnbcat wcsncat

_tcsncat_l _strncat_l _mbsnbcat_l _wcsncat_l

7 Примечание

Функции _strncat_l и _wcsncat_l не зависят от языкового стандарта и не


предназначены для непосредственного вызова. Они предназначены для
внутреннего использования _tcsncat_l .

Требования
Подпрограмма Обязательный заголовок

strncat <string.h>

wcsncat <string.h> или <wchar.h>

_mbsncat <mbstring.h>

_mbsncat_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strncat.c

// Use strcat and strncat to append to a string.

#include <stdlib.h>

#define MAXSTRINGLEN 39

char string[MAXSTRINGLEN+1];

// or char *string = malloc(MAXSTRINGLEN+1);

void BadAppend( char suffix[], int n )

strncat( string, suffix, n );

void GoodAppend( char suffix[], size_t n )

strncat( string, suffix, __min( n, MAXSTRINGLEN-strlen(string)) );

int main( void )

string[0] = '\0';

printf( "string can hold up to %d characters\n", MAXSTRINGLEN );

strcpy( string, "This is the initial string!" );

// concatenate up to 20 characters...

BadAppend( "Extra text to add to the string...", 20 );

printf( "After BadAppend : %s (%d chars)\n", string, strlen(string) );

strcpy( string, "This is the initial string!" );

// concatenate up to 20 characters...

GoodAppend( "Extra text to add to the string...", 20 );

printf( "After GoodAppend: %s (%d chars)\n", string, strlen(string) );

Выходные данные
Output

string can hold up to 39 characters

After BadAppend : This is the initial string!Extra text to add to (47


chars)

After GoodAppend: This is the initial string!Extra text t (39 chars)

Вы видите, что BadAppend вызвало переполнение буфера.

См. также раздел


Манипуляция со строками

_mbsnbcat, _mbsnbcat_l

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l

Локаль

Интерпретация последовательностей многобайтовых символов\


strncat_s , _strncat_s_l , wcsncat_s ,
_wcsncat_s_l , _mbsncat_s , _mbsncat_s_l
Статья • 03.04.2023

Присоединяет символы к строке. Эти версии strncat, _strncat_l, wcsncat, _wcsncat_l,


_mbsncat, имеют _mbsncat_l улучшения безопасности, как описано в разделе
Функции безопасности в CRT.

) Важно!

Функции _mbsncat_s и _mbsncat_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t strncat_s(

char *strDest,

size_t numberOfElements,

const char *strSource,

size_t count

);

errno_t _strncat_s_l(

char *strDest,

size_t numberOfElements,

const char *strSource,

size_t count,

_locale_t locale

);

errno_t wcsncat_s(

wchar_t *strDest,

size_t numberOfElements,

const wchar_t *strSource,

size_t count

);

errno_t _wcsncat_s_l(

wchar_t *strDest,

size_t numberOfElements,

const wchar_t *strSource,

size_t count,

_locale_t locale

);

errno_t _mbsncat_s(

unsigned char *strDest,

size_t numberOfElements,

const unsigned char *strSource,

size_t count

);

errno_t _mbsncat_s_l(

unsigned char *strDest,

size_t numberOfElements,

const unsigned char *strSource,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t strncat_s(

char (&strDest)[size],

const char *strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _strncat_s_l(

char (&strDest)[size],

const char *strSource,

size_t count,

_locale_t locale

); // C++ only

template <size_t size>

errno_t wcsncat_s(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _wcsncat_s_l(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count,

_locale_t locale

); // C++ only

template <size_t size>

errno_t _mbsncat_s(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _mbsncat_s_l(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count,

_locale_t locale

); // C++ only

Параметры
strDest

Строка назначения, завершающаяся нуль-символом.

numberOfElements

Размер буфера назначения.

strSource

Исходная строка, завершающаяся символом NULL.

count

Число добавляемых символов или _TRUNCATE.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает 0 в случае успеха или код ошибки в случае неудачи.

Условия ошибок

strDestination numberOfElements strSource Возвращаемое Содержимое


значение strDestination

NULL или без признака any any EINVAL не изменено


завершения

any any NULL EINVAL не изменено

any 0 или слишком any ERANGE не изменено


мал

Комментарии
Эти функции пытаются добавить первые D символов строки strSource в конец
строки strDest , где D — это меньшее из величины count и длины strSource . Если
добавление этих D символов поместится в strDest (размер которого
присваивается как numberOfElements ) и по-прежнему оставляет место для конца
null, эти символы добавляются, начиная с исходного завершающего значения NULL
, и добавляется новое завершающее значение NULL; в противном случае
strDest[0] устанавливается символ NULL и вызывается обработчик недопустимого

strDest параметра, как описано в разделе Проверка параметров.

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


_TRUNCATEзначение , к добавляется strDest столько значений strSource , сколько
подходит, при этом остается место для добавления завершающего значения NULL.

Например, примененная к объекту директива

char dst[5];

strncpy_s(dst, _countof(dst), "12", 2);

strncat_s(dst, _countof(dst), "34567", 3);

означает, что мы просим strncat_s добавить три символа к двум символам в


буфере длиной пять символов. Это не оставляет места для конца null, поэтому
strncat_s обнуляет строку и вызывает обработчик недопустимых параметров.

Если необходимо усечение, следует использовать _TRUNCATE или соответствующим


образом отрегулировать параметр count :

strncat_s(dst, _countof(dst), "34567", _TRUNCATE);

или

strncat_s(dst, _countof(dst), "34567", _countof(dst)-strlen(dst)-1);

Во всех случаях результирующая строка завершается нуль-символом. Если


копирование производится между перекрывающимися строками, поведение не
определено.

Если strSource или strDest имеет значение NULL , или numberOfElements равно
нулю, вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров . Если выполнение может быть продолжено, функция
возвращает EINVAL без изменения своих параметров.

Функции wcsncat_s и _mbsncat_s are wide-character и multibyte-character versions of


strncat_s для расширенных и многобайтовых символов. Строковые аргументы и
возвращаемое значение являются wcsncat_s строками расширенных символов.
Аргументы и возвращаемое значение являются _mbsncat_s многобайтовыми
строками символов. В остальном эти три функции ведут себя идентично.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для этого поведения,
зависят от языкового стандарта. Версии с суффиксом _l идентичны, за
исключением того, что вместо них используется переданный параметр языкового
стандарта. Для получения дополнительной информации см. Locale.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsncat_s strncat_s _mbsnbcat_s wcsncat_s

_tcsncat_s_l _strncat_s_l _mbsnbcat_s_l _wcsncat_s_l

_strncat_s_l и _wcsncat_s_l не имеют зависимости от языкового стандарта; они

предоставляются только для _tcsncat_s_l .

Требования
Подпрограмма Обязательный заголовок

strncat_s <string.h>
Подпрограмма Обязательный заголовок

wcsncat_s <string.h> или <wchar.h>

_mbsncat_s , _mbsncat_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_strncat_s.cpp

// compile with: /MTd

// These #defines enable secure template overloads

// (see last part of Examples() below)

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <crtdbg.h> // For _CrtSetReportMode

#include <errno.h>

// This example uses a 10-byte destination buffer.

errno_t strncat_s_tester( const char * initialDest,

const char * src,

int count )

char dest[10];

strcpy_s( dest, _countof(dest), initialDest );

printf_s( "\n" );

if ( count == _TRUNCATE )

printf_s( "Appending '%s' to %d-byte buffer dest with truncation


semantics\n",

src, _countof(dest) );

else

printf_s( "Appending %d chars of '%s' to %d-byte buffer dest\n",

count, src, _countof(dest) );

printf_s( " old contents of dest: '%s'\n", dest );

errno_t err = strncat_s( dest, _countof(dest), src, count );

printf_s( " new contents of dest: '%s'\n", dest );

return err;

void Examples()

strncat_s_tester( "hi ", "there", 4 );

strncat_s_tester( "hi ", "there", 5 );

strncat_s_tester( "hi ", "there", 6 );

printf_s( "\nDestination buffer too small:\n" );

strncat_s_tester( "hello ", "there", 4 );

printf_s( "\nTruncation examples:\n" );

errno_t err = strncat_s_tester( "hello ", "there", _TRUNCATE );

printf_s( " truncation %s occur\n", err == STRUNCATE ? "did"


: "did not" );

err = strncat_s_tester( "hello ", "!", _TRUNCATE );

printf_s( " truncation %s occur\n", err == STRUNCATE ? "did"


: "did not" );

printf_s( "\nSecure template overload example:\n" );

char dest[10] = "cats and ";

strncat( dest, "dachshunds", 15 );

// With secure template overloads enabled (see #define

// at top of file), the preceding line is replaced by

// strncat_s( dest, _countof(dest), "dachshunds", 15 );

// Instead of causing a buffer overrun, strncat_s invokes

// the invalid parameter handler.

// If secure template overloads were disabled, strncat would

// append "dachshunds" and overrun the dest buffer.

printf_s( " new contents of dest: '%s'\n", dest );

void myInvalidParameterHandler(

const wchar_t* expression,

const wchar_t* function,

const wchar_t* file,


unsigned int line,

uintptr_t pReserved)
{

wprintf_s(L"Invalid parameter handler invoked: %s\n", expression);

int main( void )

_invalid_parameter_handler oldHandler, newHandler;

newHandler = myInvalidParameterHandler;

oldHandler = _set_invalid_parameter_handler(newHandler);

// Disable the message box for assertions.

_CrtSetReportMode(_CRT_ASSERT, 0);

Examples();

Output

Appending 4 chars of 'there' to 10-byte buffer dest

old contents of dest: 'hi '

new contents of dest: 'hi ther'

Appending 5 chars of 'there' to 10-byte buffer dest

old contents of dest: 'hi '

new contents of dest: 'hi there'

Appending 6 chars of 'there' to 10-byte buffer dest

old contents of dest: 'hi '

new contents of dest: 'hi there'

Destination buffer too small:

Appending 4 chars of 'there' to 10-byte buffer dest

old contents of dest: 'hello '

Invalid parameter handler invoked: (L"Buffer is too small" && 0)

new contents of dest: ''

Truncation examples:

Appending 'there' to 10-byte buffer dest with truncation semantics

old contents of dest: 'hello '

new contents of dest: 'hello the'

truncation did occur

Appending '!' to 10-byte buffer dest with truncation semantics

old contents of dest: 'hello '

new contents of dest: 'hello !'

truncation did not occur

Secure template overload example:


Invalid parameter handler invoked: (L"Buffer is too small" && 0)

new contents of dest: ''

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbcat, _mbsnbcat_l

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strncmp , wcsncmp , _mbsncmp , _mbsncmp_l
Статья • 03.04.2023

Сравнивает символы двух строк вплоть до указанного количества.

) Важно!

Функции _mbsncmp и _mbsncmp_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int strncmp(

const char *string1,


const char *string2,
size_t count

);

int wcsncmp(

const wchar_t *string1,

const wchar_t *string2,

size_t count

);

int _mbsncmp(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _mbsncmp_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);int _mbsnbcmp(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

Параметры
string1 , string2

Строки для сравнения.

count

Число сравниваемых символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращаемое значение отражает взаимосвязь подстрок string1 и string2 , как
показано ниже.

Возвращаемое значение Описание

<0 Подстрока string1 меньше, чем подстрока string2 .

0 Подстрока string1 идентична подстроке string2 .

>0 Подстрока string1 больше, чем подстрока string2 .

При ошибке _mbsncmp проверки параметра и _mbsncmp_l возвращают _NLSCMPERROR ,


которая определена в <string.h> и <mbstring.h> .

Комментарии
Функция strncmp выполняет порядковое сравнение не более чем count первых
символов в string1 и string2 и возвращает значение, указывающее отношение
между подстроками. strncmp — чувствительная к регистру версия _strnicmp .
wcsncmp и _mbsncmp — чувствительные к регистру версии _wcsnicmp и _mbsnicmp .

Функции wcsncmp и _mbsncmp are wide-character и multibyte-character versions of


strncmp для расширенных и многобайтовых символов. Аргументы являются wcsncmp
строками расширенных символов. Аргументами являются _mbsncmp многобайтовые
символьные строки. _mbsncmp распознает последовательности многобайтовых
символов в соответствии с многобайтовой кодовой страницей и возвращает
_NLSCMPERROR при ошибке.

Кроме того, функции _mbsncmp и _mbsncmp_l проверяют свои параметры. Если


string1 или string2 является пустым указателем и count не равен 0, вызывается

обработчик недопустимых параметров, как описано в разделе Проверка


параметров. Если выполнение может быть продолжено, то функции _mbsncmp и
_mbsncmp_l возвращают ошибку _NLSCMPERROR и устанавливают для errno значение
EINVAL . strncmp и wcsncmp не проверяют свои параметры. В остальном эти функции

ведут себя одинаково.

Способ сравнения _mbsncmp и _mbsncmp_l зависит от настройки категории LC_CTYPE


языкового стандарта. Эта категория определяет обнаружение начальных и
конечных байтов в многобайтовых символах. Для получения дополнительной
информации см. setlocale. Функция _mbsncmp использует текущий языковой
стандарт для данной функциональности, зависящей от языкового стандарта.
Функция _mbsncmp_l идентична за исключением того, что она использует вместо
этого параметр locale . Для получения дополнительной информации см. Locale.
Если языковой стандарт является однобайтовым, поведение этих функций
идентично поведению strncmp .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE Определенные


Обычной определены Определенные

_tcsnccmp strncmp _mbsncmp wcsncmp

_tcsncmp strncmp _mbsnbcmp wcsncmp

_tccmp Сопоставляется макросу или _mbsncmp Сопоставляется макросу


встраиваемой функции или встраиваемой функции

Требования
Подпрограмма Обязательный заголовок

strncmp <string.h>

wcsncmp <string.h> либо <wchar.h>

_mbsncmp , _mbsncmp_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_strncmp.c

#include <string.h>

#include <stdio.h>

char string1[] = "The quick brown dog jumps over the lazy fox";

char string2[] = "The QUICK brown fox jumps over the lazy dog";

int main( void )

char tmp[20];

int result;

printf( "Compare strings:\n %s\n %s\n\n",

string1, string2 );

printf( "Function: strncmp (first 10 characters only)\n" );

result = strncmp( string1, string2 , 10 );

if( result > 0 )

strcpy_s( tmp, sizeof(tmp), "greater than" );

else if( result < 0 )

strcpy_s( tmp, sizeof(tmp), "less than" );

else

strcpy_s( tmp, sizeof(tmp), "equal to" );

printf( "Result: String 1 is %s string 2\n\n", tmp );

printf( "Function: strnicmp _strnicmp (first 10 characters only)\n" );

result = _strnicmp( string1, string2, 10 );

if( result > 0 )

strcpy_s( tmp, sizeof(tmp), "greater than" );

else if( result < 0 )

strcpy_s( tmp, sizeof(tmp), "less than" );

else

strcpy_s( tmp, sizeof(tmp), "equal to" );

printf( "Result: String 1 is %s string 2\n", tmp );

Output

Compare strings:

The quick brown dog jumps over the lazy fox

The QUICK brown fox jumps over the lazy dog

Function: strncmp (first 10 characters only)

Result: String 1 is greater than string 2

Function: strnicmp _strnicmp (first 10 characters only)

Result: String 1 is equal to string 2

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbcmp, _mbsnbcmp_l

_mbsnbicmp, _mbsnbicmp_l

strcmp, wcscmp, _mbscmp

Функции strcoll

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


_strncnt , _wcsncnt , _mbsnbcnt ,
_mbsnbcnt_l , _mbsnccnt , _mbsnccnt_l
Статья • 03.04.2023

Возвращает число символов или байтов в пределах указанного количества.

) Важно!

_mbsnbcnt , _mbsnbcnt_l , _mbsnccnt и _mbsnccnt_l нельзя использовать в


приложениях, выполняемых в среде выполнения Windows. Дополнительные
сведения: Функции CRT, которые не поддерживаются в приложениях
универсальной платформы Windows.

Синтаксис
C

size_t _strncnt(

const char *str,

size_t count

);

size_t _wcsncnt(

const wchar_t *str,

size_t count

);

size_t _mbsnbcnt(

const unsigned char *str,

size_t count

);

size_t _mbsnbcnt_l(

const unsigned char *str,

size_t count,

_locale_t locale

);

size_t _mbsnccnt(

const unsigned char *str,

size_t count

);

size_t _mbsnccnt_l(

const unsigned char *str,

size_t count,

_locale_t locale

);

Параметры
str

Строка, которую необходимо проверить.

count

Число символов или байтов, которые нужно проверить в str .

locale

Используемый языковой стандарт.

Возвращаемое значение
_mbsnbcnt и _mbsnbcnt_l возвращают число байтов, найденных в первой части

count многобайтовых символов в str . _mbsnccnt и _mbsnccnt_l возвращают число


символов, найденных в первой части count байтов в str . Если до завершения
проверки str обнаружен пустой символ, они возвращают число байтов или
символов, найденных до нуль-символа. Если str состоит менее чем из count
символов или байтов, они возвращают число символов или байтов в строке. Если
count меньше нуля, они возвращают 0. В предыдущих версиях эти функции имели

возвращаемое значение типа int , а не size_t .

_strncnt возвращает количество символов в первых count байтах однобайтовой


строки str . _wcsncnt возвращает количество символов в первых count
расширенных символах строки расширенных символов str .

Комментарии
_mbsnbcnt и _mbsnbcnt_l подсчитывают число байтов, найденных в первой части

count многобайтовых символов в str . _mbsnbcnt и _mbsnbcnt_l заменяют mtob и


должны использоваться вместо mtob .

_mbsnccnt и _mbsnccnt_l подсчитывают число символов, найденных в первой части


count байтов в str . Если _mbsnccnt и _mbsnccnt_l возникает пустой символ во

втором байте двухбайтового символа, первый байт также считается пустым и не


включается в возвращаемое значение счетчика. _mbsnccnt и _mbsnccnt_l заменяют
btom и должны использоваться вместо btom .

Если str указатель NULL равен count 0, эти функции вызывают обработчик
недопустимых параметров, как описано в разделе "Проверка параметров", errno
имеет значение EINVAL , а функция возвращает значение 0.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


определены Определенные Определенные

_tcsnbcnt _strncnt _mbsnbcnt _wcsncnt

_tcsnccnt _strncnt _mbsnbcnt Недоступно

_wcsncnt Недоступно Недоступно _mbsnbcnt

_wcsncnt Недоступно Недоступно _mbsnccnt

Недоступно Недоступно _mbsnbcnt_l _mbsnccnt_l

Требования
Подпрограмма Обязательный заголовок

_mbsnbcnt <mbstring.h>

_mbsnbcnt_l <mbstring.h>

_mbsnccnt <mbstring.h>

_mbsnccnt_l <mbstring.h>

_strncnt <tchar.h>

_wcsncnt <tchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_mbsnbcnt.c

#include <mbstring.h>

#include <stdio.h>

int main( void )

unsigned char str[] = "This is a multibyte-character string.";

unsigned int char_count, byte_count;

char_count = _mbsnccnt( str, 10 );

byte_count = _mbsnbcnt( str, 10 );

if ( byte_count - char_count )

printf( "The first 10 characters contain %d multibyte characters\n",


char_count );

else

printf( "The first 10 characters are single-byte.\n");

Выходные данные
Output

The first 10 characters are single-byte.

См. также
Обработка строк

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbcat, _mbsnbcat_l
_strncoll , _wcsncoll , _mbsncoll ,
_strncoll_l , _wcsncoll_l , _mbsncoll_l
Статья • 03.04.2023

Сравнивает строки на основе данных языкового стандарта.

) Важно!

Функции _mbsncoll и _mbsncoll_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int _strncoll(

const char *string1,


const char *string2,
size_t count

);

int _wcsncoll(

const wchar_t *string1,

const wchar_t *string2,

size_t count

);

int _mbsncoll(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _strncoll_l(

const char *string1,


const char *string2,
size_t count,

_locale_t locale

);

int _wcsncoll_l(

const wchar_t *string1,

const wchar_t *string2,

size_t count,

_locale_t locale

);

int _mbsncoll_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

count

Число сравниваемых символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает значение, идентифицирующее отношение
между подстроками string1 и string2 , как показано ниже.

Возвращаемое значение Связь с string1 string2

<0 Значение string1 меньше string2 .

0 Функция string1 идентична функции string2 .

>0 Значение string1 больше значения string2 .

Каждая из этих функций возвращает _NLSCMPERROR . Чтобы использовать функцию


_NLSCMPERROR , включите STRING.h или MBSTRING.h. _wcsncoll может завершиться
ошибкой, если string1 или string2 содержит коды расширенных символов, не
входящие в последовательность сортировки. При возникновении ошибки
_wcsncoll может присвоить параметру errno значение EINVAL . Чтобы проверить

наличие ошибки при вызове _wcsncoll , установите значение errno 0, а затем


проверьте errno после _wcsncoll вызова.

Комментарии
Каждая из этих функций сравнивает с учетом регистра первые несколько символов
в строках string1 и string2 на основе кодовой страницы, используемой в данный
момент (количество сравниваемых символов определяется параметром count ).
Используйте эти функции только при наличии различий между порядком набора
символов и лексикографическим порядком символов на кодовой странице, а
также в том случае, если это различие имеет значение для сравнения строк.
Порядок символов в наборе зависит от языкового стандарта. В версиях этих
функций без суффикса _l используется текущий языковой стандарт, а в версиях с
суффиксом _l — переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

Все эти функции проверяют свои параметры. Если или string1 string2 является
пустым указателем или count больше INT_MAX , вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, эти функции возвращают _NLSCMPERROR и
устанавливают для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsnccoll _strncoll _mbsncoll _wcsncoll

_tcsncoll _strncoll _mbsnbcoll _wcsncoll

Требования
Подпрограмма Обязательный заголовок

_strncoll , _strncoll_l <string.h>

_wcsncoll , _wcsncoll_l <wchar.h> или <string.h>

_mbsncoll , _mbsncoll_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Локаль

Манипуляция со строками

Функции strcoll

localeconv

_mbsnbcoll, _mbsnbcoll_l, _mbsnbicoll, _mbsnbicoll_l

setlocale, _wsetlocale

strcmp, wcscmp, _mbscmp

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


strncpy , _strncpy_l , wcsncpy ,
_wcsncpy_l , _mbsncpy , _mbsncpy_l
Статья • 03.04.2023

Копируют символы одной строки в другую. Доступны более безопасные версии


этих функций; см. разделstrncpy_s , _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s,
_mbsncpy_s_l.

) Важно!

Функции _mbsncpy и _mbsncpy_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strncpy(

char *strDest,

const char *strSource,

size_t count

);

char *_strncpy_l(

char *strDest,

const char *strSource,

size_t count,

_locale_t locale

);

wchar_t *wcsncpy(

wchar_t *strDest,

const wchar_t *strSource,

size_t count

);

wchar_t *_wcsncpy_l(

wchar_t *strDest,

const wchar_t *strSource,

size_t count,

_locale_t locale

);

unsigned char *_mbsncpy(

unsigned char *strDest,

const unsigned char *strSource,

size_t count

);

unsigned char *_mbsncpy_l(

unsigned char *strDest,

const unsigned char *strSource,

size_t count,

_locale_t locale

);

template <size_t size>

char *strncpy(

char (&strDest)[size],

const char *strSource,

size_t count

); // C++ only

template <size_t size>

char *_strncpy_l(

char (&strDest)[size],

const char *strSource,

size_t count,

_locale_t locale

); // C++ only

template <size_t size>

wchar_t *wcsncpy(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count

); // C++ only

template <size_t size>

wchar_t *_wcsncpy_l(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count,

_locale_t locale

); // C++ only

template <size_t size>

unsigned char *_mbsncpy(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count

); // C++ only

template <size_t size>

unsigned char *_mbsncpy_l(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count,

_locale_t locale

); // C++ only

Параметры
strDest

Конечная строка.
strSource

Исходная строка.

count

Число копируемых символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает strDest . Нет зарезервированных возвращаемых значений для
указания ошибки.

Комментарии
Функция strncpy копирует первые несколько символов, количество которых
определяет параметр count , из строки strSource в строку strDest и возвращает
строку strDest . Если count значение меньше или равно длине , пустой
strSource символ не добавляется автоматически к скопированной строке. Если
значение count больше, чем длина строки strSource , строка назначения
заполняется символами null, пока ее длина не достигнет длины строки count . При
перекрытии исходного и конечного буферов поведение strncpy не определено.

) Важно!

strncpy не проверяет, достаточно ли места в строке strDest , в связи с чем

может возникнуть ошибка переполнения буфера. Аргумент count


ограничивает количество копируемых символов, но не влияет на размер
strDest . См. следующий пример. Дополнительные сведения см . в статье

Предотвращение переполнения буфера.

Если strDest или strSource является указателем NULL или меньше count или равно
нулю, вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если разрешается продолжать выполнение, эти функции
возвращают -1 и задают errno значение EINVAL .

Функции wcsncpy и _mbsncpy are wide-character и multibyte-character versions of


strncpy для расширенных и многобайтовых символов. Аргументы и возвращаемое
значение функций wcsncpy и _mbsncpy различаются соответственно. В остальном
эти шесть функций ведут себя идентично.

Версии этих функций с суффиксом _l идентичны, за исключением того, что для


поведения, зависящего от языкового стандарта, они используют переданный
параметр языкового стандарта вместо текущего языкового стандарта. Для
получения дополнительной информации см. Locale.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsncpy strncpy _mbsnbcpy wcsncpy

_tcsncpy_l _strncpy_l _mbsnbcpy_l _wcsncpy_l

7 Примечание

Функции _strncpy_l и _wcsncpy_l не зависят от языкового стандарта; они


предназначены только для функции _tcsncpy_l и не должны вызываться
напрямую.

Требования
Подпрограмма Обязательный заголовок

strncpy <string.h>

wcsncpy <string.h> либо <wchar.h>

_mbsncpy , _mbsncpy_l <mbstring.h>

Дополнительные сведения о совместимости платформ см. в разделе


Совместимость.
Пример
В следующем примере показано использование процедуры strncpy и способ ее
ошибочного применения, вызывающий ошибки и проблемы безопасности.
Компилятор создает предупреждение для каждого вызова ,
strncpy аналогичное crt_strncpy_x86.c(15) : предупреждение C4996: ' strncpy ': Эта

функция или переменная могут быть небезопасными. Вместо этого


рекомендуется использовать strncpy_s . Чтобы отключить устаревание,
используйте . _CRT_SECURE_NO_WARNINGS Дополнительные сведения см. в справке в
Интернете.

// crt_strncpy_x86.c

// Use this command in an x86 developer command prompt to compile:

// cl /TC /W3 crt_strncpy_x86.c

#include <stdio.h>

#include <string.h>

int main() {

char t[20];

char s[20];

char *p = 0, *q = 0;

strcpy_s(s, sizeof(s), "AA BB CC");

// Note: strncpy is deprecated; consider using strncpy_s instead

strncpy(s, "aa", 2); // "aa BB CC" C4996

strncpy(s + 3, "bb", 2); // "aa bb CC" C4996

strncpy(s, "ZZ", 3); // "ZZ", C4996

// count greater than strSource, null added

printf("%s\n", s);

strcpy_s(s, sizeof(s), "AA BB CC");

p = strstr(s, "BB");
q = strstr(s, "CC");
strncpy(s, "aa", p - s - 1); // "aa BB CC" C4996

strncpy(p, "bb", q - p - 1); // "aa bb CC" C4996

strncpy(q, "cc", q - s); // "aa bb cc" C4996

strncpy(q, "dd", strlen(q)); // "aa bb dd" C4996

printf("%s\n", s);

// some problems with strncpy

strcpy_s(s, sizeof(s), "test");

strncpy(t, "this is a very long string", 20 ); // C4996

// Danger: at this point, t has no terminating null,

// so the printf continues until it runs into one.

// In this case, it will print "this is a very long test"

printf("%s\n", t);

strcpy_s(t, sizeof(t), "dogs like cats");

printf("%s\n", t);

strncpy(t + 10, "to chase cars.", 14); // C4996

printf("%s\n", t);

// strncpy has caused a buffer overrun and corrupted string s

printf("Buffer overrun: s = '%s' (should be 'test')\n", s);

// Since the stack grows from higher to lower addresses, buffer


// overruns can corrupt function return addresses on the stack,
// which can be exploited to run arbitrary code.

Выходные данные

Output

ZZ

aa bb dd

this is a very long test

dogs like cats

dogs like to chase cars.

Buffer overrun: s = 'ars.' (should be 'test')

Макет автоматических переменных и уровень обнаружения ошибок и защиты кода


могут варьироваться в зависимости от изменения в параметрах компилятора.
Данный пример может дать иные результаты, если построить его в другой среде
компиляции или с другими параметрами компилятора.

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbcpy, _mbsnbcpy_l

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strcpy_s, wcscpy_s, _mbscpy_s


strncpy_s , _strncpy_s_l , wcsncpy_s ,
_wcsncpy_s_l , _mbsncpy_s , _mbsncpy_s_l
Статья • 03.04.2023

Копирует символы одной строки в другую. Эти версии strncpy, _strncpy_l, wcsncpy,
_wcsncpy_l, _mbsncpy, имеют _mbsncpy_l улучшения безопасности, как описано в
разделе Функции безопасности в CRT.

) Важно!

Функции _mbsncpy_s и _mbsncpy_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t strncpy_s(

char *strDest,

size_t numberOfElements,

const char *strSource,

size_t count

);

errno_t _strncpy_s_l(

char *strDest,

size_t numberOfElements,

const char *strSource,

size_t count,

_locale_t locale

);

errno_t wcsncpy_s(

wchar_t *strDest,

size_t numberOfElements,

const wchar_t *strSource,

size_t count

);

errno_t _wcsncpy_s_l(

wchar_t *strDest,

size_t numberOfElements,

const wchar_t *strSource,

size_t count,

_locale_t locale

);

errno_t _mbsncpy_s(

unsigned char *strDest,

size_t numberOfElements,

const unsigned char *strSource,

size_t count

);

errno_t _mbsncpy_s_l(

unsigned char *strDest,

size_t numberOfElements,

const unsigned char *strSource,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t strncpy_s(

char (&strDest)[size],

const char *strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _strncpy_s_l(

char (&strDest)[size],

const char *strSource,

size_t count,

_locale_t locale

); // C++ only

template <size_t size>

errno_t wcsncpy_s(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _wcsncpy_s_l(

wchar_t (&strDest)[size],

const wchar_t *strSource,

size_t count,

_locale_t locale

); // C++ only

template <size_t size>

errno_t _mbsncpy_s(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count

); // C++ only

template <size_t size>

errno_t _mbsncpy_s_l(

unsigned char (&strDest)[size],

const unsigned char *strSource,

size_t count,

_locale_t locale

); // C++ only

Параметры
strDest

Конечная строка.

numberOfElements

Размер конечной строки в символах.

strSource

Исходная строка.

count

Число копируемых символов или _TRUNCATE.

locale

Используемый языковой стандарт.

Возвращаемое значение
Ноль при успешном завершении, STRUNCATE , если произошло усечение, в
противном случае код ошибки.

Условия ошибок

strDest numberOfElements strSource Возвращаемое Содержимое strDest


значение

NULL any any EINVAL не изменено

any any NULL EINVAL strDest[0] имеет


значение 0;

any 0 any EINVAL не изменено

не NULL слишком мало any ERANGE strDest[0] имеет


значение 0;

Комментарии
Эти функции будут пытаться скопировать первые D символов strSource в strDest ,
где D  — наименьшее из count и длины strSource . Если эти D символы будут
помещаться в strDest (размер которого указан как numberOfElements ) и по-
прежнему оставлять место для признака конца NULL, эти символы копируются и
добавляется завершающее значение NULL; в противном случае устанавливается
значение NULL и strDest[0] вызывается обработчик недопустимых параметров,
как описано в разделе Проверка параметров.

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


_TRUNCATE , то копируется столько значений strSource , сколько вместится в strDest

, при этом остается место для завершающего значения NULL, которое всегда
добавляется.

Например, примененная к объекту директива

char dst[5];

strncpy_s(dst, 5, "a long string", 5);

означает, что strncpy_s копирует пять символов в 5-байтовый буфер. Эта копия не
оставляет места для конца null, поэтому strncpy_s обнуляет строку и вызывает
обработчик недопустимых параметров.

Если требуется усечение, используйте _TRUNCATE или ( size - 1):

strncpy_s(dst, 5, "a long string", _TRUNCATE);

strncpy_s(dst, 5, "a long string", 4);

В отличие от strncpy , если count значение больше длины strSource , конечная


строка НЕ заполняется символами NULL до длины count .

При перекрытии исходного и конечного буферов поведение strncpy_s не


определено.

Если параметр strDest или strSource имеет значение NULL или параметр
numberOfElements равен 0, вызывается обработчик недопустимого параметра. Если

выполнение может быть продолжено, функция возвращает EINVAL и устанавливает


для параметра errno значение EINVAL .

Функции wcsncpy_s и _mbsncpy_s are wide-character и multibyte-character versions of


strncpy_s для расширенных и многобайтовых символов. Аргументы и

возвращаемое значение wcsncpy_s для и mbsncpy_s различаются соответствующим


образом. В остальном эти шесть функций ведут себя идентично.
На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.
Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsncpy_s strncpy_s _mbsnbcpy_s wcsncpy_s

_tcsncpy_s_l _strncpy_s_l _mbsnbcpy_s_l _wcsncpy_s_l

7 Примечание

_strncpy_s_l _mbsncpy_s_l и _wcsncpy_s_l не имеют зависимости от языкового


стандарта. Они предоставляются только для _tcsncpy_s_l и не предназначены
для вызова напрямую.

Требования
Подпрограмма Обязательный заголовок

strncpy_s , _strncpy_s_l <string.h>


Подпрограмма Обязательный заголовок

wcsncpy_s , _wcsncpy_s_l <string.h> либо <wchar.h>

_mbsncpy_s , _mbsncpy_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример. Копирование символов в буфер


C++

// crt_strncpy_s_1.cpp

// compile with: /MTd

// these #defines enable secure template overloads

// (see last part of Examples() below)

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <crtdbg.h> // For _CrtSetReportMode

#include <errno.h>

// This example uses a 10-byte destination buffer.

errno_t strncpy_s_tester( const char * src,

int count )

char dest[10];

printf( "\n" );

if ( count == _TRUNCATE )

printf( "Copying '%s' to %d-byte buffer dest with truncation


semantics\n",

src, _countof(dest) );

else

printf( "Copying %d chars of '%s' to %d-byte buffer dest\n",

count, src, _countof(dest) );

errno_t err = strncpy_s( dest, _countof(dest), src, count );

printf( " new contents of dest: '%s'\n", dest );

return err;

void Examples()

strncpy_s_tester( "howdy", 4 );

strncpy_s_tester( "howdy", 5 );

strncpy_s_tester( "howdy", 6 );

printf( "\nDestination buffer too small:\n" );

strncpy_s_tester( "Hi there!!", 10 );

printf( "\nTruncation examples:\n" );

errno_t err = strncpy_s_tester( "How do you do?", _TRUNCATE );

printf( " truncation %s occur\n", err == STRUNCATE ? "did"

: "did not" );

err = strncpy_s_tester( "Howdy.", _TRUNCATE );

printf( " truncation %s occur\n", err == STRUNCATE ? "did"

: "did not" );

printf( "\nSecure template overload example:\n" );

char dest[10];

strncpy( dest, "very very very long", 15 );

// With secure template overloads enabled (see #defines at

// top of file), the preceding line is replaced by

// strncpy_s( dest, _countof(dest), "very very very long", 15 );

// Instead of causing a buffer overrun, strncpy_s invokes

// the invalid parameter handler.

// If secure template overloads were disabled, strncpy would

// copy 15 characters and overrun the dest buffer.

printf( " new contents of dest: '%s'\n", dest );

void myInvalidParameterHandler(

const wchar_t* expression,

const wchar_t* function,

const wchar_t* file,


unsigned int line,

uintptr_t pReserved)
{

wprintf(L"Invalid parameter handler invoked: %s\n", expression);

int main( void )

_invalid_parameter_handler oldHandler, newHandler;

newHandler = myInvalidParameterHandler;

oldHandler = _set_invalid_parameter_handler(newHandler);

// Disable the message box for assertions.

_CrtSetReportMode(_CRT_ASSERT, 0);

Examples();

Output

Copying 4 chars of 'howdy' to 10-byte buffer dest

new contents of dest: 'howd'

Copying 5 chars of 'howdy' to 10-byte buffer dest

new contents of dest: 'howdy'

Copying 6 chars of 'howdy' to 10-byte buffer dest

new contents of dest: 'howdy'

Destination buffer too small:

Copying 10 chars of 'Hi there!!' to 10-byte buffer dest

Invalid parameter handler invoked: (L"Buffer is too small" && 0)

new contents of dest: ''

Truncation examples:

Copying 'How do you do?' to 10-byte buffer dest with truncation semantics

new contents of dest: 'How do yo'

truncation did occur

Copying 'Howdy.' to 10-byte buffer dest with truncation semantics

new contents of dest: 'Howdy.'

truncation did not occur

Secure template overload example:


Invalid parameter handler invoked: (L"Buffer is too small" && 0)

new contents of dest: ''

Пример: strncpy и strncpy_s


C

// crt_strncpy_s_2.c

// contrasts strncpy and strncpy_s

#include <stdio.h>

#include <stdlib.h>

int main( void )

char a[20] = "test";

char s[20];

// simple strncpy usage:

strcpy_s( s, 20, "dogs like cats" );

printf( "Original string:\n '%s'\n", s );

// Here we can't use strncpy_s since we don't

// want null termination

strncpy( s, "mice", 4 );

printf( "After strncpy (no null-termination):\n '%s'\n", s );

strncpy( s+5, "love", 4 );

printf( "After strncpy into middle of string:\n '%s'\n", s );

// If we use strncpy_s, the string is terminated

strncpy_s( s, _countof(s), "mice", 4 );

printf( "After strncpy_s (with null-termination):\n '%s'\n", s );

Output

Original string:

'dogs like cats'

After strncpy (no null-termination):

'mice like cats'

After strncpy into middle of string:

'mice love cats'

After strncpy_s (with null-termination):

'mice'

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbcpy, _mbsnbcpy_l

strcat_s, wcscat_s, _mbscat_s

strcmp, wcscmp, _mbscmp

strcpy_s, wcscpy_s, _mbscpy_s

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


_strnextc , _wcsnextc , _mbsnextc ,
_mbsnextc_l
Статья • 03.04.2023

Находит следующий символ в строке.

) Важно!

Функции _mbsnextc и _mbsnextc_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

unsigned int _strnextc(


const char *str

);

unsigned int _wcsnextc(


const wchar_t *str

);

unsigned int _mbsnextc(


const unsigned char *str

);

unsigned int _mbsnextc_l(

const unsigned char *str,

_locale_t locale

);

Параметры
str

Исходная строка.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает целочисленное значение для следующего
символа в str .

Комментарии
Функция _mbsnextc возвращает целочисленное значение следующего
многобайтового символа в str , не перемещая указатель на строку. Функция
_mbsnextc распознает последовательности многобайтовых символов в
соответствии с текущей многобайтовой кодовой страницей.

Если str имеет значение NULL , вызывается обработчик недопустимых параметров,


как описано в разделе Проверка параметров. Если выполнение может быть
продолжено, параметр errno устанавливается в значение EINVAL и функция
возвращает значение 0.

Примечание о безопасности. Эти функции представляют потенциальную угрозу,


связанную с проблемой переполнения буфера. Проблемы переполнения буфера
— это распространенный метод атак на системы, который приводит к
несанкционированному повышению уровня прав. Дополнительные сведения см . в
статье Предотвращение переполнения буфера.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsnextc _strnextc _mbsnextc _wcsnextc

_strnextc и _wcsnextc — это однобайтовые и расширенные версии _mbsnextc строк.

_wcsnextc возвращает целочисленное значение следующего расширенного

символа в str ; _strnextc возвращает целочисленное значение следующего


однобайтового символа в str . _strnextc и _wcsnextc предоставляются только для
этого сопоставления и не должны использоваться в противном случае.
Дополнительные сведения см. в разделах Использование сопоставлений
универсального текста и Сопоставления универсального текста.
_mbsnextc_l идентична указанной за исключением того, что использует языковой

стандарт, переданный в качестве параметра. Для получения дополнительной


информации см. Locale.

Требования
Подпрограмма Обязательный заголовок

_mbsnextc <mbstring.h>

_mbsnextc_l <mbstring.h>

_strnextc <tchar.h>

_wcsnextc <tchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_strdec, _wcsdec, _mbsdec, _mbsdec_l

_strinc, _wcsinc, _mbsinc, _mbsinc_l

_strninc, _wcsninc, _mbsninc, _mbsninc_l


strnicmp , wcsnicmp
Статья • 03.04.2023

Имена strnicmp функций, зависящие от Корпорации Майкрософт, и wcsnicmp


являются устаревшими псевдонимами для _strnicmp функций и _wcsnicmp функций.
По умолчанию они создают предупреждение компилятора (уровень 3) C4996.
Имена являются устаревшими, так как они не соответствуют стандартным
правилам C для имен, относящихся к реализации. Однако функции по-прежнему
поддерживаются.

Мы рекомендуем использовать _strnicmp и _wcsnicmp вместо этого. Вы также


можете продолжать использовать эти имена функций и отключить
предупреждение. Дополнительные сведения см. в разделе "Отключение имен
предупреждений и функций POSIX".
_strnicmp , _wcsnicmp , _mbsnicmp ,
_strnicmp_l , _wcsnicmp_l , _mbsnicmp_l
Статья • 03.04.2023

Сравнивает указанное количество символов двух строк без учета регистра.

) Важно!

Функции _mbsnicmp и _mbsnicmp_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int _strnicmp(

const char *string1,


const char *string2,
size_t count

);

int _wcsnicmp(

const wchar_t *string1,

const wchar_t *string2,

size_t count

);

int _mbsnicmp(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _strnicmp_l(

const char *string1,


const char *string2,
size_t count,

_locale_t locale

);

int _wcsnicmp_l(

const wchar_t *string1,

const wchar_t *string2,

size_t count,

_locale_t locale

);

int _mbsnicmp_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения.

count

Число сравниваемых символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Отражает связь между подстроками указанным ниже образом.

Возвращаемое значение Описание

<0 Подстрока string1 меньше, чем подстрока string2 .

0 Подстрока string1 идентична подстроке string2 .

>0 Подстрока string1 больше, чем подстрока string2 .

При ошибке проверки параметров возвращаются _NLSCMPERROR эти функции,


определенные в <string.h> и <mbstring.h>.

Комментарии
Функция _strnicmp сравнивает не более первых count символов string1 и string2 .
Сравнение выполняется без учета регистра путем преобразования каждого
символа в нижний регистр. _strnicmp — не чувствительная к регистру версия
strncmp . Сравнение заканчивается, если был достигнут завершающий нуль-символ
в любой из строк до того, как были сравнены count симв. Если строки равны, когда
завершающий нуль-символ достигается в любой из строк до того, как count симв.
сравнены, более короткая строка считается меньшей.
Символы от 91 до 96 в таблице ASCII ("[", "\", "]", "^", "_" и "`") оцениваются как
меньшие по сравнению с любым алфавитным символом. Такое упорядочение
идентично используемому функцией stricmp .

Функции _wcsnicmp и _mbsnicmp are wide-character и multibyte-character versions of


_strnicmp для расширенных и многобайтовых символов. Аргументы являются

строками _wcsnicmp расширенных символов. Аргументы _mbsnicmp являются


многобайтовыми строками. _mbsnicmp распознает последовательности
многобайтовых символов в соответствии с текущей многобайтовой кодовой
страницей и возвращает _NLSCMPERROR при ошибке. Дополнительные сведения см.
на страницах кода. В остальном эти три функции ведут себя идентично. На эти
функции влияет настройка языкового стандарта: версии без суффикса _l
используют текущий языковой стандарт для зависящего от языкового стандарта
поведения; версии с суффиксом _l используют переданный в них параметр
locale . Для получения дополнительной информации см. Locale.

Все эти функции проверяют свои параметры. Если какой-либо string1 или string2
является пустым указателем, вызывается обработчик недопустимых параметров,
как описано в разделе "Проверка параметров". Если продолжение выполнения
разрешено, эти функции возвращают _NLSCMPERROR и устанавливают для errno
значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsncicmp _strnicmp _mbsnicmp _wcsnicmp

_tcsnicmp _strnicmp _mbsnbicmp _wcsnicmp

_tcsncicmp_l _strnicmp_l _mbsnicmp_l _wcsnicmp_l

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_strnicmp , _strnicmp_l <string.h>

_wcsnicmp , _wcsnicmp_l <string.h> или <wchar.h>

_mbsnicmp , _mbsnicmp_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для strncmp.

См. также раздел


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

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


_strnicoll , _wcsnicoll , _mbsnicoll ,
_strnicoll_l , _wcsnicoll_l ,
_mbsnicoll_l
Статья • 03.04.2023

Сравнивает строки на основе данных языкового стандарта.

) Важно!

Функции _mbsnicoll и _mbsnicoll_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

int _strnicoll(

const char *string1,


const char *string2,
size_t count

);

int _wcsnicoll(

const wchar_t *string1,

const wchar_t *string2 ,

size_t count

);

int _mbsnicoll(

const unsigned char *string1,

const unsigned char *string2,

size_t count

);

int _strnicoll_l(

const char *string1,


const char *string2,
size_t count,

_locale_t locale

);

int _wcsnicoll_l(

const wchar_t *string1,

const wchar_t *string2 ,

size_t count,

_locale_t locale

);

int _mbsnicoll_l(

const unsigned char *string1,

const unsigned char *string2,

size_t count,

_locale_t locale

);

Параметры
string1 , string2

Строки с завершающим нулем для сравнения

count

Количество символов для сравнения

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих функций возвращает значение, которое соответствует отношению
между подстроками string1 и string2 , как показано ниже.

Возвращаемое значение Отношение string1 к string2

<0 string1 меньше string2

0 string1 идентично string2

>0 string1 больше string2

Каждая из этих функций возвращает _NLSCMPERROR . Чтобы использовать функцию


_NLSCMPERROR , включите STRING.H или MBSTRING.H. _wcsnicoll может завершиться
ошибкой, если string1 или string2 содержит коды расширенных символов, не
входящие в последовательность сортировки. При возникновении ошибки
_wcsnicoll может присвоить параметру errno значение EINVAL . Чтобы убедиться,

не возникает ли ошибка при вызове функции _wcsnicoll , присвойте параметру


errno значение 0 и проверьте errno после вызова функции _wcsnicoll .

Комментарии
Каждая из этих функций сравнивает с учетом регистра первые несколько символов
в строках string1 и string2 на основе кодовой страницы (количество
сравниваемых символов определяется параметром count ). Эти функции следует
использовать только в том случае, если имеется разница между порядком набора
символов и лексографическим порядком символов на кодовой странице, и это
различие представляет интерес для сравнения строк. Версии этих функций без
суффикса _l используют текущий языковой стандарт и кодовую страницу. Версии с
суффиксом _l идентичны, за исключением того, что они используют переданный
языковой стандарт. Для получения дополнительной информации см. Locale.

Все эти функции проверяют свои параметры. Если какой-либо string1 или string2
является пустым указателем, или если число больше INT_MAX , вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров ". Если продолжение выполнения разрешено, эти функции
возвращают _NLSCMPERROR и устанавливают для errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsncicoll _strnicoll _mbsnbicoll _wcsnicoll

_tcsnicoll _strnicoll _mbsnbicoll _wcsnicoll

_tcsnicoll_l _strnicoll_l _mbsnbicoll_l _wcsnicoll_l

Требования
Подпрограмма Обязательный заголовок

_strnicoll , _strnicoll_l <string.h>

_wcsnicoll , _wcsnicoll_l <wchar.h> или <string.h>

_mbsnicoll , _mbsnicoll_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Локаль

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

Функции strcoll

localeconv

_mbsnbcoll, _mbsnbcoll_l, _mbsnbicoll, _mbsnbicoll_l

setlocale, _wsetlocale

strcmp, wcscmp, _mbscmp

_stricmp, _wcsicmp, _mbsicmp, _stricmp_l, _wcsicmp_l, _mbsicmp_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l


_strninc , _wcsninc , _mbsninc ,
_mbsninc_l
Статья • 03.04.2023

Перемещает указатель строки на n символов.

) Важно!

Функции _mbsninc и _mbsninc_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strninc(

const char *str,

size_t count

);

wchar_t *_wcsninc(

const wchar_t *str,

size_t count

);

unsigned char *_mbsninc(

const unsigned char *str,

size_t count

);

unsigned char *_mbsninc(

const unsigned char *str,

size_t count,

_locale_t locale

);

Параметры
str

Исходная строка.

count

Количество символов, на которые увеличивается указатель на строку.


locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм возвращает указатель на str после того, как str был
увеличен на count символов, или NULL , если предоставленный указатель имеет
значение NULL . Если значение параметра count больше или равно количеству
символов в str , результат не определен.

Комментарии
Функция _mbsninc увеличивает str на count многобайтовых символов. Функция
_mbsninc распознает последовательности многобайтовых символов в соответствии

с текущей многобайтовой кодовой страницей.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsninc _strninc _mbsninc _wcsninc

_strninc и _wcsninc являются однобайтовыми и расширенными версиями

_mbsninc строк. _wcsninc и _strninc предоставляются только для этого


сопоставления и не должны использоваться в противном случае. Дополнительные
сведения см. в разделе "Использование универсальных текстовых сопоставлений и
универсальных текстовых сопоставлений".

_mbsninc_l идентична указанной за исключением того, что использует языковой

стандарт, переданный в качестве параметра. Для получения дополнительной


информации см. Locale.

Требования
Подпрограмма Обязательный заголовок

_mbsninc <mbstring.h>

_mbsninc_l <mbstring.h>

_strninc <tchar.h>

_wcsninc <tchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


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

Локаль

Интерпретация последовательностей многобайтовых символов

_strdec, _wcsdec, _mbsdec, _mbsdec_l

_strinc, _wcsinc, _mbsinc, _mbsinc_l

_strnextc, _wcsnextc, _mbsnextc, _mbsnextc_l


strnlen , strnlen_s , wcsnlen , wcsnlen_s ,
_mbsnlen , _mbsnlen_l , _mbstrnlen ,
_mbstrnlen_l
Статья • 03.04.2023

Получает длину строки, используя текущий или переданный в функцию языковой


стандарт. Эти функции являются более безопасными strlenверсиями , wcslen,
_mbslen, _mbslen_l, _mbstrlen, . _mbstrlen_l

) Важно!

_mbsnlen , _mbsnlen_l , _mbstrnlen и _mbstrnlen_l нельзя использовать в

приложениях, которые выполняются в среда выполнения Windows.


Дополнительные сведения: Функции CRT, которые не поддерживаются в
приложениях универсальной платформы Windows.

Синтаксис
C

size_t strnlen(

const char *str,

size_t numberOfElements

);

size_t strnlen_s(

const char *str,

size_t numberOfElements

);

size_t wcsnlen(

const wchar_t *str,

size_t numberOfElements

);

size_t wcsnlen_s(

const wchar_t *str,

size_t numberOfElements

);

size_t _mbsnlen(

const unsigned char *str,

size_t numberOfElements

);

size_t _mbsnlen_l(

const unsigned char *str,

size_t numberOfElements,

_locale_t locale

);

size_t _mbstrnlen(

const char *str,

size_t numberOfElements

);

size_t _mbstrnlen_l(

const char *str,

size_t numberOfElements,

_locale_t locale

);

Параметры
str

Строка, завершающаяся символом NULL.

numberOfElements

Размер строкового буфера.

locale

Используемый языковой стандарт.

Возвращаемое значение
Эти функции возвращают число символов в строке, не включая завершающий
символ NULL. Если в первых numberOfElements байтах строки (или расширенных
символов для wcsnlen ), numberOfElements то возвращается, чтобы указать условие
ошибки; строки, заканчивающиеся NULL, имеют длину строго меньше
numberOfElements .

_mbstrnlen и _mbstrnlen_l возвращают значение -1, если строка содержит


недопустимый многобайтовый символ.

Комментарии

7 Примечание

strnlen не является заменой strlen ; функция strnlen предназначена только

для вычисления размера входящих недоверенных данных в буфере известного


размера, например в сетевом пакете. strnlen вычисляет длину, но не выходит
за конец буфера, если строка не определена. В других ситуациях используйте
strlen . (Это также применимо к функциям wcsnlen , _mbsnlen и _mbstrnlen .)

Каждая из этих функций возвращает число символов в str , не включая


завершающий символ NULL. Однако strnlen и strnlen_s интерпретируют строку
как строку однобайтовых символов, поэтому возвращаемое значение всегда равно
числу байт, даже если строка содержит многобайтовые символы. wcsnlen и
wcsnlen_s являются версиями strnlen и strnlen_s с расширенными символами;
аргументы для wcsnlen и wcsnlen_s — строками расширенных символов, а число
символов выражается в единицах расширенных символов. В противном случае
поведение wcsnlen и strnlen идентично, как и strnlen_s и wcsnlen_s .

strnlen , wcsnlen и _mbsnlen не проверяют свои параметры. Если значение

параметра str — NULL , возникает нарушение доступа.

Функции strnlen_s и wcsnlen_s проверяют свои параметры. Если значение


параметра str — NULL , функция возвращает значение 0.

_mbstrnlen также проверяет свои параметры. Если str имеет значение NULL или

больше numberOfElements , _mbstrnlen создает INT_MAX исключение недопустимого


параметра, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, _mbstrnlen задает для errno значение EINVAL и
возвращает значение -1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcsnlen strnlen strnlen wcsnlen

_tcscnlen strnlen _mbsnlen wcsnlen

_tcscnlen_l strnlen _mbsnlen_l wcsnlen

_mbsnlen и _mbstrnlen возвращают число многобайтовых символов в строке

многобайтовых символов. _mbsnlen распознает последовательности


многобайтовых символов в соответствии с многобайтовой кодовой страницей,
которая используется в данный момент, или в соответствии с переданным
языковым стандартом; Не проверяется допустимость многобайтовых символов.
_mbstrnlen проверяет допустимость многобайтовых символов и распознает их

последовательности. Если строка, передаваемая в _mbstrnlen , содержит


недопустимый многобайтовый символ, для errno задается значение EILSEQ .

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
идентичны за исключением того, что версии без суффикса _l используют текущий
языковой стандарт для этого поведения, зависимого от языкового стандарта, а
версии с суффиксом _l — параметр языкового стандарта, переданный в функцию.
Для получения дополнительной информации см. Locale.

Требования
Подпрограмма Обязательный заголовок

strnlen , strnlen_s <string.h>

wcsnlen , wcsnlen_s <string.h> либо <wchar.h>

_mbsnlen , _mbsnlen_l <mbstring.h>

_mbstrnlen , _mbstrnlen_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strnlen.c

#include <string.h>

int main()

// str1 is 82 characters long. str2 is 159 characters long

char* str1 = "The length of a string is the number of characters\n"

"excluding the terminating null.";

char* str2 = "strnlen takes a maximum size. If the string is longer\n"

"than the maximum size specified, the maximum size is\n"

"returned rather than the actual size of the string.";

size_t len;

size_t maxsize = 100;

len = strnlen(str1, maxsize);

printf("%s\n Length: %d \n\n", str1, len);

len = strnlen(str2, maxsize);

printf("%s\n Length: %d \n", str2, len);

Output

The length of a string is the number of characters

excluding the terminating null.

Length: 82

strnlen takes a maximum size. If the string is longer

than the maximum size specified, the maximum size is

returned rather than the actual size of the string.

Length: 100

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

setlocale, _wsetlocale

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

Функции strcoll

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strnset , wcsnset
Статья • 03.04.2023

Имена strnset функций, зависящие от Корпорации Майкрософт, и wcsnset


являются устаревшими псевдонимами для _strnset функций и _wcsnset функций. По
умолчанию они создают предупреждение компилятора (уровень 3) C4996. Имена
являются устаревшими, так как они не соответствуют стандартным правилам C для
имен, относящихся к реализации. Однако функции по-прежнему поддерживаются.

Вместо этого рекомендуется использовать _strnset и _wcsnset функции, улучшенные


_strnset_s с _wcsnset_s точки зрения безопасности. Вы также можете продолжать
использовать эти имена функций и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_strnset , _strnset_l , _wcsnset ,
_wcsnset_l , _mbsnset , _mbsnset_l
Статья • 03.04.2023

Инициализирует символы строки в конкретный символ. Существуют более


безопасные версии этих функций; see _strnset_s, _strnset_s_l_wcsnset_s, _wcsnset_s_l,
_mbsnset_s_mbsnset_s_l.

) Важно!

Функции _mbsnset и _mbsnset_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strnset(

char *str,

int c,

size_t count

);

char *_strnset_l(

char *str,

int c,

size_t count,

_locale_t locale

);

wchar_t *_wcsnset(

wchar_t *str,

wchar_t c,

size_t count

);

wchar_t *_wcsnset_l(

wchar_t *str,

wchar_t c,

size_t count,

_locale_t locale

);

unsigned char *_mbsnset(

unsigned char *str,

unsigned int c,

size_t count

);

unsigned char *_mbsnset_l(

unsigned char *str,

unsigned int c,

size_t count,

_locale_t locale

);

Параметры
str

Строка, которую требуется изменить.

Параметр символов.

count

Количество символов для изменения.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на измененную строку.

Комментарии
Функция _strnset устанавливает count первых символов строки str в значение c
(преобразованное в char ). Если значение count больше длины строки str , вместо
параметра count используется длина строки str .

Функции _wcsnset и _mbsnset are wide-character и multibyte-character versions of


_strnset для расширенных и многобайтовых символов. Аргументы строки и

возвращаемые значения _wcsnset являются строками расширенных символов.


Аргументы строки и возвращаемые значения _mbsnset являются многобайтовыми
строками. В остальном эти три функции ведут себя идентично.

_mbsnset проверяет его параметры; Значение , если str является пустым


указателем, вызывается обработчик недопустимых параметров, как описано в
разделе "Проверка параметров ". Если выполнение может быть продолжено,
функция _mbsnset возвращает значение NULL и устанавливает параметр errno в
значение EINVAL . _strnset и _wcsnset не проверяйте их параметры.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsnset _strnset _mbsnbset _wcsnset

_tcsnset_l _strnset_l _mbsnbset_l _wcsnset_l

Требования
Подпрограмма Обязательный заголовок

_strnset <string.h>

_strnset_l <tchar.h>

_wcsnset <string.h> или <wchar.h>

_wcsnset_l <tchar.h>

_mbsnset , _mbsnset_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_strnset.c

// compile with: /W3

#include <string.h>

#include <stdio.h>

int main( void )

char string[15] = "This is a test";

/* Set not more than 4 characters of string to be *'s */

printf( "Before: %s\n", string );

_strnset( string, '*', 4 ); // C4996

// Note: _strnset is deprecated; consider using _strnset_s

printf( "After: %s\n", string );

Output

Before: This is a test

After: **** is a test

См. также раздел


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

Локаль

Интерпретация последовательностей многобайтовых символов

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l


_strnset_s , _strnset_s_l , _wcsnset_s ,
_wcsnset_s_l , _mbsnset_s , _mbsnset_s_l
Статья • 03.04.2023

Инициализирует символы строки в конкретный символ. Эти версии _strnset,


_strnset_l, _wcsnset, _wcsnset_l, _mbsnset, имеют _mbsnset_l улучшения безопасности,
как описано в разделе Функции безопасности в CRT.

) Важно!

Функции _mbsnset_s и _mbsnset_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t _strnset_s(

char *str,

size_t numberOfElements,

int c,

size_t count

);

errno_t _strnset_s_l(

char *str,

size_t numberOfElements,

int c,

size_t count,

_locale_t locale

);

errno_t _wcsnset_s(

wchar_t *str,

size_t numberOfElements,

wchar_t c,

size_t count

);

errno_t _wcsnset_s_l(

wchar_t *str,

size_t numberOfElements,

wchar_t c,

size_t count,

_locale_t locale

);

errno_t _mbsnset_s(

unsigned char *str,

size_t numberOfElements,

unsigned int c,

size_t count

);

errno_t _mbsnset_s_l(

unsigned char *str,

size_t numberOfElements,

unsigned int c,

size_t count,

_locale_t locale

);

Параметры
str

Строка, которую требуется изменить.

numberOfElements

Размер буфера str .

Параметр символов.

count

Количество символов для изменения.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успешного выполнения; в противном случае — код ошибки.

Эти функции проверяют свои аргументы. Если str не является допустимой


строкой, заканчивающейся null, или аргумент size меньше или равен 0, вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если продолжение выполнения разрешено, эти функции возвращают
код ошибки и устанавливают этот код ошибки в качестве значения для errno . Код
ошибки по умолчанию — если EINVAL не применяется более конкретное значение.
Комментарии
Эти функции в основном устанавливают первые символы count str в c . Если
значение count больше размера str , то вместо параметра count используется
размер str . Если count больше, чем numberOfElements , и оба этих параметра
больше, чем размер str , возникает ошибка.

Функции _wcsnset_s и _mbsnset_s are wide-character и multibyte-character versions of


_strnset_s для расширенных и многобайтовых символов. Строковый аргумент

является строкой из расширенных _wcsnset_s символов, а _mbsnset_s аргумент —


многобайтовой строкой. В остальном эти три функции ведут себя идентично.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsnset_s _strnset_s _mbsnbset_s _wcsnset_s

_tcsnset_s_l _strnset_s_l _mbsnbset_s_l _wcsnset_s_l

Требования
Подпрограмма Обязательный заголовок

_strnset_s <string.h>

_strnset_s_l <tchar.h>
Подпрограмма Обязательный заголовок

_wcsnset_s <string.h> или <wchar.h>

_wcsnset_s_l <tchar.h>

_mbsnset_s , _mbsnset_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strnset_s.c

#include <string.h>

#include <stdio.h>

int main( void )

char string[15] = "This is a test";

/* Set not more than 4 characters of string to be *'s */

printf( "Before: %s\n", string );

_strnset_s( string, sizeof(string), '*', 4 );

printf( "After: %s\n", string );

Output

Before: This is a test

After: **** is a test

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l


strpbrk , wcspbrk , _mbspbrk , _mbspbrk_l
Статья • 03.04.2023

Сканирует строки на наличие символов в указанных наборах символов.

) Важно!

Функции _mbspbrk и _mbspbrk_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strpbrk(

const char *str,

const char *strCharSet

); // C only

char *strpbrk(

char *str,

const char *strCharSet

); // C++ only

const char *strpbrk(

const char *str,

const char *strCharSet

); // C++ only

wchar_t *wcspbrk(

const wchar_t *str,

const wchar_t *strCharSet

); // C only

wchar_t *wcspbrk(

wchar_t *str,

const wchar_t *strCharSet

); // C++ only

const wchar_t *wcspbrk(

const wchar_t *str,

const wchar_t *strCharSet

); // C++ only

unsigned char *_mbspbrk(

const unsigned char *str,

const unsigned char *strCharSet

); // C only

unsigned char *_mbspbrk(

unsigned char *str,

const unsigned char *strCharSet

); // C++ only

const unsigned char *_mbspbrk(

const unsigned char *str,

const unsigned char *strCharSet

); // C++ only

unsigned char *_mbspbrk_l(

const unsigned char *str,

const unsigned char *strCharSet,

_locale_t locale

); // C only

unsigned char *_mbspbrk_l(

unsigned char *str,

const unsigned char *strCharSet,

_locale_t locale

); // C++ only

const unsigned char *_mbspbrk_l(

const unsigned char *str,

const unsigned char* strCharSet,

_locale_t locale

); // C++ only

Параметры
str

Строка для поиска, завершающаяся символом NULL.

strCharSet

Набор символов, завершающийся символом NULL.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на первое вхождение любого символа из strCharSet в str
или указатель NULL , если у двух строк нет общих символов.

Комментарии
Функция strpbrk возвращает указатель на первое вхождение в str символа из
набора символов strCharSet . Поиск не включает завершающий символ NULL.

Функции wcspbrk и _mbspbrk are wide-character и multibyte-character versions of


strpbrk для расширенных и многобайтовых символов. Аргументы и возвращаемое
значение являются wcspbrk строками расширенных символов. Аргументы и
возвращаемое значение являются _mbspbrk многобайтовыми строками символов.

_mbspbrk проверяет свои параметры. Если str или strCharSet имеет значение

NULL , вызывается обработчик недопустимых параметров, как описано в разделе


Проверка параметров. Если выполнение может быть продолжено, функция
_mbspbrk возвращает значение NULL и устанавливает параметр errno в значение

EINVAL . strpbrk и wcspbrk не проверяют свои параметры. В остальном эти три


функции ведут себя идентично.

_mbspbrk похож на , _mbscspn за исключением того, что _mbspbrk возвращает


указатель, а не значение типа size_t.

В языке C эти функции принимают указатель const в качестве первого аргумента. В


языке C++ доступны две перегрузки. Перегрузка, принимающая указатель на
const , возвращает указатель на const ; версия, которая принимает указатель на не-

const , возвращает указатель на не- const . Макрос _CRT_CONST_CORRECT_OVERLOADS


определяется, const если доступны и версии, не const являющиеся версиями этих
функций. Если для обеих перегрузок C++ требуется поведение, отличное const от ,
определите символ _CONST_RETURN .

На выходное значение влияет параметр LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделе setlocale. В версиях этих функций без
суффикса _l используется текущий языковой стандарт для поведения, которое
зависит от языкового стандарта. Версия с суффиксом _l идентична, однако в ней
используется языковой стандарт, переданный в качестве параметра. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcspbrk strpbrk _mbspbrk wcspbrk

Недоступно Недоступно _mbspbrk_l Недоступно

Требования
Подпрограмма Обязательный заголовок

strpbrk <string.h>

wcspbrk <string.h> или <wchar.h>

_mbspbrk , _mbspbrk_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_strpbrk.c

#include <string.h>

#include <stdio.h>

int main( void )

char string[100] = "The 3 men and 2 boys ate 5 pigs\n";

char *result = NULL;

// Return pointer to first digit in "string".

printf( "1: %s\n", string );

result = strpbrk( string, "0123456789" );

printf( "2: %s\n", result++ );

result = strpbrk( result, "0123456789" );

printf( "3: %s\n", result++ );

result = strpbrk( result, "0123456789" );

printf( "4: %s\n", result );

Output

1: The 3 men and 2 boys ate 5 pigs

2: 3 men and 2 boys ate 5 pigs

3: 2 boys ate 5 pigs

4: 5 pigs

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcspn, wcscspn, _mbscspn, _mbscspn_l

strchr, wcschr, _mbschr, _mbschr_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l


strrchr , wcsrchr , _mbsrchr , _mbsrchr_l
Статья • 03.04.2023

Ищет последнее вхождение символа в строке.

) Важно!

Функции _mbsrchr и _mbsrchr_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strrchr(

const char *str,

int c

); // C only

char *strrchr(

char *str,

int c

); // C++ only

const char *strrchr(

const char *str,

int c

); // C++ only

wchar_t *wcsrchr(

const wchar_t *str,

wchar_t c

); // C only

wchar_t *wcsrchr(

wchar_t *str,

wchar_t c

); // C++ only

const wchar_t *wcsrchr(

const wchar_t *str,

wchar_t c

); // C++ only

unsigned char *_mbsrchr(

const unsigned char *str,

unsigned int c

); // C only

unsigned char *_mbsrchr(

unsigned char *str,

unsigned int c

); // C++ only

const unsigned char *_mbsrchr(

const unsigned char *str,

unsigned int c

); // C++ only

unsigned char *_mbsrchr_l(

const unsigned char *str,

unsigned int c,

_locale_t locale

); // C only

unsigned char *_mbsrchr_l(

unsigned char *str,

unsigned int c,

_locale_t locale

); // C++ only

const unsigned char *_mbsrchr_l(

const unsigned char *str,

unsigned int c,

_locale_t locale

); // C++ only

Параметры
str

Строка для поиска, завершающаяся символом NULL.

Символ, который требуется найти.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на последнее вхождение c в str или , NULL если c не
найден.

Комментарии
Функция strrchr находит последнее вхождение c (преобразованного в char ) в
str . Поиск включает завершающий NULL символ.

Функции wcsrchr и _mbsrchr are wide-character и multibyte-character versions of


strrchr для расширенных и многобайтовых символов. Аргументы и возвращаемое
значение являются wcsrchr строками расширенных символов. Аргументы и
возвращаемое значение являются _mbsrchr многобайтовыми строками символов.

В языке C эти функции принимают указатель const в качестве первого аргумента. В


языке C++ доступны две перегрузки. Перегрузка, принимающая указатель на
const , возвращает указатель на const ; версия, которая принимает указатель на не-

const , возвращает указатель на не- const . Макрос _CRT_CONST_CORRECT_OVERLOADS

определяется, const если доступны как версии, так и другие const версии этих
функций. Если требуется поведение не для const обеих перегрузок C++,
определите символ _CONST_RETURN .

_mbsrchr проверяет свои параметры. Если str имеет значение NULL , вызывается

обработчик недопустимых параметров, как описано в разделе Проверка


параметров. Если выполнение может быть продолжено, параметр errno
принимает значение EINVAL , а функция _mbsrchr возвращает значение 0. strrchr и
wcsrchr не проверяют свои параметры. В остальном эти три функции ведут себя
идентично.

Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.


Дополнительные сведения см. в разделе setlocale. Версии этих функций без
суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsrchr strrchr _mbsrchr wcsrchr

Недоступно Недоступно _mbsrchr_l Недоступно

Требования
Подпрограмма Обязательный заголовок

strrchr <string.h>

wcsrchr <string.h> либо <wchar.h>

_mbsrchr , _mbsrchr_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример
Пример использования strrchr см. в разделе strchr.

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strchr, wcschr, _mbschr, _mbschr_l

strcspn, wcscspn, _mbscspn, _mbscspn_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strpbrk, wcspbrk, _mbspbrk, _mbspbrk_l

strspn, wcsspn, _mbsspn, _mbsspn_l\


strrev , wcsrev
Статья • 03.04.2023

Имена strrev функций, относящиеся к корпорации Майкрософт, являются wcsrev


устаревшими псевдонимами для _strrev функций и _wcsrev функций. По умолчанию
они создают предупреждение компилятора (уровень 3) C4996. Имена являются
устаревшими, так как они не соответствуют стандартным правилам C для имен,
относящихся к реализации. Однако функции по-прежнему поддерживаются.

Мы рекомендуем использовать _strrev и _wcsrev вместо этого. Вы также можете


продолжать использовать эти имена функций и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_strrev , _wcsrev , _mbsrev , _mbsrev_l
Статья • 03.04.2023

Меняет порядок символов в строке на обратный.

) Важно!

Функции _mbsrev и _mbsrev_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strrev(

char *str

);

wchar_t *_wcsrev(

wchar_t *str

);

unsigned char *_mbsrev(

unsigned char *str

);

unsigned char *_mbsrev_l(

unsigned char *str,

_locale_t locale

);

Параметры
str

Строка для преобразования, завершающаяся символом NULL.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на измененную строку. Нет зарезервированных
возвращаемых значений для указания ошибки.

Комментарии
Функция _strrev изменяет порядок символов в str на обратный. Завершающий
нуль-символ остается на месте. Функции _wcsrev и _mbsrev are wide-character и
multibyte-character versions of _strrev для расширенных и многобайтовых
символов. Аргументы и возвращаемое значение являются _wcsrev строками
расширенных символов. Аргументы и возвращаемое значение являются _mbsrev
многобайтовыми строками символов. Для _mbsrev порядок байтов в каждом
многобайтовом символе в str не изменяется. В остальном эти три функции ведут
себя идентично.

_mbsrev проверяет свои параметры. Если или string1 string2 является пустым

указателем, вызывается обработчик недопустимых параметров, как описано в


разделе Проверка параметров. Если выполнение может быть продолжено,
функция _mbsrev возвращает значение NULL и устанавливает параметр errno в
значение EINVAL . _strrev и _wcsrev не проверяют свои параметры.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
идентичны, но в версиях без суффикса _l используется текущий языковой
стандарт, а в версиях с суффиксом _l используется переданный параметр
языкового стандарта. Для получения дополнительной информации см. Locale.

) Важно!

Эти функции могут быть подвержены угрозам переполнения буфера.


Переполнение буфера можно использовать для атак на систему, поскольку
оно может привести к несанкционированному повышению уровня
привилегий. Дополнительные сведения см . в статье Предотвращение
переполнения буфера.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом
Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные Определенные

_tcsrev _strrev _mbsrev _wcsrev

Недоступно Недоступно _mbsrev_l Недоступно

Требования
Подпрограмма Обязательный заголовок

_strrev <string.h>

_wcsrev <string.h> или <wchar.h>

_mbsrev , _mbsrev_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strrev.c

// This program checks a string to see

// whether it is a palindrome: that is, whether

// it reads the same forward and backward.

//

#include <string.h>

#include <stdio.h>

int main( void )

char* string = "Able was I ere I saw Elba";


int result;

// Reverse string and compare (ignore case):

result = _stricmp( string, _strrev( _strdup( string ) ) );

if( result == 0 )

printf( "The string \"%s\" is a palindrome\n", string );

else

printf( "The string \"%s\" is not a palindrome\n", string );

Output
The string "Able was I ere I saw Elba" is a palindrome

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcpy, wcscpy, _mbscpy

_strset, _strset_l, _wcsset, _wcsset_l, _mbsset, _mbsset_l


strset , wcsset
Статья • 03.04.2023

Эти функции являются устаревшими. Вместо этого используйте соответствующий


стандарт _strsetISO C++, _strset_l, , _wcsset_wcsset_l_mbsset_mbsset_l или
улучшенный _strset_sбезопасностью _strset_s_l, _wcsset_s, _wcsset_s_l, а
_mbsset_s_mbsset_s_l не .
_strset , _strset_l , _wcsset , _wcsset_l ,
_mbsset , _mbsset_l
Статья • 03.04.2023

Инициализирует символы строки в соответствии с указанным символом. Доступны


более безопасные версии этих функций; см. раздел_strset_s , _strset_s_l, _wcsset_s,
_wcsset_s_l, _mbsset_s, . _mbsset_s_l

) Важно!

Функции _mbsset и _mbsset_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strset(

char *str,

int c

);

char *_strset_l(

char *str,

int c,

_locale_t locale

);

wchar_t *_wcsset(

wchar_t *str,

wchar_t c

);

wchar_t *_wcsset_l(

wchar_t *str,

wchar_t c,

_locale_t locale

);

unsigned char *_mbsset(

unsigned char *str,

unsigned int c

);

unsigned char *_mbsset_l(

unsigned char *str,

unsigned int c,

_locale_t locale

);

Параметры
str

Строка для изменения, завершающаяся символом NULL.

Параметр символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на измененную строку.

Комментарии
Функция _strset устанавливает все символы строки str в c (преобразованный в
char ), за исключением завершающего нуль-символа. _wcsset и _mbsset_l
представляют собой расширенную и многобайтовую версии _strset , и типы
данных аргументов и возвращаемых значений изменяются соответствующим
образом. В остальном эти функции ведут себя одинаково.

_mbsset проверяет свои параметры. Если str является пустым указателем,

вызывается обработчик недопустимых параметров, как описано в разделе


Проверка параметров. Если выполнение может быть продолжено, функция
_mbsset возвращает значение NULL и устанавливает параметр errno в значение
EINVAL . _strset и _wcsset не проверяют свои параметры.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
идентичны, но в версиях без суффикса _l используется текущий языковой
стандарт, а в версиях с суффиксом _l используется переданный параметр
языкового стандарта. Для получения дополнительной информации см. Locale.

) Важно!
Эти функции могут быть подвержены угрозам переполнения буфера.
Переполнение буфера можно использовать для атак на систему, поскольку
оно может привести к несанкционированному повышению уровня
привилегий. Дополнительные сведения см . в статье Предотвращение
переполнения буфера.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsset _strset _mbsset _wcsset

_tcsset_l _strset_l _mbsset_l _wcsset_l

Требования
Подпрограмма Обязательный заголовок

_strset <string.h>

_strset_l <tchar.h>

_wcsset <string.h> или <wchar.h>

_wcsset_l <tchar.h>

_mbsset , _mbsset_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strset.c

// compile with: /W3

#include <string.h>

#include <stdio.h>

int main( void )

char string[] = "Fill the string with something.";

printf( "Before: %s\n", string );

_strset( string, '*' ); // C4996

// Note: _strset is deprecated; consider using _strset_s instead

printf( "After: %s\n", string );

Output

Before: Fill the string with something.

After: *******************************

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbset, _mbsnbset_l

memset, wmemset

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

_strnset, _strnset_l, _wcsnset, _wcsnset_l, _mbsnset, _mbsnset_l


_strset_s , _strset_s_l , _wcsset_s ,
_wcsset_s_l , _mbsset_s , _mbsset_s_l
Статья • 03.04.2023

Инициализирует символы строки в соответствии с указанным символом. Эти


версии , _strset_l, , _mbsset_l_mbsset_wcsset_l_wcssetимеют улучшения безопасности,
как описано в функциях_strsetбезопасности в CRT.

) Важно!

Функции _mbsset_s и _mbsset_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t _strset_s(

char *str,

size_t numberOfElements,

int c

);

errno_t _strset_s_l(

char *str,

size_t numberOfElements,

int c,

_locale_t locale

);

errno_t _wcsset_s(

wchar_t *str,

size_t numberOfElements,

wchar_t c

);

errno_t *_wcsset_s_l(

wchar_t *str,

size_t numberOfElements,

wchar_t c,

_locale_t locale

);

errno_t _mbsset_s(

unsigned char *str,

size_t numberOfElements,

unsigned int c

);

errno_t _mbsset_s_l(

unsigned char *str,

size_t numberOfElements,

unsigned int c,

_locale_t locale

);

Параметры
str

Строка для изменения, завершающаяся символом NULL.

numberOfElements

Размер буфера str .

Параметр символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успешного выполнения; в противном случае — код ошибки.

Эти функции проверяют свои аргументы. Если str является пустым указателем или
numberOfElements аргумент меньше или равен 0, или переданный блок не

завершается null, вызывается обработчик недопустимых параметров, как описано в


разделе "Проверка параметров". Если продолжение выполнения разрешено, эти
функции возвращают EINVAL и устанавливают для errno значение EINVAL .

Комментарии
Функция _strset_s устанавливает все символы строки str в c (преобразованный в
char ), за исключением завершающего нуль-символа. Функции _wcsset_s и
_mbsset_s are wide-character и multibyte-character versions of _strset_s для

расширенных и многобайтовых символов. Типы данных аргументов и


возвращаемых значений изменяются соответствующим образом. В остальном эти
функции ведут себя одинаково.
Выходное значение зависит от параметра LC_CTYPE категории языкового стандарта.
Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте _CrtSetDebugFillThreshold.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsset_s _strset_s _mbsset_s _wcsset_s

_tcsset_s_l _strset_s_l _mbsset_s_l _wcsset_s_l

Требования
Подпрограмма Обязательный заголовок

_strset_s <string.h>

_strset_s_l <tchar.h>

_wcsset_s <string.h> или <wchar.h>

_wcsset_s_l <tchar.h>

_mbsset_s , _mbsset_s_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_strset_s.c

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

int main( void )

char string[] = "Fill the string with something.";

printf( "Before: %s\n", string );

_strset_s( string, _countof(string), '*' );

printf( "After: %s\n", string );

Output

Before: Fill the string with something.

After: *******************************

См. также раздел


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

Локаль

Интерпретация последовательностей многобайтовых символов

_mbsnbset, _mbsnbset_l

memset, wmemset

strcat, wcscat, _mbscat

strcmp, wcscmp, _mbscmp

strcpy, wcscpy, _mbscpy

_strnset, _strnset_l, _wcsnset, _wcsnset_l, _mbsnset, _mbsnset_l


strspn , wcsspn , _mbsspn , _mbsspn_l
Статья • 03.04.2023

Возвращает индекс первого символа в строке, которая не принадлежит заданному


набору символов.

) Важно!

Функции _mbsspn и _mbsspn_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

size_t strspn(

const char *str,

const char *strCharSet

);

size_t wcsspn(

const wchar_t *str,

const wchar_t *strCharSet

);

size_t _mbsspn(

const unsigned char *str,

const unsigned char *strCharSet

);

size_t _mbsspn_l(

const unsigned char *str,

const unsigned char *strCharSet,

_locale_t locale

);

Параметры
str

Строка для поиска, завершающаяся символом NULL.

strCharSet

Набор символов, завершающийся символом NULL.


locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает целочисленное значение, задающее длину подстроки в str , которая
состоит только из символов в strCharSet . Если str начинается с символа не из
strCharSet , функция возвращает значение 0.

Комментарии
Функция strspn возвращает индекс первого символа в str , который не
принадлежит набору символов в strCharSet . Поиск не включает завершающие
символы NULL.

Функции wcsspn и _mbsspn are wide-character и multibyte-character versions of


strspn для расширенных и многобайтовых символов. Аргументы представляют

wcsspn собой строки расширенных символов. Аргументами являются _mbsspn

многобайтовые символьные строки. _mbsspn проверяет свои параметры. Если str


или strCharSet имеет значение NULL , вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров . Если выполнение
может быть продолжено, параметр _mbspn принимает значение errno , а функция
EINVAL возвращает значение 0. strspn и wcsspn не проверяют свои параметры. В
остальном эти три функции ведут себя идентично.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale. Версии этих функций
без суффикса _l используют текущий языковой стандарт для данного поведения,
зависимого от языкового стандарта. Версии с суффиксом _l идентичны, однако
они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом
Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE
TCHAR.H определены Определенные Определенные

_tcsspn strspn _mbsspn wcsspn

Недоступно Недоступно _mbsspn_l Недоступно

Требования
Подпрограмма Обязательный заголовок

strspn <string.h>

wcsspn <string.h> или <wchar.h>

_mbsspn , _mbsspn_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strspn.c

// This program uses strspn to determine

// the length of the segment in the string "cabbage"

// consisting of a's, b's, and c's. In other words,

// it finds the first non-abc letter.

//

#include <string.h>

#include <stdio.h>

int main( void )

char string[] = "cabbage";

int result;

result = strspn( string, "abc" );

printf( "The portion of '%s' containing only a, b, or c "

"is %d bytes long\n", string, result );

Output

The portion of 'cabbage' containing only a, b, or c is 5 bytes long

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

_strspnp, _wcsspnp, _mbsspnp, _mbsspnp_l

strcspn, wcscspn, _mbscspn, _mbscspn_l

strncat, _strncat_l, wcsncat, _wcsncat_l, _mbsncat, _mbsncat_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy, _strncpy_l, wcsncpy, _wcsncpy_l, _mbsncpy, _mbsncpy_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l


_strspnp , _wcsspnp , _mbsspnp ,
_mbsspnp_l
Статья • 03.04.2023

Возвращает указатель на первый символ в заданной строке, который не указан в


другой строке.

) Важно!

Функции _mbsspnp и _mbsspnp_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strspnp(

const char *str,

const char *charset

);

wchar_t *_wcsspnp(

const unsigned wchar_t *str,

const unsigned wchar_t *charset

);

unsigned char *_mbsspnp(

const unsigned char *str,

const unsigned char *charset

);

unsigned char *_mbsspnp_l(

const unsigned char *str,

const unsigned char *charset,

_locale_t locale

);

Параметры
str

Строка для поиска, завершающаяся символом NULL.


charset

Набор символов, завершающийся символом NULL.

locale

Используемый языковой стандарт.

Возвращаемое значение
_strspnp , _wcsspnp и _mbsspnp возвращают указатель на первый символ в str ,
который не принадлежит набору символов в charset . Каждая из этих функций
возвращает NULL , если str полностью состоит из символов из charset . Для каждой
из этих подпрограмм отсутствуют зарезервированные возвращаемые значения для
указания ошибки.

Комментарии
Функция _mbsspnp возвращает указатель на многобайтовый символ, который
является первым символом в str , который не принадлежит к набору символов в
charset . Функция _mbsspnp распознает последовательности многобайтовых
символов в соответствии с текущей многобайтовой кодовой страницей. Поиск не
включает завершающие символы NULL.

Если или str charset является пустым указателем, эта функция вызывает
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, функция возвращает NULL
и устанавливает для параметра errno значение EINVAL .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_tcsspnp _strspnp _mbsspnp _wcsspnp

_strspnp и _wcsspnp — версии _mbsspnp с однобайтовыми или расширенными


символами. _strspnp Поведение и _wcsspnp идентично _mbsspnp другим; они
предоставляются только для этого сопоставления и не должны использоваться по
какой-либо другой причине. Дополнительные сведения см. в разделах
Использование сопоставлений универсального текста и Сопоставления
универсального текста.

_mbsspnp_l идентична указанной за исключением того, что использует языковой

стандарт, переданный в качестве параметра. Для получения дополнительной


информации см. Locale.

Требования
Подпрограмма Обязательный заголовок

_mbsspnp <mbstring.h>

_strspnp <tchar.h>

_wcsspnp <tchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_mbsspnp.c

#include <mbstring.h>

#include <stdio.h>

int main( void ) {

const unsigned char string1[] = "cabbage";

const unsigned char string2[] = "c";

unsigned char *ptr = 0;

ptr = _mbsspnp( string1, string2 );

printf( "%s\n", ptr);

Выходные данные
Output

abbage

См. также
Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strspn, wcsspn, _mbsspn, _mbsspn_l

strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l

strncpy_s, _strncpy_s_l, wcsncpy_s, _wcsncpy_s_l, _mbsncpy_s, _mbsncpy_s_l

_strnicmp, _wcsnicmp, _mbsnicmp, _strnicmp_l, _wcsnicmp_l, _mbsnicmp_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l


strstr , wcsstr , _mbsstr , _mbsstr_l
Статья • 03.04.2023

Возвращает указатель на первое вхождение искомой строки в строке.

) Важно!

Функции _mbsstr и _mbsstr_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strstr(

const char *str,

const char *strSearch

); // C only

char *strstr(

char *str,

const char *strSearch

); // C++ only

const char *strstr(

const char *str,

const char *strSearch

); // C++ only

wchar_t *wcsstr(

const wchar_t *str,

const wchar_t *strSearch

); // C only

wchar_t *wcsstr(

wchar_t *str,

const wchar_t *strSearch

); // C++ only

const wchar_t *wcsstr(

const wchar_t *str,

const wchar_t *strSearch

); // C++ only

unsigned char *_mbsstr(

const unsigned char *str,

const unsigned char *strSearch

); // C only

unsigned char *_mbsstr(

unsigned char *str,

const unsigned char *strSearch

); // C++ only

const unsigned char *_mbsstr(

const unsigned char *str,

const unsigned char *strSearch

); // C++ only

unsigned char *_mbsstr_l(

const unsigned char *str,

const unsigned char *strSearch,

_locale_t locale

); // C only

unsigned char *_mbsstr_l(

unsigned char *str,

const unsigned char *strSearch,

_locale_t locale

); // C++ only

const unsigned char *_mbsstr_l(

const unsigned char *str,

const unsigned char *strSearch,

_locale_t locale

); // C++ only

Параметры
str

Строка для поиска, завершающаяся символом NULL.

strSearch

Искомая строка, завершающаяся символом NULL.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на первое вхождение strSearch в str или , NULL если
strSearch не отображается в str . Если strSearch указывает на строку нулевой

длины, функция возвращает str .

Комментарии
Функция strstr возвращает указатель на первое вхождение strSearch в str .
Поиск не включает завершающие символы NULL. wcsstr является версией strstr с
расширенными символами, а _mbsstr  — версией с многобайтовыми символами.
Аргументы и возвращаемое значение являются wcsstr строками расширенных
символов. Аргументы и возвращаемое значение являются _mbsstr
многобайтовыми строками символов. _mbsstr проверяет свои параметры. Если
str или strSearch имеет значение NULL , вызывается обработчик недопустимых

параметров, как описано в разделе Проверка параметров . Если выполнение


может быть продолжено, параметр _mbsstr принимает значение errno , а функция
EINVAL возвращает значение 0. strstr и wcsstr не проверяют свои параметры. В

остальном эти три функции ведут себя идентично.

) Важно!

Эти функции могут создать угрозу в связи с проблемой переполнения буфера.


Проблемы переполнения буфера могут использоваться для атаки на систему,
поскольку они могут допустить выполнение произвольного кода, приводящего
к несанкционированному повышению прав доступа. Дополнительные
сведения см . в статье Предотвращение переполнения буфера.

В языке C эти функции принимают указатель const в качестве первого аргумента. В


языке C++ доступны две перегрузки. Перегрузка, принимающая указатель на
const , возвращает указатель на const ; версия, которая принимает указатель на не

const , возвращает указатель на не const . Макрос _CRT_CONST_CORRECT_OVERLOADS


определяется, const если доступны как версии, так и другие const версии этих
функций. Если требуется поведение не для const обеих перегрузок C++,
определите символ _CONST_RETURN .

На выходное значение влияет параметр категории языкового LC_CTYPE стандарта ;


дополнительные сведения см. в разделе setlocale, _wsetlocale. Версии этих функций,
у которых нет суффикса _l , используют текущий языковой стандарт для этого
поведения, зависящее от языкового стандарта; версии с суффиксом _l идентичны,
за исключением того, что вместо этого они используют переданный параметр
языкового стандарта. Для получения дополнительной информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные
TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_tcsstr strstr _mbsstr wcsstr

Недоступно Недоступно _mbsstr_l Недоступно

Требования
Подпрограмма Обязательный заголовок

strstr <string.h>

wcsstr <string.h> либо <wchar.h>

_mbsstr , _mbsstr_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример
C

// crt_strstr.c

#include <string.h>

#include <stdio.h>

char str[] = "lazy";


char string[] = "The quick brown dog jumps over the lazy fox";

char fmt1[] = " 1 2 3 4 5";

char fmt2[] = "12345678901234567890123456789012345678901234567890";

int main( void )

char *pdest;

int result;

printf( "String to be searched:\n %s\n", string );

printf( " %s\n %s\n\n", fmt1, fmt2 );

pdest = strstr( string, str );

result = (int)(pdest - string + 1);

if ( pdest != NULL )
printf( "%s found at position %d\n", str, result );

else

printf( "%s not found\n", str );

Output

String to be searched:

The quick brown dog jumps over the lazy fox

1 2 3 4 5

12345678901234567890123456789012345678901234567890

lazy found at position 36

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcspn, wcscspn, _mbscspn, _mbscspn_l

strcmp, wcscmp, _mbscmp

strpbrk, wcspbrk, _mbspbrk, _mbspbrk_l

strrchr, wcsrchr, _mbsrchr, _mbsrchr_l

strspn, wcsspn, _mbsspn, _mbsspn_l

basic_string::find
_strtime , _wstrtime
Статья • 03.04.2023

Копируют время в буфер. Доступны более безопасные версии этих функций; см.
,_strtime_s_wstrtime_s .

Синтаксис
C

char *_strtime(

char *timestr

);

wchar_t *_wstrtime(

wchar_t *timestr

);

template <size_t size>

char *_strtime(

char (&timestr)[size]

); // C++ only

template <size_t size>

wchar_t *_wstrtime(

wchar_t (&timestr)[size]

); // C++ only

Параметры
timestr

Время в виде строки.

Возвращаемое значение
Возвращает указатель на строку символов timestr .

Комментарии
Функция _strtime копирует текущее локальное время в буфер, на который
указывает timestr . Время отформатировано как hh:mm:ss , где hh две цифры,
представляющие час в 24-часовой нотации. mm — это две цифры за минуты,
прошедшие за час, и ss это две цифры в течение секунд. Например, строка
18:23:44 представляет 23 минуты и 44 секунды после 6 вечера. Буфер должен

содержать не менее 9 байт.

_wstrtime — это версия с расширенными символами для _strtime ; аргумент и

возвращаемое значение _wstrtime являются строками с расширенными


символами. В остальном эти функции ведут себя одинаково. Если timestr указатель
NULL или timestr неправильно отформатирован, вызывается обработчик

недопустимых параметров, как описано в разделе "Проверка параметров". Если


исключение разрешено продолжать, эти функции возвращают NULL значение и
задают значение EINVAL errno , если timestr задано NULL значение или errno ERANGE
задано, если timestr он имеет неправильный формат.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tstrtime _strtime _strtime _wstrtime

Требования
Подпрограмма Обязательный заголовок

_strtime <time.h>

_wstrtime <time.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_strtime.c

// compile with: /W3

#include <time.h>

#include <stdio.h>

int main( void )

char tbuffer [9];

_strtime( tbuffer ); // C4996

// Note: _strtime is deprecated; consider using _strtime_s instead

printf( "The current time is %s \n", tbuffer );

Output

The current time is 14:21:44

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

mktime, _mktime32, _mktime64

time, _time32, _time64

_tzset
_strtime_s , _wstrtime_s
Статья • 03.04.2023

Копирует текущее время в буфер. Эти функции являются версиями _strtime, с


улучшениями безопасности, _wstrtime описанными в разделе Функции
безопасности в CRT.

Синтаксис
C

errno_t _strtime_s(

char *buffer,

size_t numberOfElements

);

errno_t _wstrtime_s(

wchar_t *buffer,

size_t numberOfElements

);

template <size_t size>

errno_t _strtime_s(

char (&buffer)[size]

); // C++ only

template <size_t size>

errno_t _wstrtime_s(

wchar_t (&buffer)[size]

); // C++ only

Параметры
buffer

Буфер длиной не менее 10 символов, в который будет записано время.

numberOfElements

Размер буфера.

Возвращаемое значение
Нуль при успешном завершении.

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


описано в разделе Проверка параметров. Возвращаемое значение — это код
ошибки, если произошел сбой. Коды ошибок определены в ERRNO.H; ошибки,
создаваемые этой функцией, см. в таблице ниже. Дополнительные сведения о
кодах ошибок см. в разделе errno Константы.

Условия ошибок

buffer numberOfElements Возвращает Содержимое buffer

NULL (любые) EINVAL Без изменений

Не NULL (указывает на 0 EINVAL Без изменений


допустимый буфер)

Не NULL (указывает на 0 < размер < 9 EINVAL Пустая строка.


допустимый буфер)

Не NULL (указывает на Размер > 9 0 Текущая дата в формате,


допустимый буфер) указанном в разделе
"Примечания"

Проблемы с безопасностью
Передача недопустимого значения, отличного NULL от буфера, приведет к
нарушению доступа, если numberOfElements параметр больше 9.

Передача в качестве numberOfElements значения, превышающего фактический


размер буфера, приведет к переполнению буфера.

Комментарии
Эти функции обеспечивают более безопасные версии _strtime и _wstrtime. Функция
_strtime_s копирует текущее локальное время в буфер, на который указывает

buffer . Время форматируется как чч:мм:сс , где hh — две цифры, представляющие


час в 24-часовой нотации, mm две цифры, представляющие минувшие минуты, и ss
две цифры, представляющие секунды. Например, строка 18:23:44 представляет 23
минуты и 44 секунды после 18:00. Длина буфера должна быть не менее 9 байт;
Фактический размер задается вторым параметром.

_wstrtime_s — это версия с расширенными символами для _strtime_s ; аргумент и


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

Версии отладочной библиотеки этих функций сначала заполняют буфер 0xFE.


Чтобы отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставление подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tstrtime_s _strtime_s _strtime_s _wstrtime_s

Требования
Подпрограмма Обязательный заголовок

_strtime_s <time.h>

_wstrtime_s <time.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// strtime_s.c

#include <time.h>

#include <stdio.h>

int main()

char tmpbuf[9];

errno_t err;

// Set time zone from TZ environment variable. If TZ is not set,

// the operating system is queried to obtain the default value


// for the variable.

//

_tzset();

// Display operating system-style date and time.

err = _strtime_s( tmpbuf, 9 );

if (err)

printf("_strdate_s failed due to an invalid argument.");

exit(1);

printf( "OS time:\t\t\t\t%s\n", tmpbuf );

err = _strdate_s( tmpbuf, 9 );

if (err)

printf("_strdate_s failed due to an invalid argument.");

exit(1);

printf( "OS date:\t\t\t\t%s\n", tmpbuf );

Output

OS time: 14:37:49

OS date: 04/25/03

См. также раздел


Управление временем

asctime_s, _wasctime_s

ctime_s, _ctime32_s, _ctime64_s, _wctime_s, _wctime32_s, _wctime64_s

gmtime_s, _gmtime32_s, _gmtime64_s

localtime_s, _localtime32_s, _localtime64_s

mktime, _mktime32, _mktime64

time, _time32, _time64

_tzset
strtod , _strtod_l , wcstod , _wcstod_l
Статья • 03.04.2023

Преобразование строки в значение двойной точности.

Синтаксис
C

double strtod(

const char *strSource,

char **endptr

);

double _strtod_l(

const char *strSource,

char **endptr,

_locale_t locale

);

double wcstod(

const wchar_t *strSource,

wchar_t **endptr

);

double _wcstod_l(

const wchar_t *strSource,

wchar_t **endptr,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

locale

Используемый языковой стандарт.

Возвращаемое значение
strtod возвращает значение числа с плавающей запятой, за исключением случаев,
когда представление вызовет переполнение. В этом случае функция возвращает
значение +/- HUGE_VAL . Знак соответствует HUGE_VAL знаку значения, которое не
может быть представлено. strtod возвращает значение , 0 если преобразование
не может быть выполнено или происходит недостаточное количество.

wcstod возвращает значения аналогично : strtod

Для обеих функций errno равен ERANGE при возникновении переполнения


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

Дополнительные сведения об этом и других кодах возврата см. в разделе errno,


_doserrno, _sys_errlistи _sys_nerr.

Комментарии
Каждая функция преобразует входную строку strSource в double . Функция strtod
преобразует strSource в значение двойной точности. strtod останавливает чтение
строки strSource в первом символе, который она не распознает как часть числа.
Этот символ может быть завершающим символом NULL. Функция wcstod — это
версия функции strtod с расширенными символами. Ее аргумент strSource —
строка расширенных символов. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcstod strtod strtod wcstod

_tcstod_l _strtod_l _strtod_l _wcstod_l

Параметр LC_NUMERIC категории текущего языкового стандарта определяет


распознавание символа точки радикса в strSource . Для получения
дополнительной информации см. setlocale. Функции без суффикса _l используют
текущий языковой стандарт; _strtod_l они идентичны _strtod , за исключением
того, что первый использует переданный locale . Для получения дополнительной
информации см. Locale.

Если endptr значение не NULL равно , указатель на символ, остановленный при


сканировании, хранится в расположении, на которое указывает endptr . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

strtod указывает strSource на строку одной из следующих форм:

[ whitespace ] [ sign ] { digits [ radix digits ] | radix digits } [{ e | E } [ sign ] digits ]

[ whitespace ] [ sign ] { 0x | 0X } { hexdigits [ radix hexdigits ] | radix hexdigits } [{ p | P }


[ sign ] digits ]

[ whitespace ] [ sign ] { INF | INFINITY }

[ whitespace ] [ sign ] NAN [ sequence ]

Необязательный ведущий whitespace может состоять из пробелов и символов


табуляции, которые игнорируются.

sign имеет значение плюс (+) или минус (-).

digits — это одна или несколько десятичных цифр.

hexdigits — это одна или несколько шестнадцатеричных цифр.

radix — это символ точки радикса, точка (.) в языковом стандарте "C" по
умолчанию или конкретное значение языкового стандарта, если текущий языковой
стандарт отличается или если locale задан параметр .

— sequence это последовательность буквенно-цифровых символов или символов


подчеркивания.

В десятичной и шестнадцатеричной формах чисел, если перед символом точки


радикса не отображаются цифры, после него должна появиться по крайней мере
одна.

В десятичной форме за десятичными цифрами может следовать экспонента,


которая состоит из вводной буквы ( e или E ) и необязательного целого числа со
знаком.

В шестнадцатеричной форме за шестнадцатеричными цифрами может следовать


экспонента, состоящая из вводной буквы ( p или P ), и десятичного целого числа со
знаком со знаком, представляющего экспоненту как степень 2.

В любой форме, если нет части экспоненты или символа точки радикса,
предполагается, что символ точки радикса следует за последней цифрой в строке.
Регистр игнорируется в обоих формах INF и NAN . Первый символ, который не
соответствует одной из этих форм, останавливает сканирование.

Версии UCRT этих функций не поддерживают преобразование букв экспоненты в


стиле Фортран ( d или D ). Это нестандартное расширение поддерживалось в более
ранних версиях CRT и может оказаться критическим изменением для вашего кода.
Версии UCRT поддерживают шестнадцатеричные строки и циклический обход
значений INF и NAN , которые не поддерживались в более ранних версиях. Эта
поддержка также может привести к критическим изменениям в коде. Например,
строка " 0x1a " будет интерпретироваться strtod как 0.0 в предыдущих версиях, но
как 26.0 в версии UCRT.

Требования
Подпрограмма Обязательный заголовок

strtod , _strtod_l C: <stdlib.h> C++: <cstdlib> или <stdlib.h>

wcstod , _wcstod_l C: <stdlib.h> или <wchar.h> C++: <cstdlib> , <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strtod.c

// This program uses strtod to convert a

// string to a double-precision value; strtol to

// convert a string to long integer values; and strtoul

// to convert a string to unsigned long-integer values.

//

#include <stdlib.h>

#include <stdio.h>

int main(void)

char *string, *stopstring;

double x;

long l;

int base;

unsigned long ul;

string = "3.1415926This stopped it";

x = strtod(string, &stopstring);

printf("string = %s\n", string);

printf(" strtod = %f\n", x);

printf(" Stopped scan at: %s\n\n", stopstring);

string = "-10110134932This stopped it";

l = strtol(string, &stopstring, 10);

printf("string = %s\n", string);

printf(" strtol = %ld\n", l);

printf(" Stopped scan at: %s\n\n", stopstring);

string = "10110134932";

printf("string = %s\n", string);

// Convert string using base 2, 4, and 8:

for (base = 2; base <= 8; base *= 2)

// Convert the string:

ul = strtoul(string, &stopstring, base);

printf(" strtol = %ld (base %d)\n", ul, base);

printf(" Stopped scan at: %s\n", stopstring);

// NaN

x = strtod("+nan", &stopstring);

printf("\n%f\n", x);

// INF

x = strtod("-INF", &stopstring);

printf("\n%f\n", x);

// e - exponent

x = strtod("1.18973e+49", &stopstring);

printf("\n%f\n", x);

// doesn't handle Fortran style

x = strtod("1.18973d+49", &stopstring);

printf("\n%f\n", x);

printf("No Fortran style support. Stopped parsing at %s\n", stopstring);

Output

string = 3.1415926This stopped it


strtod = 3.141593

Stopped scan at: This stopped it

string = -10110134932This stopped it

strtol = -2147483648

Stopped scan at: This stopped it

string = 10110134932

strtol = 45 (base 2)

Stopped scan at: 34932

strtol = 4423 (base 4)

Stopped scan at: 4932

strtol = 2134108 (base 8)

Stopped scan at: 932

nan

-inf

11897299999999999421285862642874618947301378359296.000000

1.189730

No Fortran style support. Stopped parsing at d+49

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Интерпретация последовательностей многобайтовых символов

Локаль

Функции преобразования строк в числовые значения

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l

localeconv

_create_locale, _wcreate_locale

_free_locale
strtof , _strtof_l , wcstof , _wcstof_l
Статья • 03.04.2023

Преобразует строки в значение одиночной точности с плавающей точкой.

Синтаксис
C

float strtof(

const char *strSource,

char **endptr

);

float _strtof_l(

const char *strSource,

char **endptr,

_locale_t locale

);

float wcstof(

const wchar_t *strSource,

wchar_t **endptr

);

float wcstof_l(

const wchar_t *strSource,

wchar_t **endptr,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

locale

Используемый языковой стандарт.

Возвращаемое значение
strtof возвращает значение числа с плавающей запятой, за исключением случаев,

когда представление вызовет переполнение. В этом случае функция возвращает


значение +/- HUGE_VALF . Знак соответствует HUGE_VALF знаку значения, которое не
может быть представлено. strtof возвращает 0, если преобразование не может
быть выполнено или происходит потеря значимости.

wcstof возвращает значения аналогично strtof . Для обеих функций имеет


значение ERANGE , errno если происходит переполнение или недополук и
вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Каждая функция преобразует входную строку strSource в float . Функция strtof
преобразует strSource в значение одиночной точности. strtof останавливает
чтение строки strSource в первом символе, который она не распознает как часть
числа. Этот символ может быть завершающим символом NULL. Функция wcstof —
это версия функции strtof с расширенными символами. Ее аргумент strSource —
строка расширенных символов. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstof strtof strtof wcstof

_tcstof_l _strtof_l _strtof_l _wcstof_l

Параметр LC_NUMERIC категории текущего языкового стандарта определяет


распознавание радиксного символа в ; дополнительные сведения см. в
strSource разделеsetlocale , _wsetlocale. Функции без суффикса _l используют
текущий языковой стандарт; функции с этим суффиксом идентичны, за
исключением того, что они используют переданный параметр языкового
стандарта. Для получения дополнительной информации см. Locale.
Если endptr значение не NULL равно , указатель на символ, остановленный при
сканировании, хранится в расположении, на которое указывает endptr . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

strtof ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [ sign ] [ digits ] [. digits ] [{ e | E } [ sign ] digits ]

whitespace может содержать пробелы и символы табуляции, которые

игнорируются; sign  — это или плюс ( + ), или минус ( - ); digits  — это одна или
несколько десятичных цифр. Если перед символом основания системы счисления
нет никаких цифр, то после него должна отображаться хотя бы одна цифра. За
десятичными цифрами может следовать показатель степени, который состоит из
вводной буквы ( e или E ) и при необходимости целого числа со знаком. Если часть
экспоненты или символ радикса не отображается, предполагается, что символ
радикса следует за последней цифрой в строке. Первый символ, который не
соответствует этой форме, останавливает сканирование.

Версии UCRT этих функций не поддерживают преобразование букв экспоненты в


стиле Фортран ( d или D ). Это нестандартное расширение поддерживалось в более
ранних версиях CRT и может оказаться критическим изменением для вашего кода.

Требования
Подпрограмма Обязательный заголовок

strtof , _strtof_l C: <stdlib.h> C++: <cstdlib> или <stdlib.h>

wcstof , _wcstof_l C: <stdlib.h> или <wchar.h> C++: <cstdlib>, <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strtof.c

// This program uses strtof to convert a

// string to a single-precision value.

#include <stdlib.h>

#include <stdio.h>

int main( void )

char *string;

char *stopstring;

float x;

string = "3.14159This stopped it";

x = strtof(string, &stopstring);

printf("string = %s\n", string);

printf(" strtof = %f\n", x);

printf(" Stopped scan at: %s\n\n", stopstring);

Output

string = 3.14159This stopped it

strtof = 3.141590

Stopped scan at: This stopped it

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Интерпретация последовательностей многобайтовых символов

Локаль

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l

localeconv

_create_locale, _wcreate_locale

_free_locale
_strtoi64 , _wcstoi64 , _strtoi64_l ,
_wcstoi64_l
Статья • 03.04.2023

Преобразуют строку в значение __int64 .

Синтаксис
C

__int64 _strtoi64(

const char *strSource,

char **endptr,

int base

);

__int64 _wcstoi64(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

__int64 _strtoi64_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

__int64 _wcstoi64_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
_strtoi64 возвращает значение, представленное в строке strSource , кроме
случаев, когда представление вызвало бы переполнение; в этом случае
возвращается значение _I64_MAX или _I64_MIN . Функция возвращает 0, если
преобразование не может быть выполнено. _wcstoi64 возвращает значения
аналогично _strtoi64 .

Значения _I64_MAX и _I64_MIN определяются в LIMITS.H.

Если strSource имеет значение NULL или base имеет ненулевое значение и либо
меньше 2, либо больше 36, то для errno устанавливается значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Функция _strtoi64 преобразует strSource в __int64 . Обе функции перестают
считывать строку strSource с первого символа, который они не могут распознать
как часть числа. Это может быть завершающий пустой символ или первый
числовой символ, больше или равный base . Функция _wcstoi64 — это версия
функции _strtoi64 с расширенными символами. Ее аргумент strSource — строка
расширенных символов. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcstoi64 _strtoi64 _strtoi64 _wcstoi64

_tcstoi64_l _strtoi64_l _strtoi64_l _wcstoi64_l


Параметр категории языкового LC_NUMERIC стандарта определяет распознавание
символа радикса в ; дополнительные сведения см. в strSource разделе setlocale.
Функции без суффикса _l используют текущий языковой стандарт; _strtoi64_l и
_wcstoi64_l идентичны соответствующей функции без суффикса _l , за
исключением того, что они используют переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

Если endptr значение не NULL равно , указатель на символ, остановивший


сканирование, хранится в расположении endptr , на которое указывает . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

_strtoi64 ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits | letters ]

Может whitespace состоять из пробелов и символов табуляции, которые


игнорируются. digits — это одна или несколько десятичных цифр. letters — это
одна или несколько букв от "a" до "z" (или "A" по "Z"). Первый символ, который не
подходит для этой формы, останавливает сканирование. Если base значение
находится в диапазоне от 2 до 36, оно используется в качестве основы числа. Если
base равно 0, то начальные символы строки, на которую указывает strSource ,
используются для определения основания. Если первый символ имеет значение
"0", а второй — не "x" или "X", строка интерпретируется как восьмеричное целое
число. Если первый символ — 0, а второй символ равен x или X, строка
интерпретируется как шестнадцатеричное целое число. Если первый символ — от
1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или
от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с
присвоенными значениями меньше base . Первый символ за пределами диапазона
основания останавливает сканирование. Например, если значение base равно 0 и
первый считанный символ — "0", то предполагается восьмеричное целое число и
символ "8" или "9" останавливает чтение.

Требования
Компонент Обязательный заголовок

_strtoi64 , _strtoi64_l <stdlib.h>


Компонент Обязательный заголовок

_wcstoi64 , _wcstoi64_l <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l


strtoimax , _strtoimax_l , wcstoimax ,
_wcstoimax_l
Статья • 03.04.2023

Преобразует строку в целочисленное значение наибольшего поддерживаемого


целочисленного типа со знаком.

Синтаксис
C

intmax_t strtoimax(

const char *strSource,

char **endptr,

int base

);

intmax_t wcstoimax(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

intmax_t _strtoimax_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

intmax_t _wcstoimax_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
strtoimax возвращает значение, представленное в строке strSource , кроме
случаев, когда представление вызвало бы переполнение; в этом случае
возвращается значение INTMAX_MAX или INTMAX_MIN , и errno устанавливается в
значение ERANGE . Функция возвращает 0, если преобразование не может быть
выполнено. wcstoimax возвращает значения аналогично strtoimax .

INTMAX_MAX и INTMAX_MIN задаются в STDLIB.H.

Если strSource имеет значение NULL или base имеет ненулевое значение и либо
меньше 2, либо больше 36, то для errno устанавливается значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция strtoimax преобразует strSource в intmax_t . wcstoimax — это версия
strtoimax с расширенными символами; ее аргумент strSource  — строка
расширенных символов. В остальном эти функции ведут себя одинаково. Обе
функции перестают считывать строку strSource при первом символе, которую они
не могут распознать как часть числа. Это может быть завершающий нуль-символ
или первый числовой символ, который больше или равен base .

Параметр категории языкового LC_NUMERIC стандарта определяет распознавание


символа радикса в ; дополнительные сведения см. в strSource разделе setlocale.
_wsetlocale Функции, не имеющие суффикс _l , используют текущий языковой
стандарт; _strtoimax_l и _wcstoimax_l идентичны соответствующим функциям,
которые не имеют суффикс _l , за исключением того, что они вместо этого
используют переданный им языковой стандарт. Для получения дополнительной
информации см. Locale.

Если endptr это не NULL так, указатель на символ, на который остановлено


сканирование, хранится в расположении, на которое указывает endptr указатель.
Если не удается выполнить преобразование (не найдены допустимые цифры или
указано недопустимое основание), значение strSource сохраняется в
расположении, указанном endptr .

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstoimax strtoimax strtoimax wcstoimax

_tcstoimax_l strtoimax_l _strtoimax_l _wcstoimax_l

strtoimax ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits | letters ]

whitespace может состоять из пробелов и символов табуляции, которые

игнорируются; digits  — одна или несколько десятичных цифр; letters  — одна


или несколько букв от "a" до "z" (или от "A" до "Z"). Первый символ, не
соответствующий этой форме, останавливает сканирование. Если base значение от
2 до 36, оно используется в качестве основы числа. Если base равно 0, то
начальные символы строки, на которую указывает strSource , используются для
определения основания. Если первый символ имеет значение "0", а второй символ
не является "x" или "X", строка интерпретируется как восьмеричное целое число.
Если первый символ — 0, а второй символ равен x или X, строка интерпретируется
как шестнадцатеричное целое число. Если первый символ — от 1 до 9, строка
интерпретируется как десятичное целое число. Буквам от а до z (или от А до Z)
присваиваются значения от 10 до 35. Допускаются только буквы с присвоенными
значениями меньше base . Первый символ за пределами диапазона основания
останавливает сканирование. Например, если значение base равно 0 и первый
считанный символ — "0", то предполагается восьмеричное целое число, и символ
"8" или "9" остановит сканирование.

Требования
Подпрограмма Обязательный заголовок

strtoimax , _strtoimax_l , wcstoimax , _wcstoimax_l <inttypes.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

strtoumax, _strtoumax_l, wcstoumax, _wcstoumax_l

atof, _atof_l, _wtof, _wtof_l


strtok , _strtok_l , wcstok , _wcstok_l ,
_mbstok , _mbstok_l
Статья • 03.04.2023

Находят следующий токен в строке с использованием текущего или переданного


языкового стандарта. Доступны более безопасные версии этих функций; см.
разделstrtok_s , _strtok_s_l, wcstok_s, _wcstok_s_l, _mbstok_s, . _mbstok_s_l

) Важно!

Функции _mbstok и _mbstok_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *strtok(

char *strToken,

const char *strDelimit

);

char *_strtok_l(

char *strToken,

const char *strDelimit,

_locale_t locale

);

wchar_t *wcstok( /* Non-standard, define _CRT_NON_CONFORMING_WCSTOK to use


*/

wchar_t *strToken,

const wchar_t *strDelimit

);

wchar_t *wcstok(

wchar_t *strToken,

const wchar_t *strDelimit,

wchar_t **context

);

wchar_t *_wcstok_l(

wchar_t *strToken,

const wchar_t *strDelimit,

_locale_t locale

);

unsigned char *_mbstok(

unsigned char *strToken,

const unsigned char *strDelimit

);

unsigned char *_mbstok_l(

unsigned char *strToken,

const unsigned char *strDelimit,

_locale_t locale

);

Параметры
strToken

Строка, содержащая токен или токены.

strDelimit

Набор символов-разделителей.

locale

Используемый языковой стандарт.

context

Указывает на память, используемую для хранения внутреннего состояния средства


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

Возвращаемое значение
Возвращает указатель на следующий токен, найденный в strToken . Функции
возвращаются NULL , когда маркеры больше не найдены. Каждый вызов
изменяется strToken путем замены символа NULL для первого разделителя,
который возникает после возвращенного маркера.

Комментарии
Функция strtok находит следующий токен в strToken . Набор символов в
параметре strDelimit указывает возможные разделители токенов, которые
требуется найти в strToken во время текущего вызова. Функции wcstok и _mbstok
are wide-character и multibyte-character versions of strtok для расширенных и
многобайтовых символов. Аргументы и возвращаемое значение являются wcstok
строками расширенных символов. Аргументы argumets и возвращаемое значение
являются _mbstok многобайтовыми строками символов. В остальном эти три
функции ведут себя идентично.

Версия с двумя аргументами не является стандартной wcstok . Если вам нужно


использовать эту версию, необходимо определить _CRT_NON_CONFORMING_WCSTOK
перед вами #include <wchar.h> (или #include <string.h> ).

) Важно!

Эти функции представляют потенциальную угрозу, связанную с проблемой


переполнения буфера. Проблемы переполнения буфера — это
распространенный метод атак на системы, который приводит к
несанкционированному повышению уровня прав. Дополнительные сведения
см . в статье Предотвращение переполнения буфера.

При первом вызове функции strtok она пропускает ведущие разделители и


возвращает указатель на первый токен в strToken , завершая токен нуль-символом.
Из оставшейся части strToken можно выделить другие токены с помощью
последовательных вызовов функции strtok . Каждый вызов изменяется
strtok strToken путем вставки символа NULL после возвращаемого token этим

вызовом. Чтобы прочитать следующий токен из strToken , вызовите функцию


strtok со значением NULL аргумента strToken . Значение NULL аргумента strToken

приводит к тому, что функция strtok ищет следующий токен в измененной строке
strToken . Аргумент strDelimit в разных вызовах может принимать любое

значение, позволяя изменять набор разделителей.

На выходное значение влияет настройка LC_CTYPE категории языкового стандарта.


Для получения дополнительной информации см. setlocale.

Версии этих функций без суффикса _l используют текущий языковой стандарт для
этого поведения, зависяющего от языкового стандарта. Версии с суффиксом _l
идентичны, за исключением того, что они используют переданный параметр
языкового стандарта. Для получения дополнительной информации см. Locale.

7 Примечание

Каждая функция использует статическую локальную в потоке переменную для


разбора строки на токены. Поэтому эти функции могут вызвать одновременно
несколько потоков без нежелательных последствий. Однако в пределах
одного потока чередование вызовов одной из этих функций с большой
степенью вероятности приводит к повреждению данных и получению
неточных результатов. При синтаксическом анализе разных строк сначала
завершите анализ одной строки, а затем начинайте анализ следующей. Кроме
того, помните о потенциальной опасности, возникающей при вызове одной из
этих функций из цикла, в котором также вызывается другая функция. Если
другая функция использует одну из этих функций, произойдет чередование
последовательностей вызовов, что приведет к повреждению данных.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcstok strtok _mbstok wcstok

_tcstok _strtok_l _mbstok_l _wcstok_l

Требования
Подпрограмма Обязательный заголовок

strtok <string.h>

wcstok <string.h> либо <wchar.h>

_wcstok_l <tchar.h>

_mbstok , _mbstok_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strtok.c

// compile with: /W3

// In this program, a loop uses strtok

// to print all the tokens (separated by commas

// or blanks) in the string named "string".

//

#include <string.h>

#include <stdio.h>

char string[] = "A string\tof ,,tokens\nand some more tokens";

char seps[] = " ,\t\n";

char *token;

int main( void )

printf( "Tokens:\n" );

// Establish string and get the first token:

token = strtok( string, seps ); // C4996

// Note: strtok is deprecated; consider using strtok_s instead

while( token != NULL )

// While there are tokens in "string"

printf( " %s\n", token );

// Get next token:

token = strtok( NULL, seps ); // C4996

Output

Tokens:

string

of

tokens

and

some

more

tokens

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcspn, wcscspn, _mbscspn, _mbscspn_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strtok_s , _strtok_s_l , wcstok_s ,
_wcstok_s_l , _mbstok_s , _mbstok_s_l
Статья • 03.04.2023

Находит следующий токен в строке с использованием текущего или переданного


языкового стандарта. Эти версии strtok, _strtok_l, wcstok, _wcstok_l, _mbstok_mbstok_l
имеют улучшения безопасности, как описано в разделе Функции безопасности в
CRT.

) Важно!

Функции _mbstok_s и _mbstok_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char* strtok_s(

char* str,

const char* delimiters,

char** context

);

char* _strtok_s_l(

char* str,

const char* delimiters,

char** context,

_locale_t locale

);

wchar_t* wcstok_s(

wchar_t* str,

const wchar_t* delimiters,

wchar_t** context

);

wchar_t *_wcstok_s_l(

wchar_t* str,

const wchar_t* delimiters,

wchar_t** context,

_locale_t locale

);

unsigned char* _mbstok_s(

unsigned char* str,

const unsigned char* delimiters,

char** context

);

unsigned char* _mbstok_s_l(

unsigned char* str,

const unsigned char* delimiters,

char** context,

_locale_t locale

);

Параметры
str

Строка, содержащая маркер или маркеры для поиска.

delimiters

Набор используемых символов-разделителей.

context

Используется для хранения сведений о положении между вызовами функции.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на следующий токен, найденный в str . Возвращает, NULL
если маркеры больше не найдены. Каждый вызов изменяется str путем замены
символа NULL для первого разделителя, который возникает после возвращенного
маркера.

Условия ошибок

str delimiters context Возвращаемое значение errno

NULL any указатель на указатель NULL NULL EINVAL

any NULL any NULL EINVAL


str delimiters context Возвращаемое значение errno

any any NULL NULL EINVAL

Если str параметр имеет значение , NULL но context является указателем на


допустимый указатель контекста, ошибка отсутствует.

Комментарии
Семейство strtok_s функций находит следующий маркер в str . Набор символов в
параметре delimiters указывает возможные разделители токенов, которые
требуется найти в str во время текущего вызова. Функции wcstok_s и _mbstok_s are
wide-character и multibyte-character versions of strtok_s для расширенных и
многобайтовых символов. Аргументы и возвращаемые значения и
wcstok_s _wcstok_s_l являются строками расширенных символов. Аргументы и
возвращаемые значения и _mbstok_s _mbstok_s_l являются многобайтовыми
строками символов. В остальном эти функции ведут себя одинаково.

Эта функция проверяет свои параметры. При возникновении условия ошибки, как
в таблице Условия ошибки, вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если выполнение может быть
продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение NULL .

При первом вызове функции strtok_s она пропускает ведущие разделители и


возвращает указатель на первый токен в str , завершая токен нуль-символом. Из
оставшейся части str можно выделить другие токены с помощью
последовательных вызовов функции strtok_s . Каждый вызов функции strtok_s
изменяет str , вставляя нуль-символ после токена, возвращенного этим вызовом.
Указатель context продолжает отслеживать читаемую строку и место в строке, из
которого следует считать следующий токен. Чтобы прочитать следующий токен из
str , вызовите функцию strtok_s со значением NULL для аргумента str и
передайте тот же параметр context . Значение NULL аргумента str приводит к
тому, что функция strtok_s ищет следующий токен в измененной строке str .
Аргумент delimiters в разных вызовах может принимать любое значение,
позволяя изменять набор разделителей.

context Так как параметр заменяет статические буферы, используемые в strtok и


_strtok_l , можно одновременно проанализировать две строки в одном потоке.
На выходное значение влияет параметр LC_CTYPE категории языкового стандарта.
Для получения дополнительной информации см. setlocale.

Версии этих функций без суффикса _l используют текущий языковой стандарт


потока для этого поведения, зависящей от языкового стандарта. Версии с
суффиксом _l идентичны, за исключением того, что они используют языковой
стандарт, заданный параметром locale . Для получения дополнительной
информации см. Locale.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcstok_s strtok_s _mbstok_s wcstok_s

_tcstok_s_l _strtok_s_l _mbstok_s_l _wcstok_s_l

Требования
Подпрограмма Обязательный заголовок

strtok_s <string.h>

_strtok_s_l <string.h>

wcstok_s ,
<string.h> или <wchar.h>
_wcstok_s_l

_mbstok_s ,
<mbstring.h>
_mbstok_s_l

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strtok_s.c

// In this program, a loop uses strtok_s

// to print all the tokens (separated by commas

// or blanks) in two strings at the same time.

#include <string.h>

#include <stdio.h>

char string1[] =

"A string\tof ,,tokens\nand some more tokens";

char string2[] =

"Another string\n\tparsed at the same time.";

char seps[] = " ,\t\n";

char *token1 = NULL;

char *token2 = NULL;

char *next_token1 = NULL;

char *next_token2 = NULL;

int main(void)

printf("Tokens:\n");

// Establish string and get the first token:

token1 = strtok_s(string1, seps, &next_token1);

token2 = strtok_s(string2, seps, &next_token2);

// While there are tokens in "string1" or "string2"

while ((token1 != NULL) || (token2 != NULL))

// Get next token:

if (token1 != NULL)

printf(" %s\n", token1);

token1 = strtok_s(NULL, seps, &next_token1);

if (token2 != NULL)

printf(" %s\n", token2);

token2 = strtok_s(NULL, seps, &next_token2);

Output

Tokens:

Another

string

string

of

parsed

tokens

at

and

the

some

same

more

time.

tokens

См. также раздел


Манипуляция со строками

Локаль

Интерпретация последовательностей многобайтовых символов

strcspn, wcscspn, _mbscspn, _mbscspn_l

strspn, wcsspn, _mbsspn, _mbsspn_l


strtol , wcstol , _strtol_l , _wcstol_l
Статья • 03.04.2023

Преобразуйте строки в целочисленное long значение.

Синтаксис
C

long strtol(

const char *string,

char **end_ptr,

int base

);

long wcstol(

const wchar_t *string,

wchar_t **end_ptr,

int base

);

long _strtol_l(

const char *string,

char **end_ptr,

int base,

_locale_t locale

);

long _wcstol_l(

const wchar_t *string,

wchar_t **end_ptr,

int base,

_locale_t locale

);

Параметры
string

Строка, завершающаяся символом NULL, для преобразования.

end_ptr

Выходной параметр, задающий указатель на символ после последнего


интерпретированного символа. Игнорируется, если NULL .

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
strtol , wcstol , _strtol_l и _wcstol_l возвращает значение, представленное в
string . Они возвращают значение 0, если преобразование невозможно. Когда

представление приведет к переполнению, они возвращают LONG_MAX или LONG_MIN .

errno is set to ERANGE if overflow or underflow occurs. EINVAL string Если задано

значение NULL . Или, если base ненулевое значение и меньше 2 или больше 36.
Дополнительные сведения о ERANGE кодах EINVAL возврата и других кодах возврата
см. в разделе errno, , _doserrno_sys_errlistи _sys_nerr.

Комментарии
wcstol _strtol_l , strtol и _wcstol_l функции преобразуются string в . long Они

перестают читать string на первом символе, не распознаваемом как часть числа.


Это может быть символ конца null или первый буквенно-цифровой символ,
превышающий или равный base .

wcstol и _wcstol_l — это версии функций strtol и _strtol_l для расширенных


символов. Аргументом string является строка расширенных символов. Эти
функции ведут себя одинаково strtol и _strtol_l в противном случае. Параметр
категории языкового LC_NUMERIC стандарта определяет распознавание символа
радикса (дробного маркера или десятичной запятой). string Функции strtol и
wcstol использование текущего языкового стандарта. _strtol_l и используйте
_wcstol_l переданный языковой стандарт. Дополнительные сведения см. в разделе

[ setlocale ] и языковом стандарте.

Когда end_ptr это NULL так, он игнорируется. В противном случае указатель на


символ, на который остановлено сканирование, хранится в расположении, на
end_ptr которое указывает . Преобразование невозможно, если не найдены
допустимые цифры или указана недопустимая база. Затем значение string
сохраняется в расположении, на которое указывает . end_ptr

strtol ожидает, что string указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ alphanumerics ]


Квадратные скобки ( [ ] ) окружают необязательные элементы. Фигурные скобки и
вертикальная полоса ( { | } ) окружают альтернативные варианты для одного
элемента. whitespace может состоять из пробелов и символов табуляции, которые
игнорируются. alphanumerics являются десятичными цифрами или буквами 'a' (
'z' или 'A' через 'Z' ). Первый символ, не соответствующий этой форме,

останавливает сканирование. Если base значение от 2 до 36, оно используется в


качестве основы числа. Если base это так 0 , для определения основы используются
начальные символы строки, на которые указывает string указатель. Если первый
символ — 0 и второй символ не 'x' является или 'X' строка интерпретируется как
восьмеричное целое число. Если первый символ и '0' второй символ или 'x' 'X' ,
строка интерпретируется как шестнадцатеричное целое число. Если первый
символ проходит '1' через '9' , строка интерпретируется как десятичное целое
число. Буквы 'a' через 'z' (или 'A' через 'Z' ) назначаются значения от 10 до 35.
Сканирование допускает только буквы, значения которых меньше base . Первый
символ за пределами диапазона основания останавливает сканирование.
Например, предположим, что string начинается с "01" . В противном случае
base 0 средство проверки предполагает, что это восьмеричное целое число. Знак
'8' или '9' символ останавливает сканирование.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstol strtol strtol wcstol

_tcstol_l _strtol_l _strtol_l _wcstol_l

Требования
Подпрограмма Обязательный заголовок

strtol <stdlib.h>

wcstol <stdlib.h> или <wchar.h>

_strtol_l <stdlib.h>
Подпрограмма Обязательный заголовок

_wcstol_l <stdlib.h> или <wchar.h>

Функции _strtol_l _wcstol_l относятся к корпорации Майкрософт, а не к


стандартной библиотеке C. Дополнительные сведения о совместимости см. в
разделе Compatibility.

Пример
См. пример для strtod.

См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtoll, _strtoll_l, wcstoll, _wcstoll_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l


strtold , _strtold_l , wcstold ,
_wcstold_l
Статья • 03.04.2023

Преобразует строки в значение long двойной точности с плавающей точкой.

Синтаксис
C

long double strtold(

const char *strSource,

char **endptr

);

long double _strtold_l(


const char *strSource,

char **endptr,

_locale_t locale

);

long double wcstold(

const wchar_t *strSource,

wchar_t **endptr

);

long double wcstold_l(

const wchar_t *strSource,

wchar_t **endptr,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

locale

Используемый языковой стандарт.

Возвращаемое значение
strtold возвращает значение числа с плавающей запятой long double в виде , за

исключением случаев, когда представление приведет к переполнению, в этом


случае функция возвращает +/- HUGE_VALL . Знак соответствия знаку HUGE_VALL
значения, которое не может быть представлено. strtold возвращает 0, если
преобразование не может быть выполнено или происходит потеря значимости.

wcstold возвращает значения аналогично strtold . Для обеих функций задается

значение ERANGE , errno если происходит переполнение или переполнение, и


вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров".

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Каждая функция преобразует входную строку strSource в long double . Функция
strtold перестает считывать строку strSource на первом символе, которую она не
может распознать как часть числа. Это может быть завершающий нуль-символ.
wcstold — это версия strtold с расширенными символами; ее аргумент
strSource  — строка расширенных символов. В остальном эти функции ведут себя

одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstold strtold strtold wcstold

_tcstold_l _strtold_l _strtold_l _wcstold_l

Параметр категории LC_NUMERIC текущего языкового стандарта определяет


распознавание символа основания системы счисления в strSource .
Дополнительные сведения см. в разделе setlocale, _wsetlocale. Функции, не
имеющие суффикса _l , используют текущий языковой стандарт; _strtold_l и
_wcstold_l идентичны _strtold и _wcstold за исключением того, что они
используют переданный им языковой стандарт. Для получения дополнительной
информации см. Locale.

Если endptr это не NULL так, указатель на символ, на который остановлено


сканирование, хранится в расположении, на которое указывает endptr указатель.
Если не удается выполнить преобразование (не найдены допустимые цифры или
указано недопустимое основание), значение strSource сохраняется в
расположении, указанном endptr .

strtold ожидает, что strSource указывает на строку следующего вида:

[ whitespace ][ sign ][ digits ][. digits ][{ d | D | e | E }[ sign ] digits ]

whitespace может содержать пробелы и символы табуляции, которые


игнорируются; sign  — это или плюс ( + ), или минус ( - ); digits  — это одна или
несколько десятичных цифр. Если перед символом основания системы счисления
нет никаких цифр, то после него должна отображаться хотя бы одна цифра. За
десятичными цифрами может следовать показатель степени, который состоит из
вводной буквы ( d , D , e или E ) и при необходимости целого числа со знаком. Если
экспонентная часть или символ радикса не отображается, предполагается, что
символ радикса следует за последней цифрой в строке. Первый символ, не
соответствующий этой форме, останавливает сканирование.

Требования
Подпрограмма Обязательный заголовок

strtold , _strtold_l <stdlib.h>

wcstold , _wcstold_l <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strtold.c

// Build with: cl /W4 /Tc crt_strtold.c

// This program uses strtold to convert a

// string to a long double-precision value.

#include <stdlib.h>

#include <stdio.h>

int main( void )

char *string;

char *stopstring;

long double x;

string = "3.1415926535898This stopped it";

x = strtold(string, &stopstring);

printf("string = %s\n", string);

printf(" strtold = %.13Lf\n", x);

printf(" Stopped scan at: %s\n\n", stopstring);

Output

string = 3.1415926535898This stopped it

strtold = 3.1415926535898

Stopped scan at: This stopped it

См. также раздел


Преобразование данных

Поддержка математических функций для чисел с плавающей запятой


Интерпретация последовательностей многобайтовых символов

Локаль

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l

localeconv

_create_locale, _wcreate_locale

_free_locale
strtoll , _strtoll_l , wcstoll ,
_wcstoll_l
Статья • 03.04.2023

Преобразуют строку в число long long .

Синтаксис
C

long long strtoll(

const char *strSource,

char **endptr,

int base

);

long long wcstoll(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

long long _strtoll_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

long long _wcstoll_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
Функция strtoll возвращает значение, представленное в строке strSource , кроме
случаев, когда представление вызвало бы переполнение. В таких случаях
возвращается значение LLONG_MAX или LLONG_MIN . Функция возвращает 0, если
преобразование не может быть выполнено. wcstoll возвращает значения
аналогично strtoll .

Значения LLONG_MAX и LLONG_MIN определяются в LIMITS.H.

Если strSource имеет значение NULL или base имеет ненулевое значение и либо
меньше 2, либо больше 36, то для errno устанавливается значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция strtoll преобразует strSource в long long . Обе функции перестают
считывать строку strSource при первом символе, которую они не могут распознать
как часть числа. Это может быть завершающий нуль-символ или первый числовой
символ, который больше или равен base . Функция wcstoll — это версия функции
strtoll с расширенными символами. Ее аргумент strSource — строка

расширенных символов. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstoll strtoll strtoll wcstoll

_tcstoll_l _strtoll_l _strtoll_l _wcstoll_l


Параметр категории языкового LC_NUMERIC стандарта определяет распознавание
символа радикса в ; дополнительные сведения см. в strSource разделе setlocale.
_wsetlocale Функции, не имеющие суффикса _l , используют текущий языковой
стандарт. Функции _strtoll_l и _wcstoll_l идентичны соответствующим
функциям, которые не имеют суффикса, за исключением того, что они вместо этого
используют переданный им языковой стандарт. Для получения дополнительной
информации см. Locale.

Если endptr это не NULL так, указатель на символ, на который остановлено


сканирование, хранится в расположении, на которое указывает endptr указатель.
Если не удается выполнить преобразование (не найдены допустимые цифры или
указано недопустимое основание), значение strSource сохраняется в
расположении, указанном endptr .

strtoll ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits | letters ]

whitespace может состоять из пробелов и символов табуляции, которые


игнорируются; digits  — одна или несколько десятичных цифр; letters  — одна
или несколько букв от "a" до "z" (или от "A" до "Z"). Первый символ, не
соответствующий этой форме, останавливает сканирование. Если base значение от
2 до 36, оно используется в качестве основы числа. Если base равно 0, то
начальные символы строки, на которую указывает strSource , используются для
определения основания. Если первый символ имеет значение "0", а второй символ
не является "x" или "X", строка интерпретируется как восьмеричное целое число.
Если первый символ — 0, а второй символ равен x или X, строка интерпретируется
как шестнадцатеричное целое число. Если первый символ — от 1 до 9, строка
интерпретируется как десятичное целое число. Буквам от а до z (или от А до Z)
присваиваются значения от 10 до 35. Допускаются только буквы с присвоенными
значениями меньше base . Первый символ за пределами диапазона основания
останавливает сканирование. Например, если значение base равно 0, и первый
считанный символ — "0", то предполагается восьмеричное целое число, и символ
"8" или "9" останавливает чтение.

Требования
Подпрограмма Обязательный заголовок

strtoll , _strtoll_l <stdlib.h>


Подпрограмма Обязательный заголовок

wcstoll , _wcstoll_l <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l


_strtoui64 , _wcstoui64 , _strtoui64_l ,
_wcstoui64_l
Статья • 03.04.2023

Преобразуют строку в значение unsigned __int64 .

Синтаксис
C

unsigned __int64 _strtoui64(

const char *strSource,

char **endptr,

int base

);

unsigned __int64 _wcstoui64(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

unsigned __int64 _strtoui64_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

unsigned __int64 _wcstoui64_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
Функция _strtoui64 возвращает значение, представленное в строке strSource ,
кроме случаев, когда представление вызвало бы переполнение. В этом случае
возвращается значение _UI64_MAX . Функция _strtoui64 возвращает 0, если
преобразование не может быть выполнено.

_UI64_MAX определяется в LIMITS.H .

Если strSource имеет значение NULL или base имеет ненулевое значение и либо
меньше 2, либо больше 36, то для errno устанавливается значение EINVAL .

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Функция _strtoui64 преобразует strSource в unsigned __int64 . Функция _wcstoui64
— это версия функции _strtoui64 с расширенными символами. Ее аргумент
strSource — строка расширенных символов. В остальном эти функции работают
одинаково.

Обе функции перестают считывать строку strSource с первого символа, который


они не могут распознать как часть числа. Это может быть завершающий пустой
символ или первый числовой символ, больше или равный base .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить его, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcstoui64 _strtoui64 _strtoui64 _wcstoui64

_tcstoui64_l _strtoui64_l _strtoui64_l _wcstoui64_l


Параметр категории текущего языкового LC_NUMERIC стандарта определяет
распознавание символа радикса в ; дополнительные сведения см. в
strSource разделе setlocale. Функции, не имеющие суффикса _l , используют

текущий языковой стандарт; _strtoui64_l и _wcstoui64_l идентичны


соответствующим функциям, которые не имеют суффикса _l , за исключением того,
что они используют переданный им языковой стандарт. Для получения
дополнительной информации см. Locale.

Если endptr значение не NULL равно , указатель на символ, остановивший


сканирование, хранится в расположении endptr , на которое указывает . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

_strtoui64 ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits | letters ]

Может whitespace состоять из пробелов и символов табуляции, которые


игнорируются. digits — это одна или несколько десятичных цифр. letters — это
одна или несколько букв от "a" до "z" (или "A" по "Z"). Первый символ, который не
подходит для этой формы, останавливает сканирование. Если base значение
находится в диапазоне от 2 до 36, оно используется в качестве основы числа. Если
base равно 0, то начальные символы строки, на которую указывает strSource ,

используются для определения основания. Если первый символ имеет значение


"0", а второй — не "x" или "X", строка интерпретируется как восьмеричное целое
число. Если первый символ — 0, а второй символ равен x или X, строка
интерпретируется как шестнадцатеричное целое число. Если первый символ — от
1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или
от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с
присвоенными значениями меньше base . Первый символ за пределами диапазона
основания останавливает сканирование. Например, если значение base равно 0 и
первый считанный символ — "0", то предполагается восьмеричное целое число и
символ "8" или "9" останавливает чтение.

Требования
Компонент Обязательный заголовок

_strtoui64 <stdlib.h>
Компонент Обязательный заголовок

_wcstoui64 <stdlib.h> или <wchar.h>

_strtoui64_l <stdlib.h>

_wcstoui64_l <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_strtoui64.c

#include <stdio.h>

unsigned __int64 atoui64(const char *szUnsignedInt) {

return _strtoui64(szUnsignedInt, NULL, 10);

int main() {

unsigned __int64 u = atoui64("18446744073709551615");

printf( "u = %I64u\n", u );

Output

u = 18446744073709551615

См. также раздел


Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

atof, _atof_l, _wtof, _wtof_l


strtoul , _strtoul_l , wcstoul ,
_wcstoul_l
Статья • 03.04.2023

Преобразует строки в длинное целое число без знака.

Синтаксис
C

unsigned long strtoul(

const char *strSource,

char **endptr,

int base

);

unsigned long _strtoul_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

unsigned long wcstoul(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

unsigned long _wcstoul_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
Функция strtoul возвращает преобразованное значение, если таковое имеется,
или ULONG_MAX в случае переполнения. Функция strtoul возвращает 0, если
преобразование не может быть выполнено. wcstoul возвращает значения
аналогично strtoul . Для обеих функций errno равен ERANGE при возникновении
переполнения или потери значимости.

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Эти функции преобразуют входную строку strSource в целое значение unsigned
long .

strtoul останавливает чтение строки strSource на первом символе, которую не


может распознать как часть числа. Этот символ может быть завершающим
NULL символом или первым числовым символом, превышающим или равным base .
Параметр LC_NUMERIC категории языкового стандарта определяет распознавание
символа радикса в ; дополнительные сведения см. в strSource разделе setlocale.
Функции strtoul и wcstoul используют текущий языковой стандарт. Функции
_strtoul_l и _wcstoul_l идентичны, за исключением того, что они используют

переданный языковой стандарт. Для получения дополнительной информации см.


Locale.

Если endptr это не NULL так, указатель на символ, на который остановлено


сканирование, хранится в расположении, на endptr которое указывает . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

Функция wcstoul — это версия функции strtoul с расширенными символами. Ее


аргумент strSource — строка расширенных символов. В остальном эти функции
работают одинаково.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tcstoul strtoul strtoul wcstoul

_tcstoul_l strtoul_l _strtoul_l _wcstoul_l

strtoul ожидает, что strSource указывает на строку следующего вида:

[whitespace] [{+ | -}] [0 [{ x | X }]] [digits | letters]

Может whitespace состоять из пробелов и символов табуляции, которые


игнорируются. digits являются одной или несколькими десятичными цифрами.
letters являются одним или несколькими буквами a через z (или A через Z ).

Первый символ, не соответствующий этой форме, останавливает сканирование.


Если base значение от 2 до 36, оно используется в качестве основы числа. Если
base равно 0, то начальные символы строки, на которую указывает strSource ,

используются для определения основания. Если первый символ равен 0, а второй


— нет x или X строка интерпретируется как восьмеричное целое число. Если
первый символ равен "0", а второй — x или X строка интерпретируется как
шестнадцатеричное целое число. Если первый символ — от 1 до 9, строка
интерпретируется как десятичное целое число. Буквы через z (или A через Z )
назначаются значения от 10 до 35; только буквы a , назначенные значения которых
меньше base допустимы. Первый символ за пределами диапазона основания
останавливает сканирование. Например, если значение base равно 0 и первый
считанный символ — "0", то предполагается восьмеричное целое число и символ
"8" или "9" останавливает чтение. Функция strtoul допускает в качестве префикса
знаки плюс ( + ) или минус ( - ). Знак минус перед числом показывает, что
возвращаемое значение отрицательное.

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

strtoul <stdlib.h>

wcstoul <stdlib.h> или <wchar.h>

_strtoul_l <stdlib.h>

_wcstoul_l <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для strtod.

См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

atof, _atof_l, _wtof, _wtof_l


strtoull , _strtoull_l , wcstoull ,
_wcstoull_l
Статья • 03.04.2023

Преобразует строки в целочисленное unsigned long long значение.

Синтаксис
C

unsigned long long strtoull(

const char *strSource,

char **endptr,

int base

);

unsigned long long _strtoull_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

unsigned long long wcstoull(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

unsigned long long _wcstoull_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
Функция strtoull возвращает преобразованное значение, если таковое имеется,
или ULLONG_MAX в случае переполнения. Функция strtoull возвращает 0, если
преобразование не может быть выполнено. wcstoull возвращает значения
аналогично strtoull . Для обеих функций errno равен ERANGE при возникновении
переполнения или потери значимости.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Эти функции преобразуют входную строку strSource в целое значение unsigned
long long .

strtoull останавливает чтение строки strSource в первом символе, который она


не распознает как часть числа. Это может быть завершающий символ NULL или
первый числовой символ, который больше или равен base . Настройка LC_NUMERIC
категории языкового стандарта определяет распознавание радиксного символа в ;
дополнительные сведения см. в strSource разделеsetlocale . _wsetlocale strtoull и
wcstoull используют текущий языковой стандарт; _strtoull_l и _wcstoull_l

используют переданный языковой стандарт, но в остальном идентичны. Для


получения дополнительной информации см. Locale.

Если endptr значение не NULL равно , указатель на символ, остановленный при


сканировании, хранится в расположении, на которое указывает endptr . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

wcstoull — это версия strtoull с расширенными символами; ее аргумент

strSource  — строка расширенных символов. В остальном эти функции ведут себя


одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.
Сопоставления подпрограмм с универсальным
текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstoull strtoull strtoull wcstoull

_tcstoull_l strtoull_l _strtoull_l _wcstoull_l

strtoull ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits | letters ]

Может whitespace состоять из пробелов и символов табуляции, которые


игнорируются. digits — это одна или несколько десятичных цифр. letters — это
одна или несколько букв от "a" до "z" (или "А" по "Z"). Первый символ, который не
соответствует этой форме, останавливает сканирование. Если base значение
находится в диапазоне от 2 до 36, оно используется в качестве основы числа. Если
base равно 0, то начальные символы строки, на которую указывает strSource ,

используются для определения основания. Если первый символ имеет значение


"0", а второй не "x" или "X", строка интерпретируется как восьмеричное целое
число. Если первый символ — 0, а второй символ равен x или X, строка
интерпретируется как шестнадцатеричное целое число. Если первый символ — от
1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или
от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с
присвоенными значениями меньше base . Первый символ за пределами диапазона
основания останавливает сканирование. Например, если значение base равно 0, и
первый считанный символ — "0", то предполагается восьмеричное целое число, и
символ "8" или "9" останавливает чтение. strtoull допускает в качестве префикса
знак плюса ( + ) или знак минуса ( - ); знак минуса перед числом показывает, что
возвращаемое значение отрицательное.

Требования
Подпрограмма Обязательный заголовок

strtoull <stdlib.h>

wcstoull <stdlib.h> или <wchar.h>


Подпрограмма Обязательный заголовок

_strtoull_l <stdlib.h>

_wcstoull_l <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для strtod.

См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

strtoll, _strtoll_l, wcstoll, _wcstoll_l

atof, _atof_l, _wtof, _wtof_l


strtoumax , _strtoumax_l , wcstoumax ,
_wcstoumax_l
Статья • 03.04.2023

Преобразует строку в целочисленное значение наибольшего поддерживаемого


целочисленного типа без знака.

Синтаксис
C

uintmax_t strtoumax(

const char *strSource,

char **endptr,

int base

);

uintmax_t _strtoumax_l(

const char *strSource,

char **endptr,

int base,

_locale_t locale

);

uintmax_t wcstoumax(

const wchar_t *strSource,

wchar_t **endptr,

int base

);

uintmax_t _wcstoumax_l(

const wchar_t *strSource,

wchar_t **endptr,

int base,

_locale_t locale

);

Параметры
strSource

Строка, завершающаяся символом NULL, для преобразования.

endptr

Указатель на символ, который останавливает сканирование.

base

Используемое числовое основание.


locale

Используемый языковой стандарт.

Возвращаемое значение
Функция strtoumax возвращает преобразованное значение, если таковое имеется,
или UINTMAX_MAX в случае переполнения. Функция strtoumax возвращает 0, если
преобразование не может быть выполнено. wcstoumax возвращает значения
аналогично strtoumax . Для обеих функций errno равен ERANGE при возникновении
переполнения или потери значимости.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Эти функции преобразуют входную строку strSource в целое значение uintmax_t .

strtoumax останавливает чтение строки strSource в первом символе, который она

не распознает как часть числа. Это может быть завершающий символ NULL или
первый числовой символ, который больше или равен base . Параметр категории
LC_NUMERIC языкового стандарта определяет распознавание символа основания
системы счисления в strSource . Дополнительные сведения см. в разделеsetlocale .
_wsetlocale strtoumax и wcstoumax используют текущий языковой стандарт;
_strtoumax_l и _wcstoumax_l идентичны, за исключением того, что они используют

переданный языковой стандарт. Для получения дополнительной информации см.


Locale.

Если endptr значение не NULL равно , указатель на символ, остановленный при


сканировании, хранится в расположении, на которое указывает endptr . Если не
удается выполнить преобразование (не найдены допустимые цифры или указано
недопустимое основание), значение strSource сохраняется в расположении,
указанном endptr .

wcstoumax — это версия strtoumax с расширенными символами; ее аргумент

strSource  — строка расширенных символов. В остальном эти функции ведут себя


одинаково.
Сопоставления подпрограмм с универсальным
текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcstoumax strtoumax strtoumax wcstoumax

_tcstoumax_l strtoumax_l _strtoumax_l _wcstoumax_l

strtoumax ожидает, что strSource указывает на строку следующего вида:

[ whitespace ] [{ + | - }] [ 0 [{ x | X }]] [ digits | letters ]

Может whitespace состоять из пробелов и символов табуляции, которые


игнорируются. digits — это одна или несколько десятичных цифр. letters — это
одна или несколько букв от "a" до "z" (или "А" по "Z"). Первый символ, который не
соответствует этой форме, останавливает сканирование. Если base значение
находится в диапазоне от 2 до 36, оно используется в качестве основы числа. Если
base равно 0, то начальные символы строки, на которую указывает strSource ,

используются для определения основания. Если первый символ имеет значение


"0", а второй не "x" или "X", строка интерпретируется как восьмеричное целое
число. Если первый символ — 0, а второй символ равен x или X, строка
интерпретируется как шестнадцатеричное целое число. Если первый символ — от
1 до 9, строка интерпретируется как десятичное целое число. Буквам от а до z (или
от А до Z) присваиваются значения от 10 до 35. Допускаются только буквы с
присвоенными значениями меньше base . Первый символ за пределами диапазона
основания останавливает сканирование. Например, если значение base равно 0 и
первый считанный символ — "0", то предполагается восьмеричное целое число, и
символ "8" или "9" остановит сканирование. strtoumax допускает префикс со
знаком "плюс" ( + ) или "минус" ( - ); начальный знак "минус" указывает, что
возвращаемое значение является дополнением двух абсолютных значений
преобразованной строки.

Требования
Подпрограмма Обязательный заголовок

strtoumax , wcstoumax , _strtoumax_l , _wcstoumax_l <inttypes.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
См. пример для strtod.

См. также:
Преобразование данных

Локаль

localeconv

setlocale, _wsetlocale

Функции преобразования строк в числовые значения

strtod, _strtod_l, wcstod, _wcstod_l

strtoimax, _strtoimax_l, wcstoimax, _wcstoimax_l

strtol, wcstol, _strtol_l, _wcstol_l

strtoul, _strtoul_l, wcstoul, _wcstoul_l

strtoll, _strtoll_l, wcstoll, _wcstoll_l

atof, _atof_l, _wtof, _wtof_l


strupr , wcsupr
Статья • 03.04.2023

Имена strupr функций, зависящие от Корпорации Майкрософт, и wcsupr являются


устаревшими псевдонимами для _strupr функций и _wcsupr функций. По
умолчанию они создают предупреждение компилятора (уровень 3) C4996. Имена
являются устаревшими, так как они не соответствуют стандартным правилам C для
имен, относящихся к реализации. Однако функции по-прежнему поддерживаются.

Вместо этого рекомендуется использовать _strupr и _wcsupr функции, улучшенные


_strupr_s с _wcsupr_s точки зрения безопасности. Вы также можете продолжать
использовать эти имена функций и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".
_strupr , _strupr_l , _mbsupr , _mbsupr_l ,
_wcsupr_l , _wcsupr
Статья • 03.04.2023

Преобразует строку в верхний регистр. Доступны более безопасные версии этих


функций; см. раздел_strupr_s , _strupr_s_l, _mbsupr_s, _mbsupr_s_l, _wcsupr_s, .
_wcsupr_s_l

) Важно!

Функции _mbsupr и _mbsupr_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

char *_strupr(

char *str

);

wchar_t *_wcsupr(

wchar_t *str

);

unsigned char *_mbsupr(

unsigned char *str

);

char *_strupr_l(

char *str,

_locale_t locale

);

wchar_t *_wcsupr_l(

wchar_t *str,

_locale_t locale

);

unsigned char *_mbsupr_l(

unsigned char *str,

_locale_t locale

);

template <size_t size>

char *_strupr(

char (&str)[size]

); // C++ only

template <size_t size>

wchar_t *_wcsupr(

wchar_t (&str)[size]

); // C++ only

template <size_t size>

unsigned char *_mbsupr(

unsigned char (&str)[size]

); // C++ only

template <size_t size>

char *_strupr_l(

char (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

wchar_t *_wcsupr_l(

wchar_t (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

unsigned char *_mbsupr_l(

unsigned char (&str)[size],

_locale_t locale

); // C++ only

Параметры
str

Строка для преобразования букв.

locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает указатель на измененную строку. Так как изменение осуществляется на
месте, возвращенный указатель совпадает с указателем, переданным в качестве
входного аргумента. Нет зарезервированных возвращаемых значений для указания
ошибки.

Комментарии
Функция _strupr преобразует "на месте" каждую строчную букву в строке str в
прописную. Преобразование определяется категорией LC_CTYPE языкового
стандарта. Другие символы не затрагиваются. Дополнительные сведения о методе
LC_CTYPE см. в разделе setlocale. Версии этих функций без суффикса _l используют
текущий языковой стандарт. Версии с суффиксом _l идентичны им, но они
используют языковой стандарт, переданный в качестве аргумента. Для получения
дополнительной информации см. Locale.

Функции _wcsupr и _mbsupr are wide-character и multibyte-character versions of


_strupr для расширенных и многобайтовых символов. Аргумент и возвращаемое

значение являются _wcsupr строками расширенных символов. Аргумент и


возвращаемое значение являются _mbsupr многобайтовыми строками символов. В
остальном эти три функции ведут себя идентично.

Если str является пустым указателем, вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров . Если продолжение
выполнения разрешено, эти функции возвращают исходную строку и
устанавливают для errno значение EINVAL .

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsupr _strupr _mbsupr _wcsupr

_tcsupr_l _strupr_l _mbsupr_l _wcsupr_l

Требования
Подпрограмма Обязательный заголовок

_strupr , _strupr_l <string.h>

_wcsupr , _wcsupr_l <string.h> или <wchar.h>

_mbsupr , _mbsupr_l <mbstring.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
См. пример для _strlwr.

См. также раздел


Локаль

Манипуляция со строками

_strlwr, _wcslwr, _mbslwr, _strlwr_l, _wcslwr_l, _mbslwr_l


_strupr_s , _strupr_s_l , _mbsupr_s ,
_mbsupr_s_l , _wcsupr_s , _wcsupr_s_l
Статья • 03.04.2023

Преобразуют буквы в строке в прописные с использованием текущего или


переданного языкового стандарта. Эти версии _strupr, _strupr_l, _mbsupr, _mbsupr_l,
_wcsupr_l_wcsupr имеют улучшения безопасности, как описано в разделе Функции
безопасности в CRT.

) Важно!

Функции _mbsupr_s и _mbsupr_s_l не могут использоваться в приложениях,


запускаемых в среде выполнения Windows. Дополнительные сведения:
Функции CRT, которые не поддерживаются в приложениях универсальной
платформы Windows.

Синтаксис
C

errno_t _strupr_s(

char *str,

size_t numberOfElements

);

errno_t _wcsupr_s(

wchar_t * str,

size_t numberOfElements

);

errno_t _strupr_s_l(

char * str,

size_t numberOfElements,

_locale_t locale

);

errno_t _wcsupr_s_l(

wchar_t * str,

size_t numberOfElements,

_locale_t locale

);

errno_t _mbsupr_s(

unsigned char *str,

size_t numberOfElements

);

errno_t _mbsupr_s_l(

unsigned char *str,

size_t numberOfElements,

_locale_t locale

);

template <size_t size>

errno_t _strupr_s(

char (&str)[size]

); // C++ only

template <size_t size>

errno_t _wcsupr_s(

wchar_t (&str)[size]

); // C++ only

template <size_t size>

errno_t _strupr_s_l(

char (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

errno_t _wcsupr_s_l(

wchar_t (&str)[size],

_locale_t locale

); // C++ only

template <size_t size>

errno_t _mbsupr_s(

unsigned char (&str)[size]

); // C++ only

template <size_t size>

errno_t _mbsupr_s_l(

unsigned char (&str)[size],

_locale_t locale

); // C++ only

Параметры
str

Строка для преобразования букв.

numberOfElements

Размер буфера.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успеха или ненулевой код ошибки в случае ошибки.

Эти функции проверяют свои параметры. Если str является указателем NULL ,
вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров . Если выполнение может быть продолжено, эти функции
возвращают EINVAL и устанавливают параметр errno в значение EINVAL . Если
numberOfElements меньше, чем длина строки, функция возвращает ERANGE и

устанавливает для параметра errno значение ERANGE .

Комментарии
Функция _strupr_s преобразует "на месте" каждую строчную букву в строке str в
прописную. _wcsupr_s — версия _strupr_s с расширенными символами. Функция
_mbsupr_s — это версия функции _strupr_s с многобайтовой кодировкой

символов.

Преобразование определяется категорией LC_CTYPE языкового стандарта. Другие


символы не затрагиваются. Дополнительные сведения о методе LC_CTYPE см. в
разделе setlocale. Версии этих функций без суффикса _l используют текущий
языковой стандарт. Версии с суффиксом _l идентичны им, за исключением того,
что они используют переданный параметр языкового стандарта. Для получения
дополнительной информации см. Locale.

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Версии библиотек отладки этих функций сначала заполняют буфер 0xFE. Чтобы
отключить это поведение, используйте ._CrtSetDebugFillThreshold

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsupr_s _strupr_s _mbsupr_s _wcsupr_s

_tcsupr_s_l _strupr_s_l _mbsupr_s_l _wcsupr_s_l


Требования
Подпрограмма Обязательный заголовок

_strupr_s , _strupr_s_l <string.h>

_wcsupr_s , _wcsupr_s_l , _mbsupr_s , _mbsupr_s_l <string.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для _strlwr_s, _strlwr_s_l, _mbslwr_s, _mbslwr_s_l, _wcslwr_s, . _wcslwr_s_l

См. также раздел


Локаль

Интерпретация последовательностей многобайтовых символов

Манипуляция со строками

_strlwr_s, _strlwr_s_l, _mbslwr_s, _mbslwr_s_l, _wcslwr_s, _wcslwr_s_l


strxfrm , wcsxfrm , _strxfrm_l ,
_wcsxfrm_l
Статья • 03.04.2023

Преобразует строку на основе данных языкового стандарта.

Синтаксис
C

size_t strxfrm(

char *strDest,

const char *strSource,

size_t count

);

size_t wcsxfrm(

wchar_t *strDest,

const wchar_t *strSource,

size_t count

);

size_t _strxfrm_l(

char *strDest,

const char *strSource,

size_t count,

_locale_t locale

);

size_t wcsxfrm_l(

wchar_t *strDest,

const wchar_t *strSource,

size_t count,

_locale_t locale

);

Параметры
strDest

Конечная строка.

strSource

Исходная строка.

count

Наибольшее число символов, которые могут быть размещены в strDest .


locale

Используемый языковой стандарт.

Возвращаемое значение
Возвращает длину преобразованной строки, не считая завершающий нуль-символ.
Если возвращаемое значение больше либо равно count , содержимое strDest
непредсказуемо. При возникновении ошибки каждая функция устанавливает
значение параметра errno и возвращает INT_MAX . В случае недопустимого символа
параметр errno получает значение EILSEQ .

Комментарии
Функция strxfrm преобразует строку, на которую указывает strSource , в новую
упорядоченную форму, которая сохраняется в strDest . Преобразуется и
размещается в конечной строке не более count символов, включая завершающий
нуль-символ. Преобразование осуществляется с использованием параметра
категории LC_COLLATE языкового стандарта. Дополнительные сведения о методе
LC_COLLATE см. в разделе setlocale. Функция strxfrm использует текущий языковой

стандарт для поведения, зависящего от языкового стандарта; функция _strxfrm_l


идентична предыдущей функции, но вместо текущего языкового стандарта в ней
используется языковой стандарт, передаваемый в качестве параметра. Для
получения дополнительной информации см. Locale.

После преобразования вызов strcmp с двумя преобразованными строками дает


результаты, идентичные результатам вызова , strcoll примененного к двум
исходным строкам. Как и функции strcoll и stricoll , функция strxfrm при
необходимости автоматически обрабатывает строки многобайтовых символов.

wcsxfrm  — это версия функции strxfrm для расширенных символов; строковые

аргументы функции wcsxfrm представляют собой указатели на расширенные


символы. Для wcsxfrm после преобразования строки вызов с wcscmp двумя
преобразованными строками дает результаты, идентичные результатам вызова ,
wcscoll примененного к исходным двум строкам. Поведение wcsxfrm и strxfrm
идентично в противном случае. Функция wcsxfrm использует текущий языковой
стандарт для поведения, зависящего от языкового стандарта; функция _wcsxfrm_l
вместо текущего языкового стандарта использует языковой стандарт, который
передается в качестве параметра.
Эти функции проверяют свои параметры. Если strSource является пустым
указателем или strDest является указателем NULL (если число не равно нулю) или
если count больше INT_MAX , вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров . Если выполнение может быть
продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение INT_MAX .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tcsxfrm strxfrm strxfrm wcsxfrm

_tcsxfrm_l _strxfrm_l _strxfrm_l _wcsxfrm_l

В языковом стандарте "C" порядок символов в наборе символов (кодировка ASCII)


совпадает с лексикографическим порядком символов. Однако в других языковых
стандартах порядок символов в наборе символов может отличаться от
лексикографического порядка. Например, в некоторых европейских языковых
стандартах символ "a" (значение 0x61) предшествует символу "&#x00E4;". (значение
0xE4) в наборе символов, но символ "ä" предшествует символу "a"
лексикографически.

При использовании языковых стандартов, в которых порядок символов в наборе


символов и лексикографический порядок различаются, используйте функцию
strxfrm для исходных строк, затем функцию strcmp на результирующих строках
для лексикографического сравнения строк согласно категории LC_COLLATE текущего
языкового стандарта. Таким образом, чтобы лексикографически сравнить две
строки в приведенном ранее языковом стандарте, используйте функцию strxfrm
для исходных строк, затем функцию strcmp для результирующих строк. Можно
также использовать функцию strcoll вместо функции strcmp для исходных строк.

strxfrm По сути, является оболочкой вокруг LCMapString с LCMAP_SORTKEY .

Значение следующего выражения — это размер массива, необходимого для


хранения strxfrm -преобразования исходной строки:
1 + strxfrm( NULL, string, 0 )

Только strxfrm в языковом стандарте "C" эквивалентен следующим вызовам


функций:

strncpy( _string1, _string2, _count );

return( strlen( _string1 ) );

Требования
Подпрограмма Обязательный заголовок

strxfrm <string.h>

wcsxfrm <string.h> или <wchar.h>

_strxfrm_l <string.h>

_wcsxfrm_l <string.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

localeconv

setlocale, _wsetlocale

Локаль

Манипуляция со строками

Функции strcoll

strcmp, wcscmp, _mbscmp

strncmp, wcsncmp, _mbsncmp, _mbsncmp_l


swab
Статья • 03.04.2023

Имя swab функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _swab для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _swab . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_swab
Статья • 03.04.2023

Меняет местами байты.

Синтаксис
C

void _swab(

char *src,

char *dest,

int n

);

Параметры
src

Данные, которые следует скопировать и поменять местами.

dest

Место хранения для переставленных местами данных.

Число байтов, которые следует скопировать и поменять местами.

Возвращаемое значение
Функция swab не возвращает значение. Функция задает значение errno EINVAL ,
если src dest или указатель имеет значение NULL или n меньше нуля, и
вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров".

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Если n является четным числом, функция _swab копирует n байт из src , меняет
местами все соседние пары байтов и сохраняет результат в dest . Если n значение
нечетное, _swab копирует и заменяет первые n –1 байт src , а окончательный байт
не копируется. Функция _swab обычно используется для подготовки двоичных
данных для передачи на компьютер, который использует другой порядок байтов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

_swab C: <stdlib.h> C++: <cstdlib> или <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_swab.c

#include <stdlib.h>

#include <stdio.h>

char from[] = "BADCFEHGJILKNMPORQTSVUXWZY";

char to[] = "...........................";

int main()

printf("Before: %s %d bytes\n %s\n\n", from, sizeof(from), to);

_swab(from, to, sizeof(from));

printf("After: %s\n %s\n\n", from, to);

Output

Before: BADCFEHGJILKNMPORQTSVUXWZY 27 bytes

...........................

After: BADCFEHGJILKNMPORQTSVUXWZY

ABCDEFGHIJKLMNOPQRSTUVWXYZ.

См. также раздел


Операции с буфером
system , _wsystem
Статья • 03.04.2023

Выполняет команду.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int system(

const char *command

);

int _wsystem(

const wchar_t *command

);

Параметры
command

Команда для выполнения.

Возвращаемое значение
Если параметр command имеет значение NULL и найден интерпретатор команд,
возвращает ненулевое значение. Если интерпретатор команд не найден,
возвращает значение 0 и задает значение errno ENOENT . Если command значение не
NULL равно , system возвращает значение, возвращаемое интерпретатором команд.
Она возвращает значение 0, только если интерпретатор команд возвращает
значение 0. Возвращаемое значение -1 указывает на ошибку и errno имеет одно
из следующих значений:

Значение Описание
Значение Описание

E2BIG Список аргументов (который зависит от системы) слишком велик.

ENOENT Не удается найти интерпретатор команд.

ENOEXEC Не удается выполнить файл интерпретатора команд, так как формат


недопустим.

ENOMEM Недостаточно памяти для выполнения команды; или доступная память


повреждена; или существует недопустимый блок, который указывает, что
вызывающий процесс был выделен неправильно.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Комментарии
Функция system передает параметр command интерпретатору команд, который
выполняет эту строку как команду операционной системы. Для поиска файла
интерпретатора команд CMD.exe функция system использует переменные среды
COMSPEC и PATH . Если параметр command имеет значение NULL , функция только
проверяет, существует ли интерпретатор команд.

Необходимо явно выполнить очистку с помощью fflush или _flushallили закрыть


любой поток перед вызовом system .

_wsystem — это версия system с расширенными символами; аргумент command для

_wsystem — строка расширенных символов. В остальном эти функции ведут себя


одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_tsystem system system _wsystem

Требования
Подпрограмма Обязательный заголовок

system <process.h> или <stdlib.h>

_wsystem <process.h> , <stdlib.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
В этом примере функция system используется для печати (TYPE) текстового файла.

// crt_system.c

#include <process.h>

int main( void )

system( "type crt_system.txt" );

Входные данные: crt_system.txt


Input

Line one.

Line two.

Вывод
Output

Line one.

Line two.

См. также
Управление процессами и средой

_exec, _wexec функции

exit, _Exit, _exit

_flushall

_spawn, _wspawn функции


tan , tanf , tanl
Статья • 03.04.2023

Вычисляет тангенс.

Синтаксис
C

double tan( double x );

float tanf( float x );

long double tanl( long double x );

#define tan(x) // Requires C11 or higher

C++

float tan( float x ); // C++ only

long double tan( long double x ); // C++ only

Параметры
x

Угол в радианах.

Возвращаемое значение
Функции tan возвращают тангенс x . Если x значение больше или равно 263 или
меньше или равно -263, происходит потеря значимости в результате.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

± INF INVALID _DOMAIN

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки tan , которые
принимают и возвращают значения float или long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, tan всегда принимает
и возвращает . double

Если вы используете tan макрос из <tgmath.h> , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C++)

tan , tanf , tanl <math.h> <cmath> или <math.h>

tan Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_tan.c

// This program displays the tangent of pi / 4

// Compile by using: cl crt_tan.c

#include <math.h>

#include <stdio.h>

int main( void )

double pi = 3.1415926535;

double x;

x = tan( pi / 4 );

printf( "tan( %f ) = %f\n", pi/4, x );

Output

tan( 0.785398 ) = 1.000000

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acos, acosf, acosl

asin, asinf, asinl

atan, atanf, atanl, atan2, atan2f, atan2l

cos, cosf, cosl

sin, sinf, sinl

_CItan
tanh , tanhf , tanhl
Статья • 03.04.2023

Вычисляет гиперболический тангенс.

Синтаксис
C

double tanh( double x );

float tanhf( float x );


long double tanhl( long double x );

#define tanh(x) // Requires C11 or higher

C++

float tanh( float x ); // C++ only

long double tanh( long double x ); // C++ only

Параметры
x

Угол в радианах.

Возвращаемое значение
Функции tanh возвращают гиперболический тангенс x . Ошибка не возвращается.

Входные данные Исключение SEH _matherr Исключение

± QNaN, IND нет _DOMAIN

Комментарии
Поскольку C++ допускает перегрузку, можно вызывать перегрузки tanh , которые
принимают и возвращают значения float или long double . В программе C, если вы
не используете <tgmath.h> макрос для вызова этой функции, tanh всегда
принимает и возвращает . double
Если вы используете tanh макрос из <tgmath.h> , тип аргумента определяет, какая
версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок (C) Обязательный заголовок (C)

tanh , tanhf , tanhl <math.h> <cmath> или <math.h>

tanh Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_tanh.c

// This program displays the tangent of pi / 4

// and the hyperbolic tangent of the result.

// Compile by using: cl crt_tanh.c

#include <math.h>

#include <stdio.h>

int main( void )

double pi = 3.1415926535;

double x, y;

x = tan( pi / 4 );

y = tanh( x );

printf( "tan( %f ) = %f\n", pi/4, x );

printf( "tanh( %f ) = %f\n", x, y );

Output

tan( 0.785398 ) = 1.000000

tanh( 1.000000 ) = 0.761594

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
acosh, acoshf, acoshl

asinh, asinhf, asinhl

atanh, atanhf, atanhl


cosh, coshf, coshl

sinh, sinhf, sinhl


tell
Статья • 03.04.2023

Имя tell функции, зависят от Майкрософт, является устаревшим псевдонимом _tell


для функции. По умолчанию создается предупреждение компилятора (уровень 3)
C4996. Имя не рекомендуется, так как оно не соответствует стандартным правилам
C для имен, относящихся к реализации. Однако функция по-прежнему
поддерживается.

Вместо этого рекомендуется использовать _tell . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_tell , _telli64
Статья • 03.04.2023

Получает позицию указателя файла.

Синтаксис
C

long _tell(

int handle

);

__int64 _telli64(

int handle

);

Параметры
handle

Дескриптор файла, ссылающийся на открытый файл.

Возвращаемое значение
Текущая позиция указателя файла. Для устройств, которые не поддерживают поиск,
возвращаемое значение не определено.

Возвращаемое значение -1L указывает на ошибку. Если handle является


недопустимым дескриптором файла, вызывается обработчик недопустимых
параметров, как описано в разделе "Проверка параметров". Если выполнение
может быть продолжено, эти функции устанавливают параметр errno в значение
EBADF и возвращают –1L.

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrnoи


_sys_nerr_sys_errlist.

Комментарии
Функция _tell получает текущее положение указателя файла (при его наличии),
связанного с аргументом handle . Позиция выражается в виде количества байт от
начала файла. Для функции _telli64 это значение выражено в виде 64-разрядного
целого числа.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, ознакомьтесь с глобальным состоянием в CRT.

Требования
Подпрограмма Обязательный заголовок

_tell , _telli64 <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_tell.c

// This program uses _tell to tell the

// file pointer position after a file read.

//

#include <io.h>

#include <stdio.h>

#include <fcntl.h>

#include <share.h>

#include <string.h>

int main( void )

int fh;

char buffer[500];

if ( _sopen_s( &fh, "crt_tell.txt", _O_RDONLY, _SH_DENYNO, 0) )

char buff[50];

_strerror_s( buff, sizeof(buff), NULL );

printf( buff );

exit( -1 );

if( _read( fh, buffer, 500 ) > 0 )

printf( "Current file position is: %d\n", _tell( fh ) );

_close( fh );

Входные данные: crt_tell.txt


Input

Line one.

Line two.

Вывод
Output

Current file position is: 20

См. также
Низкоуровневый ввод-вывод

ftell, _ftelli64

_lseek, _lseeki64
tempnam
Статья • 03.04.2023

Имя tempnam функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _tempnam функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _tempnam . Вы также можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен предупреждений и
функций POSIX".
_tempnam , _wtempnam , tmpnam , _wtmpnam
Статья • 03.04.2023

Формирует имена, которые можно использовать для создания временных файлов.


Доступны более безопасные версии некоторых из этих функций; см.
,tmpnam_s_wtmpnam_s .

Синтаксис
C

char *_tempnam(

const char *dir,

const char *prefix

);

wchar_t *_wtempnam(

const wchar_t *dir,

const wchar_t *prefix

);

char *tmpnam(

char *str

);

wchar_t *_wtmpnam(

wchar_t *str

);

Параметры
prefix

Строка, которая добавляется к именам, возвращаемыми _tempnam .

dir

Путь, используемый в имени файла, если нет переменной среды TMP или если TMP
не является допустимым каталогом.

str

Указатель, содержащий созданное имя, идентичное имени, возвращаемого


функцией. Это удобный способ сохранить созданное имя.

Возвращаемое значение
Каждая из этих функций возвращает указатель на созданное имя или NULL в случае
сбоя. Сбой может произойти при попытке больше, чем TMP_MAX (см. STDIO). H)
вызывается или tmpnam используется _tempnam , а в переменной TMP среды и в dir
параметре указано недопустимое имя каталога.

7 Примечание

Указатели, возвращенные функциями tmpnam и _wtmpnam , указывают на


внутренние статические буфера. free не следует вызывать для освобождения
этих указателей. Функцию free необходимо вызывать для указателей,
размещенных в памяти функциями _tempnam и _wtempnam .

Комментарии
Каждая из этих функций возвращает имя файла, который в настоящее время не
существует. tmpnam возвращает имя, уникальное в указанном временном каталоге
Windows, возвращенном GetTempPathW. _tempnam создает уникальное имя в
каталоге, отличном от указанного. Если имя файла добавляется в обратную косую
черту и нет сведений о пути, например \fname21 , указывает, что имя допустимо для
текущего рабочего каталога.

В случае функции tmpnam это сформированное имя файла можно сохранить в


параметре str . Если параметр str имеет значение NULL , функция tmpnam оставляет
результат во внутреннем статическом буфере. Поэтому все последующие вызовы
уничтожают это значение. Имя, сформированное функцией tmpnam , состоит из
программно формируемого имени файла и, после первого вызова функции tmpnam ,
расширения файла из последовательных чисел с основанием 32 (.1–.vvu, если
параметр TMP_MAX в файле STDIO.H имеет значение 32 767).

_tempnam создает уникальное имя файла для каталога, выбранного следующими


правилами:

Если переменная среды TMP определена и задана как допустимое имя


каталога, для каталога, указанного TMP, создаются уникальные имена файлов.

Если переменная среды TMP не определена или задано имя каталога, который
не существует, использует dir параметр в качестве пути, _tempnam для
которого он создает уникальные имена.
Если переменная среды TMP не определена или задано имя каталога, который
не существует, и если dir он имеет имя NULL каталога, который не существует,
_tempnam использует текущий рабочий каталог для создания уникальных имен.

В настоящее время, если и TMP, и dir укажите имена каталогов, которые не


существуют, вызов функции _tempnam завершается ошибкой.

Возвращаемое _tempnam именем является объединение и последовательное число,


которое объединяется для создания уникального prefix имени файла для
указанного каталога. Функция _tempnam формирует имена файлов, не имеющие
расширение. _tempnam используется malloc для выделения пространства для имени
файла; программа отвечает за освобождение этого пространства, если оно больше
не требуется.

Функции _tempnam и tmpnam автоматически корректно обрабатывают


многобайтовые строковые аргументы, распознавая последовательности
многобайтовых символов согласно кодовой странице OEM, полученной из
операционной системы. _wtempnam  — это версия функции _tempnam для
расширенных символов; аргументы и возвращаемое значение функции _wtempnam
являются строками с расширенными символами. _wtempnam и _tempnam ведут себя
одинаково, за исключением того, что _wtempnam не обрабатывает многобайтовые
строки. _wtmpnam — это версия с расширенными символами для tmpnam ; аргумент и
возвращаемое значение _wtmpnam являются строками с расширенными символами.
_wtmpnam и tmpnam ведут себя одинаково, за исключением того, что _wtmpnam не
обрабатывает многобайтовые строки.

Если _DEBUG и _CRTDBG_MAP_ALLOC определены, _tempnam и _wtempnam заменяются


вызовами _tempnam_dbg и _wtempnam_dbg.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_ttmpnam tmpnam tmpnam _wtmpnam

_ttempnam _tempnam _tempnam _wtempnam

Требования
Подпрограмма Обязательный заголовок
Подпрограмма Обязательный заголовок

_tempnam <stdio.h>

_wtempnam , _wtmpnam <stdio.h> или <wchar.h>

tmpnam <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_tempnam.c

// compile with: /W3

// This program uses tmpnam to create a unique filename in the

// temporary directory, and _tempname to create a unique filename

// in C:\\tmp.

#include <stdio.h>

#include <stdlib.h>

int main(void)

char * name1 = NULL;

char * name2 = NULL;

char * name3 = NULL;

// Create a temporary filename for the current working directory:

if ((name1 = tmpnam(NULL)) != NULL) { // C4996

// Note: tmpnam is deprecated; consider using tmpnam_s instead

printf("%s is safe to use as a temporary file.\n", name1);

} else {

printf("Cannot create a unique filename\n");

// Create a temporary filename in temporary directory with the

// prefix "stq". The actual destination directory may vary

// depending on the state of the TMP environment variable and

// the global variable P_tmpdir.

if ((name2 = _tempnam("c:\\tmp", "stq")) != NULL) {

printf("%s is safe to use as a temporary file.\n", name2);

} else {

printf("Cannot create a unique filename\n");

// When name2 is no longer needed:

if (name2) {

free(name2);

// Unset TMP environment variable, then create a temporary filename in


C:\tmp.

if (_putenv("TMP=") != 0) {

printf("Could not remove TMP environment variable.\n");

// With TMP unset, we'll use C:\tmp as the temporary directory.


// Create a temporary filename in C:\tmp with prefix "stq".

if ((name3 = _tempnam("c:\\tmp", "stq")) != NULL) {

printf("%s is safe to use as a temporary file.\n", name3);

else {

printf("Cannot create a unique filename\n");

// When name3 is no longer needed:

if (name3) {

free(name3);

return 0;

Output

C:\Users\LocalUser\AppData\Local\Temp\sriw.0 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\stq2 is safe to use as a temporary


file.

c:\tmp\stq3 is safe to use as a temporary file.

См. также раздел


Потоковый ввод-вывод

_getmbcp

malloc

_setmbcp

tmpfile

tmpfile_s
_tempnam_dbg , _wtempnam_dbg
Статья • 03.04.2023

Версии _tempnamфункций , _wtempnam, tmpnam_wtmpnam которые используют


отладочную версию malloc , _malloc_dbg .

Синтаксис
C

char *_tempnam_dbg(

const char *dir,

const char *prefix,

int blockType,

const char *filename,

int linenumber

);

wchar_t *_wtempnam_dbg(

const wchar_t *dir,

const wchar_t *prefix,

int blockType,

const char *filename,

int linenumber

);

Параметры
dir

Путь, используемый в имени файла, если нет переменной среды TMP или если TMP
не является допустимым каталогом.

prefix

Строка, которая добавляется в начало имен, возвращаемых _tempnam .

blockType

Запрошенный тип блока памяти: _CLIENT_BLOCK или _NORMAL_BLOCK .

filename

Указатель на имя исходного файла, который запросил операцию выделения, или


NULL .

linenumber

Номер строки в исходном файле, в которой была запрошена операция выделения,


или NULL .

Возвращаемое значение
Каждая функция возвращает указатель на созданное имя или NULL при сбое. Сбой
может произойти, если в переменной среды TMP и параметре указано
недопустимое dir имя каталога.

7 Примечание

Не требуется вызывать free (или free_dbg ) для указателей, выделенных


функциями _tempnam_dbg и _wtempnam_dbg .

Комментарии
Функции _tempnam_dbg и _wtempnam_dbg идентичны _tempnam функциям и _wtempnam
за исключением того, что при _DEBUG определении они используют отладочную
версию malloc и _malloc_dbg для выделения памяти, если NULL передается в
качестве первого параметра. Для получения дополнительной информации см.
_malloc_dbg.

В большинстве случаев не нужно вызывать эти функции явным образом. Вместо


этого можно определить флаг _CRTDBG_MAP_ALLOC . Если определен флаг
_CRTDBG_MAP_ALLOC , вызовы функций _tempnam и _wtempnam повторно сопоставляются

с _tempnam_dbg и _wtempnam_dbg соответственно, а для параметра blockType задается


флаг _NORMAL_BLOCK . Таким образом, вам не нужно вызывать эти функции явным
образом, если вы не хотите пометить блоки кучи как _CLIENT_BLOCK .
Дополнительные сведения см. в разделе Типы блоков в отладочной куче.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные defined

_ttempnam_dbg _tempnam_dbg _tempnam_dbg _wtempnam_dbg

Требования
Подпрограмма Обязательный заголовок

_tempnam_dbg , _wtempnam_dbg <crtdbg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


_tempnam, _wtempnam, tmpnam, _wtmpnam

Потоковый ввод-вывод

Версии отладки функций выделения кучи


terminate (CRT)
Статья • 03.04.2023

Вызывает функцию abort или функцию, заданную с помощью set_terminate .

Синтаксис
C

void terminate( void );

Remarks
Функция terminate используется с обработкой исключений C++ и вызывается в
следующих случаях:

Не удается найти соответствующий обработчик catch для созданного


исключения C++.

исключение создано деструктором во время очистки стека;

стек поврежден после возникновения исключения.

По умолчанию terminate вызывает функцию abort. Это поведение по умолчанию


можно изменить, создав собственную функцию завершения и вызвав функцию
set_terminate с именем этой функции в качестве аргумента. terminate вызывает

последнюю функцию, заданную в качестве аргумента для функции set_terminate .


Дополнительные сведения см. в разделе Необработанные исключения C++.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

terminate <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C++

// crt_terminate.cpp

// compile with: /EHsc

#include <eh.h>

#include <process.h>

#include <iostream>

using namespace std;

void term_func();

int main()

int i = 10, j = 0, result;

set_terminate( term_func );

try

if( j == 0 )

throw "Divide by zero!";

else

result = i/j;

catch( int )

cout << "Caught some integer exception.\n";

cout << "This should never print.\n";

void term_func()

cout << "term_func() was called by terminate().\n";

// ... cleanup tasks performed here

// If this function does not exit, abort is called.

exit(-1);

Output

term_func() was called by terminate().

См. также раздел


Процедуры обработки исключений

abort

_set_se_translator
set_terminate

set_unexpected

unexpected
tgamma , tgammaf , tgammal
Статья • 03.04.2023

Определяет гамма-функцию указанного значения.

Синтаксис
C

double tgamma(

double x

);

float tgammaf(

float x

);

long double tgammal(

long double x

);

#define tgamma(X) // Requires C11 or higher

float tgamma(

float x

); //C++ only

long double tgamma(

long double x

); //C++ only

Параметры
x

Значение, для которого требуется найти гамму.

Возвращаемое значение
В случае успешного выполнения возвращает гамму x .

Ошибка диапазона может возникнуть, если величина x слишком большая или


слишком маленькая для типа данных. Ошибка домена или диапазона может
возникнуть, если x <= 0.
Проблема Возвращает

x = ±0 ±INFINITY

x = отрицательное целое число Не число

x = -INFINITY Не число

x = +INFINITY +INFINITY

x = не число не число

ошибка домена Не число

Ошибка полюса HUGE_VAL ±, ± HUGE_VALF или ± HUGE_VALL

Ошибка переполнения диапазона HUGE_VAL ±, ± HUGE_VALF или ± HUGE_VALL

ошибка недостаточного заполнения диапазона правильное значение (после округления).

Об ошибках сообщается, как указано в _matherr.

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции
tgamma , принимающие и возвращающие типы float и long double . В программе C,

если вы не используете <макрос tgmath.h> для вызова этой функции, tgamma


всегда принимает и возвращает double .

Если вы используете <макрос tgmath.h> tgamma() , тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в статье Обобщенная
математика типов.

Если x является натуральным числом, эта функция возвращает факториал (x – 1).

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Компонент Заголовок C Заголовок C++

tgamma , tgammaf , tgammal <math.h> <cmath>

tgamma Макрос <tgmath.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

lgamma, lgammaf, lgammal


time , _time32 , _time64
Статья • 03.04.2023

Возвращает системное время.

Синтаксис
C

time_t time( time_t *destTime );

__time32_t _time32( __time32_t *destTime );

__time64_t _time64( __time64_t *destTime );

Параметры
destTime

Указатель на место хранения для времени.

Возвращаемое значение
Возвращает время в секундах, прошедшее с полуночи, 1 января 1970 года, или -1
при наличии ошибки.

Комментарии
Функция time возвращает число секунд, истекших после полуночи (00:00:00) 1
января 1970 г. (в формате UTC) по системным часам. Возвращаемое значение
сохраняется в расположении, предоставленном destTime . Этот параметр может
иметь значение NULL , в этом случае возвращаемое значение не сохраняется.

time является оболочкой для _time64 , а time_t по умолчанию равнозначно


__time64_t . Если необходимо, чтобы компилятор принудительно интерпретировал

time_t как старое 32-разрядное значение time_t , можно определить


_USE_32BIT_TIME_T . Не рекомендуется _USE_32BIT_TIME_T , так как приложение может

завершиться сбоем после 18 января 2038 г.; использование этого макроса


запрещено на 64-разрядных платформах.

Требования
Подпрограмма Обязательный заголовок C Обязательный заголовок C++

time , _time32 , _time64 <time.h> <ctime> или <time.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_times.c

// compile with: /W3

// This program demonstrates these time and date functions:

// time _ftime ctime_s asctime_s

// _localtime64_s _gmtime64_s mktime _tzset

// _strtime_s _strdate_s strftime

//

// Also the global variable:

// _tzname

//

// Turn off deprecated unsafe CRT function warnings

#define _CRT_SECURE_NO_WARNINGS 1

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/timeb.h>

#include <string.h>

int main()

char tmpbuf[128], timebuf[26], ampm[] = "AM";

time_t ltime;

struct _timeb tstruct;

struct tm today, gmt, xmas = { 0, 0, 12, 25, 11, 93 };

errno_t err;

// Set time zone from TZ environment variable. If TZ is not set,

// the operating system is queried to obtain the default value


// for the variable.

//

_tzset();

// Display operating system-style date and time.

_strtime_s( tmpbuf, 128 );

printf( "OS time:\t\t\t\t%s\n", tmpbuf );

_strdate_s( tmpbuf, 128 );

printf( "OS date:\t\t\t\t%s\n", tmpbuf );

// Get UNIX-style time and display as number and string.

time( &ltime );

printf( "Time in seconds since UTC 1/1/70:\t%lld\n", (long long)ltime );

err = ctime_s(timebuf, 26, &ltime);

if (err)

printf("ctime_s failed due to an invalid argument.");

exit(1);

printf( "UNIX time and date:\t\t\t%s", timebuf );

// Display UTC.

err = _gmtime64_s( &gmt, &ltime );

if (err)

printf("_gmtime64_s failed due to an invalid argument.");

err = asctime_s(timebuf, 26, &gmt);

if (err)

printf("asctime_s failed due to an invalid argument.");

exit(1);

printf( "Coordinated universal time:\t\t%s", timebuf );

// Convert to time structure and adjust for PM if necessary.

err = _localtime64_s( &today, &ltime );

if (err)

printf("_localtime64_s failed due to an invalid argument.");

exit(1);

if ( today.tm_hour >= 12 )

strcpy_s( ampm, sizeof(ampm), "PM" );

today.tm_hour -= 12;

if ( today.tm_hour == 0 ) // Adjust if midnight hour.

today.tm_hour = 12;

// Convert today into an ASCII string

err = asctime_s(timebuf, 26, &today);

if (err)

printf("asctime_s failed due to an invalid argument.");

exit(1);

// Note how pointer addition is used to skip the first 11

// characters and printf is used to trim off terminating

// characters.

//

printf( "12-hour time:\t\t\t\t%.8s %s\n",

timebuf + 11, ampm );

// Print additional time information.

_ftime( &tstruct ); // C4996

// Note: _ftime is deprecated; consider using _ftime_s instead


printf( "Plus milliseconds:\t\t\t%u\n", tstruct.millitm );

printf( "Zone difference in hours from UTC:\t%u\n",

tstruct.timezone/60 );

printf( "Time zone name:\t\t\t\t%s\n", _tzname[0] ); //C4996

// Note: _tzname is deprecated; consider using _get_tzname

printf( "Daylight savings:\t\t\t%s\n",

tstruct.dstflag ? "YES" : "NO" );

// Make time for noon on Christmas, 1993.

if( mktime( &xmas ) != (time_t)-1 )

err = asctime_s(timebuf, 26, &xmas);

if (err)

printf("asctime_s failed due to an invalid argument.");

exit(1);

printf( "Christmas\t\t\t\t%s\n", timebuf );

// Use time structure to build a customized time string.

err = _localtime64_s( &today, &ltime );

if (err)

printf(" _localtime64_s failed due to invalid arguments.");

exit(1);

// Use strftime to build a customized time string.

strftime( tmpbuf, 128,

"Today is %A, day %d of %B in the year %Y.\n", &today );

printf( tmpbuf );

Output

OS time: 13:51:23

OS date: 04/25/03

Time in seconds since UTC 1/1/70: 1051303883

UNIX time and date: Fri Apr 25 13:51:23 2003

Coordinated universal time: Fri Apr 25 20:51:23 2003

12-hour time: 01:51:23 PM

Plus milliseconds: 552

Zone difference in hours from UTC: 8

Time zone name: Pacific Standard Time

Daylight savings: YES

Christmas Sat Dec 25 12:00:00 1993

Today is Friday, day 25 of April in the year 2003.

См. также раздел


Управление временем

asctime, _wasctime

asctime_s, _wasctime_s

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime, _localtime32, _localtime64

localtime_s, _localtime32_s, _localtime64_s

_utime, _utime32, _utime64, _wutime, _wutime32, _wutime64


timespec_get , _timespec32_get ,
_timespec64_get
Статья • 03.04.2023

Устанавливает интервал, на который указывает первый аргумент, в текущее


календарное время в соответствии с заданной базой времени.

Синтаксис
C

int timespec_get(

struct timespec* const time_spec,

int const base

);

int _timespec32_get(

struct _timespec32* const time_spec,

int const base

);

int _timespec64_get(

struct _timespec64* const time_spec,

int const base

);

Параметры
time_spec

Указатель на структуру, которой присваивается время в секундах и наносекундах с


начала эпохи.

base

Зависящее от реализации ненулевое значение, определяющее базу времени.

Возвращаемое значение
Значение base , если функция выполнена успешно; в противном случае
возвращает ноль.

Комментарии
Функция timespec_get присваивает текущее время структуре, на которую указывает
аргумент time_spec . Все версии этой структуры имеют два члена: tv_sec и tv_nsec .
Члену tv_sec присваивается целое число секунд, а члену tv_nsec — целое число
наносекунд, округленное до разрешения системных часов, с начала эпохи,
указанной в параметре base .

Блок, относящийся только к системам Microsoft

Эти функции допускают только TIME_UTC в качестве значения base .


TIME_UTC time_spec задает значение количества секунд и наносекунд с момента

начала эпохи, полуночи 1 января 1970 г. в формате UTC. В _timespec32 значение


tv_sec имеет тип __time32_t . В _timespec64 значение tv_sec имеет тип __time64_t .

timespec tv_sec В — это time_t тип, длина которого составляет 32 или 64 бита в

зависимости от того, определен ли макрос препроцессора _USE_32BIT_TIME_T.


Функция timespec_get является встроенной функцией, которая вызывает
_timespec32_get , если _USE_32BIT_TIME_T определен; в противном случае она
вызывает _timespec64_get .

Окончание конкретной службы Майкрософт

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

timespec_get , _timespec32_get , _timespec64_get C: <time.h>, C++: <ctime> или <time.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Управление временем

asctime, _wasctime

asctime_s, _wasctime_s

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

gmtime_s, _gmtime32_s, _gmtime64_s

localtime, _localtime32, _localtime64

localtime_s, _localtime32_s, _localtime64_s

time, _time32, _time64

_utime, _utime32, _utime64, _wutime, _wutime32, _wutime64


tmpfile
Статья • 03.04.2023

Создает временный файл. Эта функция является устаревшей, так как доступна
более безопасная версия; см. раздел tmpfile_s.

Синтаксис
C

FILE *tmpfile( void );

Возвращаемое значение
В случае успешного выполнения tmpfile возвращает указатель на поток. В
противном случае возвращается указатель NULL .

Комментарии
Функция tmpfile создает временный файл и возвращает указатель на этот поток.
Временный файл создается в корневом каталоге. Чтобы создать временный файл в
каталоге, отличном от корневого каталога, используйте tmpnam или tempnam с
fopen.

Если файл не удается открыть, tmpfile возвращает NULL указатель. Этот временный
файл автоматически удаляется при закрытии файла, при нормальном завершении
программы или при _rmtmp вызове при условии, что текущий рабочий каталог не
изменяется. Временный файл открывается в режиме w+b (двоичное чтение и
запись).

Сбой может возникать при попытке выполнить более TMP_MAX (см. STDIO.H)
вызовов с параметром tmpfile .

Требования
Подпрограмма Обязательный заголовок

tmpfile <stdio.h>
Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример

7 Примечание

В этом примере требуются права администратора для работы в Windows Vista.

// crt_tmpfile.c

// compile with: /W3

// This program uses tmpfile to create a

// temporary file, then deletes this file with _rmtmp.

#include <stdio.h>

int main( void )

FILE *stream;

int i;

// Create temporary files.

for( i = 1; i <= 3; i++ )

if( (stream = tmpfile()) == NULL ) // C4996

// Note: tmpfile is deprecated; consider using tmpfile_s instead

perror( "Could not open new temporary file\n" );

else

printf( "Temporary file %d was created\n", i );


}

// Remove temporary files.

printf( "%d temporary files deleted\n", _rmtmp() );

Output

Temporary file 1 was created

Temporary file 2 was created

Temporary file 3 was created

3 temporary files deleted

См. также раздел


Потоковый ввод-вывод

_rmtmp

_tempnam, _wtempnam, tmpnam, _wtmpnam


tmpfile_s
Статья • 03.04.2023

Создает временный файл. Это версия tmpfile с улучшениями безопасности, как


описано в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t tmpfile_s(

FILE** pFilePtr

);

Параметры
pFilePtr

Адрес указателя для хранения адреса созданного указателя на поток.

Возвращаемое значение
Возвращает 0 в случае успеха или код ошибки в случае неудачи.

Условия ошибок

pFilePtr Возвращаемое значение Содержимое pFilePtr

NULL EINVAL не изменено

При возникновении приведенной выше ошибки проверки параметров вызывается


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

Комментарии
Функция tmpfile_s создает временный файл и помещает указатель на этот поток в
аргумент pFilePtr . Временный файл создается в корневом каталоге. Чтобы создать
временный файл в каталоге, отличном от корневого, используйте tmpnam_s или
tempnam с fopen.

Если файл не удается открыть, tmpfile_s выполняет запись NULL в pFilePtr


параметр . Этот временный файл автоматически удаляется при закрытии файла,
при нормальном завершении работы программы или при _rmtmp вызове при
условии, что текущий рабочий каталог не изменяется. Временный файл
открывается в режиме w+b (двоичное чтение и запись).

Сбой может произойти при попытке более чем TMP_MAX_S (см. STDIO. H) вызывает с
tmpfile_s .

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

tmpfile_s <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример

7 Примечание

Для запуска этого примера в Windows могут потребоваться права


администратора.

// crt_tmpfile_s.c

// This program uses tmpfile_s to create a

// temporary file, then deletes this file with _rmtmp.

//

#include <stdio.h>

int main( void )

FILE *stream;

char tempstring[] = "String to be written";

int i;

errno_t err;

// Create temporary files.

for( i = 1; i <= 3; i++ )

err = tmpfile_s(&stream);

if( err )

perror( "Could not open new temporary file\n" );

else

printf( "Temporary file %d was created\n", i );


}

// Remove temporary files.

printf( "%d temporary files deleted\n", _rmtmp() );

Output

Temporary file 1 was created

Temporary file 2 was created

Temporary file 3 was created

3 temporary files deleted

См. также раздел


Потоковый ввод-вывод

_rmtmp

_tempnam, _wtempnam, tmpnam, _wtmpnam


tmpnam_s , _wtmpnam_s
Статья • 03.04.2023

Формирует имена, которые можно использовать для создания временных файлов.


Эти функции являются версиями и _wtmpnamулучшениямиtmpnam безопасности,
как описано в функциях безопасности в CRT.

Синтаксис
C

errno_t tmpnam_s(

char * str,

size_t sizeInChars

);

errno_t _wtmpnam_s(

wchar_t *str,

size_t sizeInChars

);

template <size_t size>

errno_t tmpnam_s(

char (&str)[size]

); // C++ only

template <size_t size>

errno_t _wtmpnam_s(

wchar_t (&str)[size]

); // C++ only

Параметры
str

[out] Указатель, содержащий созданное имя.

sizeInChars

[in] Размер буфера в символах.

Возвращаемое значение
Обе эти функции возвращают 0 в случае успеха или номер ошибки в случае сбоя.

Условия ошибок
str sizeInChars Возвращаемое Содержимое
значение str

NULL any EINVAL не изменено

не NULL (указывает на допустимую слишком ERANGE не изменено


память) короткий

В противном str случае NULL вызывается обработчик недопустимых параметров,


как описано в разделе "Проверка параметров". Если выполнение может быть
продолжено, эти функции устанавливают параметр errno в значение EINVAL и
возвращают значение EINVAL .

Комментарии
Каждая из этих функций возвращает имя файла, который в настоящее время не
существует. tmpnam_s возвращает имя, уникальное в указанном временном каталоге
Windows, возвращенном .GetTempPathW Если имя файла добавляется в обратную
косую черту и нет сведений о пути, например \fname21 , указывает, что имя
допустимо для текущего рабочего каталога.

В случае функции tmpnam_s это сформированное имя файла можно сохранить в


параметре str . Максимальная длина строки, возвращенной tmpnam_s  — L_tmpnam_s
(задано в STDIO.H). Если параметр str имеет значение NULL , функция tmpnam_s
оставляет результат во внутреннем статическом буфере. Поэтому все последующие
вызовы уничтожают это значение. Имя, созданное программой tmpnam_s , состоит
из имени файла, созданного программой, и после первого вызова
tmpnam_s расширения файла последовательных чисел в base 32 (.1-.1vvvvu, когда
TMP_MAX_S в STDIO). H is INT_MAX ).

Функция tmpnam_s автоматически обрабатывает многобайтовые строковые


аргументы должным образом, распознавая последовательности многобайтовых
символов согласно кодовой странице OEM, полученной из операционной системы.
_wtmpnam_s — это версия с расширенными символами для tmpnam_s ; аргумент и
возвращаемое значение _wtmpnam_s являются строками с расширенными
символами. _wtmpnam_s и tmpnam_s ведут себя одинаково, за исключением того, что
_wtmpnam_s не обрабатывает многобайтовые строки.

В C++ использование этих функций упрощено шаблонными перегрузками;


перегрузки могут определить длину буфера автоматически, устраняя
необходимость указывать аргумент size. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_ttmpnam_s tmpnam_s tmpnam_s _wtmpnam_s

Требования
Подпрограмма Обязательный заголовок

tmpnam_s <stdio.h>

_wtmpnam_s <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_tmpnam_s.c

// This program uses tmpnam_s to create a unique filename in the

// current working directory.

//

#include <stdio.h>

#include <stdlib.h>

int main( void )

char name1[L_tmpnam_s];

errno_t err;

int i;

for (i = 0; i < 15; i++)

err = tmpnam_s( name1, L_tmpnam_s );

if (err)

printf("Error occurred creating unique filename.\n");

exit(1);

else

printf( "%s is safe to use as a temporary file.\n", name1 );

Output

C:\Users\LocalUser\AppData\Local\Temp\u19q8.0 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.1 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.2 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.3 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.4 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.5 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.6 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.7 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.8 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.9 is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.a is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.b is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.c is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.d is safe to use as a temporary


file.

C:\Users\LocalUser\AppData\Local\Temp\u19q8.e is safe to use as a temporary


file.

См. также раздел


Потоковый ввод-вывод

_getmbcp

malloc

_setmbcp

tmpfile_s
toascii , __toascii
Статья • 03.04.2023

Преобразуют символы в 7-разрядный код ASCII методом усечения.

Синтаксис
C

int __toascii(

int c

);

#define toascii __toascii

Параметры
c

Символ для преобразования.

Возвращаемое значение
Функция __toascii преобразует значение c в 7-разрядный диапазон ASCII и
возвращает результат. Возвращаемое значение, указывающее на ошибку, не
зарезервировано.

Комментарии
Подпрограмма __toascii преобразует заданный символ в символ ASCII путем его
усечения до 7 бит в прямом порядке. Никакие другие преобразования не
применяются.

Подпрограмма __toascii определяется как макрос, если не определен макрос


_CTYPE_DISABLE_MACROS препроцессора. Для обратной совместимости определяется

как макрос, toascii только если __STDC__ не определен или определен как 0; в
противном случае он не определен.

Требования
Подпрограмма Обязательный заголовок

toascii , __toascii C: <ctype.h>

C++: <cctype> или <ctype.h>

Макрос toascii является расширением POSIX, а __toascii является реализацией


Майкрософт расширения POSIX. Дополнительные сведения о совместимости см. в
разделе Compatibility.

См. также:
Преобразование данных

is, isw подпрограммы

Функции to
tolower , _tolower , towlower ,
_tolower_l , _towlower_l
Статья • 03.04.2023

Преобразует символ в строчный.

Синтаксис
C

int tolower(

int c

);

int _tolower(

int c

);

int towlower(

wint_t c

);

int _tolower_l(

int c,

_locale_t locale

);

int _towlower_l(

wint_t c,

_locale_t locale

);

Параметры
c

Символ для преобразования.

locale

Языковой стандарт для перевода в определенном языковом стандарте.

Возвращаемое значение
Каждая из этих подпрограмм преобразует копию c в строчный символ, если это
преобразование возможно, и возвращает результат. Возвращаемое значение,
указывающее на ошибку, не зарезервировано.
Комментарии
Каждая из этих процедур преобразует прописную букву в строчную, если это
возможно и уместно. Преобразование регистра towlower зависит от языкового
стандарта. Изменяются только символы, соответствующие текущему языковому
стандарту. Функции без суффикса _l используют текущий языковой стандарт.
Версии этих функций, имеющие суффикс _l , идентичны функциям без суффикса, за
исключением того, что они принимают языковой стандарт в качестве параметра и
используют его вместо текущего языкового стандарта. Для получения
дополнительной информации см. Locale.

Для того, _tolower чтобы дать ожидаемые результаты, __isascii и isupper должны
оба возвращать ненулевое значение.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_totlower tolower _mbctolower towlower

_totlower_l _tolower_l _mbctolower_l _towlower_l

7 Примечание

Функции _tolower_l и _towlower_l не зависят от языкового стандарта и не


предназначены для непосредственного вызова. Они предназначены для
внутреннего использования _totlower_l .

Требования
Подпрограмма Обязательный заголовок

tolower <ctype.h>

_tolower <ctype.h>

towlower <ctype.h> или <wchar.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в to разделе Функции.

См. также:
Преобразование данных

is, isw подпрограммы

Функции to

Локаль

Интерпретация последовательностей многобайтовых символов


toupper , _toupper , towupper ,
_toupper_l , _towupper_l
Статья • 03.04.2023

Преобразуют символ в верхний регистр.

Синтаксис
C

int toupper(

int c

);

int _toupper(

int c

);

int towupper(

wint_t c

);

int _toupper_l(

int c ,

_locale_t locale

);

int _towupper_l(

wint_t c ,

_locale_t locale

);

Параметры
c

Символ для преобразования.

locale

Используемый языковой стандарт.

Возвращаемое значение
Каждая из этих подпрограмм преобразует копию c , если это преобразование
возможно, и возвращает результат.
Если c является расширенным символом, для которого iswlower имеется
ненулевое значение, а для которого iswupper имеется соответствующий
расширенный символ, towupper возвращается соответствующий расширенный
символ; towupper в противном случае возвращается c без изменений.

Возвращаемое значение, указывающее на ошибку, не зарезервировано.

Для того, чтобы toupper дать ожидаемые результаты, __isascii и islower оба должны
возвращать ненулевое значение.

Комментарии
Каждая из этих подпрограмм преобразует указанную строчную букву в прописную,
если это возможно и уместно. Преобразование регистра towupper зависит от
языкового стандарта. Изменяются только символы, соответствующие текущему
языковому стандарту. Функции без суффикса _l используют текущий языковой
стандарт. Версии этих функций с суффиксом _l идентичны функциям без суффикса,
за исключением того, что они принимают языковой стандарт в качестве параметра
и используют его вместо текущего языкового стандарта. Для получения
дополнительной информации см. Locale.

Для того, чтобы toupper дать ожидаемые результаты, __isascii и isupper оба должны
возвращать ненулевое значение.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_totupper toupper _mbctoupper towupper

_totupper_l _toupper_l _mbctoupper_l _towupper_l

7 Примечание

Функции _toupper_l и _towupper_l не зависят от языкового стандарта и не


предназначены для непосредственного вызова. Они предназначены для
внутреннего использования _totupper_l .

Требования
Подпрограмма Обязательный заголовок

toupper <ctype.h>

_toupper <ctype.h>

towupper <ctype.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример в to разделе Функции.

См. также раздел


is, isw подпрограммы

Функции to

Локаль

Интерпретация последовательностей многобайтовых символов


towctrans
Статья • 03.04.2023

Преобразует символ.

Синтаксис
C

wint_t towctrans(

wint_t c,

wctrans_t category

);

Параметры
c

Символ, который требуется преобразовать.

category

Идентификатор, содержащий возвращаемое значение wctrans.

Возвращаемое значение
Символ c после того, как функция towctrans использовала правило
преобразования в категории category .

Комментарии
Значение category должно быть возвращено ранее успешным вызовом wctrans.

Требования
Подпрограмма Обязательный заголовок

towctrans <wctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
Пример использования функции wctrans см. в разделе towctrans .

См. также:
Преобразование данных
trunc , truncf , truncl
Статья • 03.04.2023

Определяют ближайшего целое число, которое меньше или равно заданному


значению с плавающей запятой.

Синтаксис
C

double trunc( double x );

long double truncl( long double x );


#define trunc(X) // Requires C11 or higher

long double trunc( long double x ); //C++ only

float trunc( float x ); //C++ only

Параметры
x

Значение для усечения.

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

В противном случае функции могут возвращать одно из следующих значений:

Проблема Возвращает

x = ±INFINITY x

x = ±0 x

x = не число не число

Ошибки отображаются в соответствии с указанными в _matherr.

Комментарии
Поскольку C++ допускает перегрузки, можно вызывать перегрузки функции trunc ,
принимающие и возвращающие типы float и long double . В программе на языке
C, если вы не используете <макрос tgmath.h> для вызова этой функции, trunc
всегда принимает и возвращает double .

При использовании <макроса tgmath.h> trunc() тип аргумента определяет, какая


версия функции выбрана. Дополнительные сведения см. в разделе Типообразная
математика .

Поскольку самые большие значения с плавающей запятой являются точными


целыми числами, эта функция не будет переполнена сама по себе. Тем не менее
можно вызвать переполнение этой функции, возвращая значение в
целочисленный тип.

Можно также округлять в меньшую сторону, выполняя неявное преобразование из


типа с плавающей запятой в целочисленный тип; однако это можно делать только
со значениями, которые могут храниться в целевом типе.

Требования
Компонент Заголовок C Заголовок C++

trunc , truncf , truncl <math.h> <cmath>

trunc Макрос <tgmath.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Алфавитный указатель функций

floor, floorf, floorl

ceil, ceilf, ceill

round, roundf, roundl


tzset
Статья • 03.04.2023

Имя tzset функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _tzset для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _tzset . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_tzset
Статья • 03.04.2023

Задает переменные среды, относящиеся ко времени.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

void _tzset( void );

Remarks
Функция _tzset использует текущую настройку переменной среды TZ для
присвоения значения трем глобальным переменным: _daylight , _timezone и
_tzname . Эти переменные используются функциями _ftime и localtime для внесения

исправлений от времени UTC к местному времени, а time функция вычисляет


время в формате UTC из системного времени. Для задания переменной среды TZ
используйте следующий синтаксис:

set TZ= tzn [ + | - ] hh [ : mm [: ss ] ][ dzn ]

tzn

Трехбуквенное имя часового пояса, например, PST. Необходимо указать


правильное смещение локального времени относительно времени в формате UTC.

hh

Различие в часах между временем в формате UTC и местным временем. Знак (+)
для положительных значений необязателен.

mm

Минуты. Отделяются от hh двоеточием ( : ).


ss

Секунды. Отделяются от mm двоеточием ( : ).

dzn

Трехбуквенный часовой пояс с переходом на летнее время, например, PDT. Если в


местоположении летнее время не действует, установите TZ без значения для dzn .
Библиотека времени выполнения C принимает правила США для реализации
проверки на летнее время (DST).

7 Примечание

Не забывайте о вычислении знака разницы во времени. Поскольку разница во


времени является смещением локального времени относительно времени в
формате UTC (а не наоборот), ее знак может отличаться от интуитивно
ожидаемого. Для часовых поясов до пояса времени в формате UTC разница во
времени отрицательная; для часовых поясов после пояса времени в формате
UTC разница положительная.

Например, чтобы задать TZ переменную среды в соответствии с текущим часовой


поясом в Германии, введите следующую команду в командной строке:

set TZ=GST-1GDT

Эта команда использует GST для обозначения немецкого стандартного времени.


Предполагается, что ВРЕМЯ UTC на один час отстает от Германии (или, другими
словами, Германия на один час опережает UTC). И, он предполагает, что Германия
наблюдает летнее время.

TZ Если значение не задано, пытается использовать сведения о часовом поясе,


_tzset указанные операционной системой. В операционной системе Windows эти

данные определяются в приложении Дата/время в Панели управления. Если


_tzset не удается получить эти сведения, по умолчанию используется PST8PDT, что

означает тихоокеанский часовой пояс.

На основе значения переменной среды TZ при вызове функции


_daylight глобальным переменным _timezone , _tzname и _tzset присваиваются

следующие значения:

Глобальная Описание Значение


переменная по
умолчанию
Глобальная Описание Значение
переменная по
умолчанию

_daylight Ненулевое значение, если в параметре TZ задан часовой пояс 1


с переходом на летнее время; в противном случае —
значение 0.

_timezone Разница в секундах между местным временем и временем в 28800 (28


формате UTC. 800 секунд
— 8 часов)

_tzname[0] Строковое значение имени часового пояса из TZ переменной PST


среды; пустое, если TZ оно не задано.

_tzname[1] Строковое значение часового пояса с переходом на летнее PDT


время; пусто, если часовой пояс с переходом на летнее время
опущен в переменной среды TZ .

Значения по умолчанию, показанные в предыдущей таблице для _daylight и


массива _tzname , соответствуют "PST8PDT". Если зона DST не указана в TZ
переменной среды, значение _daylight равно 0, а _ftimeфункции , gmtimeи
localtime возвращают 0 для флагов DST.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_tzset <time.h>

Функция _tzset зависит от Корпорации Майкрософт. Дополнительные сведения


см. в разделе Совместимость.

Пример
C

// crt_tzset.cpp

// This program uses _tzset to set the global variables

// named _daylight, _timezone, and _tzname. Since TZ is

// not being explicitly set, it uses the system time.

#include <time.h>

#include <stdlib.h>

#include <stdio.h>

int main( void )

_tzset();

int daylight;

_get_daylight( &daylight );

printf( "_daylight = %d\n", daylight );

long timezone;

_get_timezone( &timezone );

printf( "_timezone = %ld\n", timezone );

size_t s;

char tzname[100];

_get_tzname( &s, tzname, sizeof(tzname), 0 );

printf( "_tzname[0] = %s\n", tzname );

exit( 0 );

Output

_daylight = 1

_timezone = 28800

_tzname[0] = Pacific Standard Time

См. также раздел


Управление временем

asctime, _wasctime

_ftime, _ftime32, _ftime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

time, _time32, _time64

_utime, _utime32, _utime64, _wutime, _wutime32, _wutime64


umask
Статья • 03.04.2023

Имя umask функции POSIX, реализованное корпорацией Майкрософт, является


устаревшим псевдонимом для _umask функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _umask или функцию с повышенным


уровнем _umask_s безопасности. Вы также можете продолжать использовать это
имя функции и отключить предупреждение. Дополнительные сведения см. в
разделе "Отключение имен предупреждений и функций POSIX".
_umask
Статья • 03.04.2023

Задает маску разрешений файла по умолчанию. Более безопасную версию этой


функции см. в разделе _umask_s .

Синтаксис
C

int _umask( int pmode );

Параметры
pmode

Параметр разрешения по умолчанию.

Возвращаемое значение
_umask возвращает предыдущее значение pmode . Ошибка не возвращается.

Комментарии
Функция _umask задает для маски разрешений файла текущего процесса режим,
указанный pmode . Маска разрешений файла изменяет параметр разрешения для
новых файлов, созданных _creat , _open или _sopen . Если бит в битовой маске
равен 1, соответствующий бит в запрошенном значении разрешения имеет
значение 0 (запрещено). Если бит в битовой маске равен 0, соответствующий бит
остается без изменений. Параметр разрешения для нового файла не задается, пока
файл не будет закрыт в первый раз.

Целочисленное выражение pmode содержит одну или обе следующие константы


манифеста, определенные в SYS\STAT.H :

pmode Описание

_S_IWRITE Разрешена запись.

_S_IREAD Разрешено чтение.


pmode Описание

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

При указании обеих констант они объединяются с побитовой оператором OR ( | ).


pmode Если аргумент имеет значение _S_IREAD , чтение не допускается (файл

доступен только для записи). pmode Если аргумент имеет значение _S_IWRITE , запись
не разрешена (файл доступен только для чтения). Например, если в маске
установлен бит записи, все новые файлы будут доступны только для чтения. В MS-
DOS и операционных системах Windows все файлы доступны для чтения;
невозможно предоставить разрешение только на запись. Таким образом,
установка бита чтения с помощью _umask не влияет на режимы файла.

Если pmode не является сочетанием одной из констант манифеста или включает


альтернативный набор констант, функция игнорирует их.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе "Глобальное состояние" в CRT.

Требования
Компонент Обязательный заголовок

_umask <io.h> , <sys/stat.h> , <sys/types.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_umask.c

// compile with: /W3

// This program uses _umask to set

// the file-permission mask so that all future

// files will be created as read-only files.

// It also displays the old mask.


#include <sys/stat.h>

#include <sys/types.h>

#include <io.h>

#include <stdio.h>

int main( void )

int oldmask;

/* Create read-only files: */

oldmask = _umask( _S_IWRITE ); // C4996

// Note: _umask is deprecated; consider using _umask_s instead

printf( "Oldmask = 0x%.4x\n", oldmask );

Output

Oldmask = 0x0000

См. также раздел


Обработка файлов

Низкоуровневый ввод-вывод

_chmod, _wchmod

_creat, _wcreat

_mkdir, _wmkdir

_open, _wopen
_umask_s
Статья • 03.04.2023

Задает маску разрешений файла по умолчанию. Версия _umask с


усовершенствованиями безопасности, как описано в функциях безопасности в CRT.

Синтаксис
C

errno_t _umask_s(

int mode,

int* pOldMode

);

Параметры
mode

Параметр разрешения по умолчанию.

pOldMode

Прежнее значение параметра разрешения.

Возвращаемое значение
Возвращает код ошибки, если mode не указан допустимый режим или pOldMode
указатель NULL .

Условия ошибок

mode pOldMode Возвращаемое значение Содержимое pOldMode

any NULL EINVAL не изменено

недопустимый режим any EINVAL не изменено

Если возникает одно из указанных выше условий, вызывается обработчик


недопустимых параметров, как описано в разделе "Проверка параметров". Если
выполнение может быть продолжено, функция _umask_s возвращает значение
EINVAL и устанавливает параметр errno в значение EINVAL .
Комментарии
Функция _umask_s задает для маски разрешений файла текущего процесса режим,
указанный mode . Маска разрешений файла изменяет параметр разрешения для
новых файлов, созданных _creat , _open или _sopen . Если бит в битовой маске
равен 1, соответствующий бит в запрошенном значении разрешения имеет
значение 0 (запрещено). Если бит в битовой маске равен 0, соответствующий бит
остается без изменений. Параметр разрешения для нового файла не задается, пока
файл не будет закрыт в первый раз.

Целочисленное выражение mode содержит одну или обе следующие константы


манифеста, определенные в SYS\STAT.H :

mode Описание

_S_IWRITE Разрешена запись.

_S_IREAD Разрешено чтение.

_S_IREAD | _S_IWRITE Разрешены чтение и запись.

При указании обеих констант они объединяются с побитовой оператором OR ( | ).


mode Если аргумент имеет значение _S_IREAD , чтение не допускается (файл доступен

только для записи). mode Если аргумент имеет значение _S_IWRITE , запись не
разрешена (файл доступен только для чтения). Например, если в маске установлен
бит записи, все новые файлы будут доступны только для чтения. В MS-DOS и
операционных системах Windows все файлы доступны для чтения; невозможно
предоставить разрешение только на запись. Таким образом, установка бита чтения
с помощью _umask_s не влияет на режимы файла.

Если mode не является сочетанием одной из констант манифеста или включает


альтернативный набор констант, функция игнорирует их.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении см. в разделе "Глобальное состояние" в CRT.

Требования
Компонент Обязательный заголовок

_umask_s <io.h> и <sys/stat.h> <sys/types.h>


Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_umask_s.c

/* This program uses _umask_s to set

* the file-permission mask so that all future

* files will be created as read-only files.

* It also displays the old mask.

*/

#include <sys/stat.h>

#include <sys/types.h>

#include <io.h>

#include <stdio.h>

int main( void )

int oldmask, err;

/* Create read-only files: */

err = _umask_s( _S_IWRITE, &oldmask );

if (err)

printf("Error setting the umask.\n");

exit(1);

printf( "Oldmask = 0x%.4x\n", oldmask );

Output

Oldmask = 0x0000

См. также раздел


Обработка файлов

Низкоуровневый ввод-вывод

_chmod, _wchmod

_creat, _wcreat

_mkdir, _wmkdir

_open, _wopen

_umask
__uncaught_exception
Статья • 03.04.2023

Указывает, было ли создано одно или несколько исключений, но еще не


обработаны соответствующим catch блоком инструкции try-catch .

Синтаксис
C++

bool __uncaught_exception();

Возвращаемое значение
Значение true с момента возникновения исключения в блоке try и до
инициализации соответствующего блока catch ; в противном случае — false .

Remarks

Требования
Подпрограмма Обязательный заголовок

__uncaught_exception <eh.h>

См. также раздел


Операторы try, throw и catch (C++)
unexpected (CRT)
Статья • 03.04.2023

Вызовы terminate или функция, указанная с помощью . set_unexpected

Синтаксис
C

void unexpected( void );

Remarks
Подпрограмма unexpected не используется с текущей реализацией обработки
исключений C++. По умолчанию unexpected вызывает функцию terminate . Это
поведение по умолчанию можно изменить, написав пользовательскую функцию
завершения. Вызов set_unexpected с именем функции в качестве аргумента.
unexpected вызывает последнюю переданную функцию set_unexpected .

Требования
Подпрограмма Обязательный заголовок

unexpected <eh.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Процедуры обработки исключений

abort

_set_se_translator
set_terminate

set_unexpected

terminate
ungetc , ungetwc
Статья • 03.04.2023

Помещает символ обратно в поток.

Синтаксис
C

int ungetc(

int c,

FILE *stream

);

wint_t ungetwc(

wint_t c,

FILE *stream

);

Параметры
c

Символ, который требуется поместить обратно.

stream

Указатель на структуру FILE .

Возвращаемое значение
При успешном выполнении каждая из этих функций возвращает аргумент символа
c . Если c не удается отодвинуть назад или символ не был считан, входной поток

не изменяется и ungetc возвращает EOF значение ; ungetwc возвращает WEOF . Если


stream имеет значение NULL , вызывается обработчик недопустимых параметров,
как описано в разделе Проверка параметров. Если выполнение разрешено для
продолжения или EOF WEOF возвращается, а errno для задано значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция ungetc помещает символ c обратно в stream и удаляет индикатор конца
файла. Поток должен быть открыт для чтения. Последующая операция чтения в
stream начинается с c . Попытка отправить EOF в поток с помощью ungetc

игнорируется.

Символы, помещенные в поток с помощью ungetc , могут быть удалены, если


fflush , fseek, fsetpos или rewind вызывается перед считыванием символа из

потока. Индикатор позиции в файле будет иметь значение, которое было до


помещения символов обратно. Внешнее хранилище, соответствующее потоку, не
изменяется. При успешном вызове ungetc для текстового потока индикатор
позиции в файле будет не задан до тех пор, пока все помещенные обратно
символы не будут считаны или удалены. При каждом успешном вызове ungetc для
двоичного потока индикатор позиции файла уменьшается; если перед вызовом он
имел значение 0, то после вызова его значение будет неопределенным.

Если ungetc вызывается дважды без выполнения между вызовами операции


чтения или размещения в файле, результаты будут непредсказуемыми. После
вызова fscanf вызов может завершиться ungetc ошибкой, если не была выполнена
другая операция чтения (например, ), так как fscanf getc сам вызывает ungetc .

ungetwc  — это версия функции ungetc для расширенных символов. Однако при

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

Эти функции являются потокобезопасными и блокируют конфиденциальные


данные во время выполнения. Сведения о неблокироваемой версии см. в разделе
_ungetc_nolock, _ungetwc_nolock.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_ungettc ungetc ungetc ungetwc

Требования
Подпрограмма Обязательный заголовок

ungetc <stdio.h>

ungetwc <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C

смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_ungetc.c

// This program first converts a character

// representation of an unsigned integer to an integer. If

// the program encounters a character that is not a digit,

// the program uses ungetc to replace it in the stream.

//

#include <stdio.h>

#include <ctype.h>

int main( void )

int ch;

int result = 0;

// Read in and convert number:

while( ((ch = getchar()) != EOF) && isdigit( ch ) )

result = result * 10 + ch - '0'; // Use digit.

if( ch != EOF )

ungetc( ch, stdin ); // Put nondigit back.

printf( "Number = %d\nNext character in stream = '%c'",

result, getchar() );

Output

521aNumber = 521

Next character in stream = 'a'

См. также раздел


Потоковый ввод-вывод

getc, getwc

putc, putwc
_ungetc_nolock , _ungetwc_nolock
Статья • 03.04.2023

Помещает символ обратно в поток.

Синтаксис
C

int _ungetc_nolock(

int c,

FILE *stream

);

wint_t _ungetwc_nolock(

wint_t c,

FILE *stream

);

Параметры
c

Символ, который требуется поместить обратно.

stream

Указатель на структуру FILE .

Возвращаемое значение
При успешном выполнении каждая из этих функций возвращает аргумент символа
c . Если c не удается отодвинуть назад или если ни одного символа не было

считано, входной поток не изменяется и _ungetc_nolock возвращает EOF значение ;


_ungetwc_nolock возвращает WEOF . Если stream имеет значение NULL , EOF или WEOF
возвращается, а errno для задано значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Эти функции представляют собой неблокирующие версии функций ungetc и
ungetwc . Версии с суффиксом _nolock идентичны, за исключением того, что они не
защищены от помех со стороны других потоков. Они могут выполняться быстрее,
так как они не несут накладных расходов, связанных с блокировкой других
потоков. Используйте эти функции только в потокобезопасных контекстах,
например в однопоточных приложениях или если вызываемая область уже
обрабатывает изоляцию потоков.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_ungettc_nolock _ungetc_nolock _ungetc_nolock _ungetwc_nolock

Требования
Подпрограмма Обязательный заголовок

_ungetc_nolock <stdio.h>

_ungetwc_nolock <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

getc, getwc

putc, putwc
ungetch
Статья • 03.04.2023

Имя ungetch функции, зависят от Корпорации Майкрософт, является устаревшим


псевдонимом для _ungetch функции. По умолчанию создается предупреждение
компилятора (уровень 3) C4996. Имя не рекомендуется, так как оно не
соответствует стандартным правилам C для имен, относящихся к реализации.
Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _ungetch . Вы также можете продолжать


использовать это имя функции и отключить предупреждение. Дополнительные
сведения см. в разделе "Отключение имен предупреждений и функций POSIX".

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.
_ungetch , _ungetwch , _ungetch_nolock ,
_ungetwch_nolock
Статья • 03.04.2023

Помещает обратно последний символ, считанный из консоли.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _ungetch(

int c

);

wint_t _ungetwch(

wint_t c

);

int _ungetch_nolock(

int c

);

wint_t _ungetwch_nolock(

wint_t c

);

Параметры
c

Символ, который требуется поместить обратно.

Возвращаемое значение
Обе функции возвращают символ c в случае успешного выполнения. При
возникновении ошибки _ungetch возвращает значение EOF и _ungetwch . WEOF
Комментарии
Эти функции отправляют символ c обратно в консоль, что приводит c к
следующему символу, прочитанного _getch или _getche (или _getwch _getwche ).
_ungetch и _ungetwch завершаются ошибкой, если они вызываются несколько раз
перед следующим чтением. Аргумент c может не иметь значение EOF (или WEOF ).

Версии с суффиксом _nolock идентичны, за исключением того, что они не


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

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_ungettch _ungetch _ungetch _ungetwch

_ungettch_nolock _ungetch_nolock _ungetch_nolock _ungetwch_nolock

Требования
Подпрограмма Обязательный заголовок

_ungetch , _ungetch_nolock <conio.h>

_ungetwch , _ungetwch_nolock <conio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C
// crt_ungetch.c

// compile with: /c

// In this program, a white-space delimited

// token is read from the keyboard. When the program

// encounters a delimiter, it uses _ungetch to replace

// the character in the keyboard buffer.

//

#include <conio.h>

#include <ctype.h>

#include <stdio.h>

int main( void )

char buffer[100];

int count = 0;

int ch;

ch = _getche();

while( isspace( ch ) ) // Skip preceding white space.

ch = _getche();

while( count < 99 ) // Gather token.

if( isspace( ch ) ) // End of token.

break;

buffer[count++] = (char)ch;

ch = _getche();

_ungetch( ch ); // Put back delimiter.

buffer[count] = '\0'; // Null terminate the token.

printf( "\ntoken = %s\n", buffer );

Output

Whitetoken = White

См. также раздел


Ввод-вывод на консоль и порт

_cscanf, _cscanf_l, _cwscanf, _cwscanf_l

_getch, _getwch
unlink
Статья • 03.04.2023

Имя unlink функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _unlink для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _unlink . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_unlink , _wunlink
Статья • 03.04.2023

Удалите файл.

Синтаксис
C

int _unlink(

const char *filename


);

int _wunlink(

const wchar_t *filename

);

Параметры
filename

Имя удаляемого файла.

Возвращаемое значение
Каждая из этих функций при успешном выполнении возвращает 0. В противном
случае функция возвращает значение -1 и задает errno EACCES значение , что
означает, что путь указывает файл только для чтения или каталог, а также папку
ENOENT , то есть файл или путь не найден.

Дополнительные сведения о кодах возврата см. в разделе errno, и


_sys_nerr_doserrno_sys_errlist.

Комментарии
Функция _unlink удаляет файл, указанный в параметре filename . _wunlink — это
версия _unlink с расширенными символами; аргумент filename для _wunlink —
строка расширенных символов. В остальном эти функции ведут себя одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.
Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tunlink _unlink _unlink _wunlink

Требования
Подпрограмма Обязательный заголовок

_unlink <io.h> и <stdio.h>

_wunlink <io.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример кода
Эта программа использует _unlink для удаления CRT_UNLINK. TXT.

// crt_unlink.c

#include <stdio.h>

int main( void )

if( _unlink( "crt_unlink.txt" ) == -1 )

perror( "Could not delete 'CRT_UNLINK.TXT'" );

else

printf( "Deleted 'CRT_UNLINK.TXT'\n" );

Входные данные: crt_unlink.txt


Input

This file will be deleted.

Пример полученных результатов


Output

Deleted 'CRT_UNLINK.TXT'

См. также раздел


Обработка файлов

_close

remove, _wremove
_unlock_file
Статья • 03.04.2023

Разблокирует файл, разрешая к нему доступ других процессов.

Синтаксис
C

void _unlock_file(

FILE* file

);

Параметры
file

Дескриптор файла.

Комментарии
Функция _unlock_file разблокирует файл, указанный в параметре file . Снятие
блокировки файла разрешает доступ к этому файлу других процессов. Эту функцию
не следует вызывать, если _lock_file только она не была вызвана ранее для
указателя file . Вызов _unlock_file в файле, который не заблокирован, может
привести к взаимоблокировке. Пример см. в разделе _lock_file.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_unlock_file <stdio.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Обработка файлов

_creat, _wcreat

_open, _wopen

_lock_file
_utime , _utime32 , _utime64 , _wutime ,
_wutime32 , _wutime64
Статья • 03.04.2023

Задают время изменения файла.

Синтаксис
C

int _utime(

const char *filename,

struct _utimbuf *times

);

int _utime32(

const char *filename,

struct __utimbuf32 *times

);

int _utime64(

const char *filename,

struct __utimbuf64 *times

);

int _wutime(

const wchar_t *filename,

struct _utimbuf *times

);

int _wutime32(

const wchar_t *filename,

struct __utimbuf32 *times

);

int _wutime64(

const wchar_t *filename,

struct __utimbuf64 *times

);

Параметры
filename

Указатель на строку, содержащую путь или имя файла.

times

Указатель на сохраненные значения времени.


Возвращаемое значение
Каждая из этих функций возвращает 0, если время изменения файла было
изменено. Возвращаемое значение -1 указывает на ошибку. Если передается
недопустимый параметр, вызывается обработчик недопустимых параметров, как
описано в разделе Проверка параметров. Если выполнение разрешено, эти
функции возвращают значение -1 и errno задается одно из следующих значений:

Значение Условие
errno

EACCES Путь указывает каталог или файл, доступный только для чтения

EINVAL Недопустимый аргумент times

EMFILE Слишком много открытых файлов (чтобы изменить время изменения файла,
файл необходимо открыть)

ENOENT Путь или имя файла не найдены

Дополнительные сведения о кодах возврата см. в разделе errno, _doserrno,


_sys_errlistи _sys_nerr.

Дату файла можно изменить, если дата изменения лежит в диапазоне от полуночи
1-го января 1970 года до конечной даты используемой функции. В функциях _utime
и _wutime используется 64-разрядное значение времени, поэтому конечная дата
23:59:59 31-го декабря 3000 года, время в формате UTC. Если определена директива
_USE_32BIT_TIME_T для принудительного использования старого поведения,

конечная дата — 23:59:59 18 января 2038 года, время в формате UTC. Функции
_utime32 и _wutime32 используют 32-разрядный тип времени независимо от того,

определена ли директива _USE_32BIT_TIME_T , и всегда имеют более раннюю


конечную дату. Функции _utime64 и _wutime64 всегда используют 64-разрядный тип
времени, поэтому эти функции всегда поддерживают более позднюю конечную
дату.

Комментарии
Функция _utime задает время изменения для файла, указанного в filename . Для
изменения времени процесс должен иметь разрешение на запись в файл. В
операционной системе Windows можно изменить время доступа и время
изменения в структуре _utimbuf . Если times является указателем NULL , для времени
изменения устанавливается текущее время. В противном случае переменная times
должна указывать на структуру типа _utimbuf , определенную в SYS\UTIME.H.

Структура _utimbuf хранит время доступа к файлу и время изменения файла,


которые используются функцией _utime для изменения времени изменения файла.
Структура содержит следующие поля, оба из которых имеют тип time_t :

Поле Описание

actime Время доступа к файлу

modtime Время изменения файла

Конкретные версии структуры _utimbuf ( __utimbuf32 и __utimbuf64 ) задаются с 32-


и 64-разрядными версиями типа времени. Эти структуры используются в 32-
разрядных и 64-разрядных версиях этой функции. По умолчанию в структуре
_utimbuf используется 64-разрядное время, если только не определена директива
_USE_32BIT_TIME_T .

Функция _utime идентична функции _futime , но аргумент filename функции _utime


представляет собой имя файла или путь к файлу, а не дескриптор открытого файла.

_wutime — это версия _utime с расширенными символами; аргумент filename для

_wutime — строка расширенных символов. В остальном эти функции ведут себя


одинаково.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_tutime _utime _utime _wutime

_tutime32 _utime32 _utime32 _wutime32

_tutime64 _utime64 _utime64 _wutime64

Требования
Подпрограмма Обязательные заголовки Необязательные заголовки

_utime , _utime32 , _utime64 <sys/utime.h> <errno.h>

_utime64 <sys/utime.h> <errno.h>

_wutime <utime.h> или <wchar.h> <errno.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа использует функцию _utime , чтобы задать для времени изменения
файла текущее время.

// crt_utime.c

#include <stdio.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/utime.h>

#include <time.h>

int main( void )

struct tm tma = {0}, tmm = {0};

struct _utimbuf ut;

// Fill out the accessed time structure

tma.tm_hour = 12;

tma.tm_isdst = 0;

tma.tm_mday = 15;

tma.tm_min = 0;

tma.tm_mon = 0;

tma.tm_sec = 0;

tma.tm_year = 103;

// Fill out the modified time structure

tmm.tm_hour = 12;

tmm.tm_isdst = 0;

tmm.tm_mday = 15;

tmm.tm_min = 0;

tmm.tm_mon = 0;

tmm.tm_sec = 0;

tmm.tm_year = 102;

// Convert tm to time_t

ut.actime = mktime(&tma);

ut.modtime = mktime(&tmm);

// Show file time before and after

system( "dir crt_utime.c" );

if( _utime( "crt_utime.c", &ut ) == -1 )

perror( "_utime failed\n" );

else

printf( "File time modified\n" );

system( "dir crt_utime.c" );

Пример полученных результатов


Output

Volume in drive C has no label.

Volume Serial Number is 9CAC-DE74

Directory of C:\test

01/09/2003 05:38 PM 935 crt_utime.c

1 File(s) 935 bytes

0 Dir(s) 20,742,955,008 bytes free

File time modified

Volume in drive C has no label.

Volume Serial Number is 9CAC-DE74

Directory of C:\test

01/15/2002 12:00 PM 935 crt_utime.c

1 File(s) 935 bytes

0 Dir(s) 20,742,955,008 bytes free

См. также раздел


Управление временем

asctime, _wasctime

ctime, _ctime32, _ctime64, _wctime, _wctime32, _wctime64

_fstat, _fstat32, _fstat64, _fstati64, _fstat32i64, _fstat64i32

_ftime, _ftime32, _ftime64

_futime, _futime32, _futime64

gmtime, _gmtime32, _gmtime64

localtime, _localtime32, _localtime64

_statФункции , _wstat

time, _time32, _time64


va_arg , va_copy , va_end , va_start
Статья • 03.04.2023

Обращается к списку с переменным количеством аргументов.

Синтаксис
C

type va_arg(

va_list arg_ptr,

type

);

void va_copy(

va_list dest,

va_list src

); // (ISO C99 and later)

void va_end(

va_list arg_ptr

);

void va_start(

va_list arg_ptr,

prev_param

); // (ANSI C89 and later)

void va_start(

arg_ptr

); // (deprecated Pre-ANSI C89 standardization version)

Параметры
type

Тип аргумента, который требуется извлечь.

arg_ptr

Указатель на список аргументов.

dest

Указатель на список аргументов, которые нужно инициализировать из параметра


src

src

Указатель на инициализированный список аргументов, которые требуется


скопировать в параметр dest .
prev_param

Параметр, который предшествует первому необязательному аргументу.

Возвращаемое значение
va_arg возвращает текущий аргумент. va_copy va_end и va_start не возвращают
значения.

Комментарии
Макросы va_arg , va_copy , va_end и va_start предоставляют переносимый способ
получения аргументов функции, которая принимает переменное число
аргументов. Существует две версии макросов: макросы, определенные в STDARG.H ,
соответствуют стандарту ISO C99; макросы, определенные в VARARGS.H , являются
устаревшими, но сохраняются для обратной совместимости с кодом, написанным
до стандарта ANSI C89.

Эти макросы предполагают, что функции принимают фиксированное число


обязательных аргументов, за которыми следует переменное число необязательных
аргументов. Обязательные аргументы объявляются как обычные параметры для
функции и доступ к ним возможен через имена параметров. Доступ к
необязательным аргументам осуществляется через макросы в STDARG.H (или
VARARGS.H для кода, написанного до стандарта ANSI C89), который задает указатель
на первый необязательный аргумент в списке аргументов, извлекает аргументы из
списка и сбрасывает указатель после завершения обработки аргументов.

Стандартные макросы C, определенные в STDARG.H , используются следующим


образом:

va_start задает указатель arg_ptr на первый необязательный аргументу в


списке аргументов, который передан функции. Аргумент arg_ptr должен
иметь тип va_list . Аргумент prev_param  — это имя обязательного параметра,
который непосредственно предшествует первому необязательному аргументу
в списке аргументов. Если параметр prev_param объявлен в классе
регистрового хранения, поведение макроса не определено. va_start
необходимо использовать до первого использования va_arg .

va_arg извлекает значение type из расположения, которое задано

параметром arg_ptr , и увеличивает значение указателя arg_ptr , чтобы он


указывал на следующий аргумент в списке, используя размер type для
определения места начала следующего аргумента. va_arg можно
использовать в функции любое количество раз, чтобы получить аргументы из
списка.

va_copy делает копию списка аргументов в текущем состоянии. Параметр src


должен быть уже инициализирован с помощью va_start ; он может быть
обновлен вызовами va_arg , но не должен быть сброшен с помощью va_end .
Следующий аргумент, который извлекается va_arg из dest , совпадает со
следующий аргументом, который извлекается из src .

После получения va_end всех аргументов сбрасывает указатель на NULL .


va_end должен вызываться для каждого списка аргументов, который

инициализируется va_start или va_copy , до выполнения возврата функцией.

7 Примечание

Макросы в VARARGS.H использовать не рекомендуется; они сохранены только


для обратной совместимости с кодом, который написан до появления
стандарта ANSI C89. Во всех остальных случаях используйте макросы из файла
STDARGS.H.

При компиляции с помощью /clr (компиляция среды CLR) программы,


использующие эти макросы, могут генерировать непредвиденные результаты из-за
различий между системами типов среды CLR. Рассмотрим следующую программу:

#include <stdio.h>

#include <stdarg.h>

void testit (int i, ...)

va_list argptr;

va_start(argptr, i);

if (i == 0)

int n = va_arg(argptr, int);

printf("%d\n", n);

else

char *s = va_arg(argptr, char*);

printf("%s\n", s);

va_end(argptr);

int main()

testit(0, 0xFFFFFFFF); // 1st problem: 0xffffffff is not an int

testit(1, NULL); // 2nd problem: NULL is not a char*

Обратите внимание — функция testit ожидает, что второй параметр будет int
или char* . Передаваемые аргументы имеют значение 0xffffffff ( unsigned int , а не
int ) и NULL (фактически int , а не char* ). Когда программа скомпилирована для

неуправляемого кода, она дает следующий результат:

Output

-1

(null)

Требования
Заголовка: <stdio.h> И <stdarg.h>

Нерекомендуемый заголовок: <varargs.h>

Библиотеки
Все версии библиотек времени выполнения языка C.

Пример
C

// crt_va.c

// Compile with: cl /W3 /Tc crt_va.c

// The program below illustrates passing a variable

// number of arguments using the following macros:

// va_start va_arg va_copy

// va_end va_list

#include <stdio.h>

#include <stdarg.h>

#include <math.h>

double deviation(int first, ...);

int main( void )

/* Call with 3 integers (-1 is used as terminator). */

printf("Deviation is: %f\n", deviation(2, 3, 4, -1 ));

/* Call with 4 integers. */

printf("Deviation is: %f\n", deviation(5, 7, 9, 11, -1));

/* Call with just -1 terminator. */

printf("Deviation is: %f\n", deviation(-1));

/* Returns the standard deviation of a variable list of integers. */

double deviation(int first, ...)

int count = 0, i = first;

double mean = 0.0, sum = 0.0;

va_list marker;

va_list copy;

va_start(marker, first); /* Initialize variable arguments. */

va_copy(copy, marker); /* Copy list for the second pass */

while (i != -1)

sum += i;

count++;

i = va_arg(marker, int);

va_end(marker); /* Reset variable argument list. */

mean = sum ? (sum / count) : 0.0;

i = first; /* reset to calculate deviation */

sum = 0.0;

while (i != -1)

sum += (i - mean)*(i - mean);

i = va_arg(copy, int);

va_end(copy); /* Reset copy of argument list. */

return count ? sqrt(sum / count) : 0.0;

Output

Deviation is: 0.816497

Deviation is: 2.236068

Deviation is: 0.000000

См. также раздел


Доступ к аргументам

vfprintf, _vfprintf_l, vfwprintf, _vfwprintf_l


_vcprintf , _vcprintf_l , _vcwprintf ,
_vcwprintf_l
Статья • 03.04.2023

Записывают форматированные выходные данные в консоль с помощью указателя


на список аргументов. Доступны более безопасные версии этих функций, см. в
разделе _vcprintf_s, _vcprintf_s_l, _vcwprintf_s, . _vcwprintf_s_l

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _vcprintf(

const char* format,

va_list argptr

);

int _vcprintf_l(

const char* format,

_locale_t locale,

va_list argptr

);

int _vcwprintf(

const wchar_t* format,

va_list argptr

);

int _vcwprintf_l(

const wchar_t* format,

_locale_t locale,

va_list argptr

);

Параметры
format

Спецификация формата.
argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования.

Возвращаемое значение
Число записанных символов или отрицательное значение в случае ошибки вывода.
Если format является пустым указателем, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение
разрешено для продолжения, errno устанавливается значение EINVAL и
возвращается значение -1.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в консоль. _vcwprintf — версия
_vcprintf с расширенными символами. Она принимает строку расширенных
символов в качестве аргумента.

Версии этих функций с суффиксом _l идентичны, за исключением того, что они


используют переданный параметр языкового стандарта вместо текущего
языкового стандарта.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см . в статье Предотвращение переполнения
буфера.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtcprintf _vcprintf _vcprintf _vcwprintf

_vtcprintf_l _vcprintf_l _vcprintf_l _vcwprintf_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

_vcprintf , _vcprintf_l <conio.h> и <stdarg.h> <varargs.h>*

_vcwprintf , <conio.h> или <wchar.h>, и <varargs.h>*


_vcwprintf_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_vcprintf.cpp

// compile with: /c

#include <conio.h>

#include <stdarg.h>

// An error formatting function used to print to the console.

int eprintf(const char* format, ...)

va_list args;

va_start(args, format);

int result = _vcprintf(format, args);

va_end(args);

return result;

int main()

eprintf("(%d:%d): Error %s%d : %s\n", 10, 23, "C", 2111,

"<some error text>");

eprintf(" (Related to symbol '%s' defined on line %d).\n",

"<symbol>", 5 );

Output

(10,23): Error C2111 : <some error text>

(Related to symbol '<symbol>' defined on line 5).

См. также раздел


Потоковый ввод-вывод

Функции vprintf

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


_vcprintf_p , _vcprintf_p_l ,
_vcwprintf_p , _vcwprintf_p_l
Статья • 03.04.2023

Записывает форматированные выходные данные в консоль, используя указатель на


список аргументов, и поддерживает позиционные параметры в строке формата.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _vcprintf_p(

const char* format,

va_list argptr

);

int _vcprintf_p_l(

const char* format,

_locale_t locale,

va_list argptr

);

int _vcwprintf_p(

const wchar_t* format,

va_list argptr

);

int _vcwprintf_p_l(

const wchar_t* format,

_locale_t locale,

va_list argptr

);

Параметры
format

Спецификация формата.
argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования: printf и wprintf функции.

Возвращаемое значение
Число выведенных символов или отрицательное значение в случае ошибки. Если
format является пустым указателем, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если выполнение
разрешено для продолжения, errno устанавливается значение EINVAL и
возвращается значение -1.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
использует функцию _putch для форматирования и записи данных в консоль.
( _vcwprintf_p использует _putwch вместо _putch . _vcwprintf_p — это версия для
расширенных символов _vcprintf_p . В качестве аргумента используется строка
расширенных символов.)

Версии этих функций с суффиксом _l идентичны версиям без суффикса, за


исключением того, что они используют переданный параметр языкового стандарта
вместо текущего языкового стандарта.

Каждый argument (при наличии) преобразуется и выводится согласно


соответствующей спецификации формата в format . Спецификация формата
поддерживает позиционные параметры, позволяющие определить порядок, в
котором аргументы используются в строке форматирования. Дополнительные
сведения см. в разделе Позиционные параметры printf_p.

Эти функции не переводят символы канала строки в выходных данных в


сочетаниях возврата строки каретки (CR-LF).

) Важно!
Убедитесь, что format не является строкой, определяемой пользователем.
Дополнительные сведения см . в статье Предотвращение переполнения
буфера.

Кроме того, эти функции проверяют входной указатель и строку форматирования.


Если format или argument имеет значение NULL или если строка форматирования
содержит недопустимые символы форматирования, эти функции вызывают
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если разрешается продолжать выполнение, эти функции возвращают
-1 и задают errno значение EINVAL .

Сопоставления подпрограмм с универсальным


текстом

Процедура _UNICODE и _MBCS не _MBCS _UNICODE


Tchar.h определены Определенные Определенные

_vtcprintf_p _vcprintf_p _vcprintf_p _vcwprintf_p

_vtcprintf_p_l _vcprintf_p_l _vcprintf_p_l _vcwprintf_p_l

Требования
Подпрограмма Обязательный заголовок

_vcprintf_p , _vcprintf_p_l <conio.h> и <stdarg.h>

_vcwprintf_p , _vcwprintf_p_l <conio.h> и <stdarg.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Пример
C

// crt_vcprintf_p.c

// compile with: /c

#include <conio.h>

#include <stdarg.h>

// An error formatting function that's used to print to the console.

int eprintf(const char* format, ...)

va_list args;

va_start(args, format);

int result = _vcprintf_p(format, args);

va_end(args);

return result;

int main()

int n = eprintf("parameter 2 = %2$d; parameter 1 = %1$s\r\n",

"one", 222);

_cprintf_s("%d characters printed\r\n");

Output

parameter 2 = 222; parameter 1 = one

38 characters printed

См. также раздел


Ввод-вывод на консоль и порт

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

va_arg, va_copy, va_end, va_start

printf_p позиционные параметры


_vcprintf_s , _vcprintf_s_l ,
_vcwprintf_s , _vcwprintf_s_l
Статья • 03.04.2023

Записывают форматированные выходные данные в консоль с помощью указателя


на список аргументов. Эти версии _vcprintf, _vcprintf_l, , _vcwprintfимеют _vcwprintf_l
улучшения безопасности, как описано в разделе Функции безопасности в CRT.

) Важно!

Этот API нельзя использовать в приложениях, выполняемых в среде


выполнения Windows. Дополнительные сведения: Функции CRT, которые не
поддерживаются в приложениях универсальной платформы Windows.

Синтаксис
C

int _vcprintf_s(

char const* const format,

va_list argptr

);

int _vcprintf_s_l(

char const* const format,

_locale_t locale,

va_list argptr

);

int _vcwprintf_s(

wchar_t const* const format,

va_list argptr

);

int _vcwprintf_s_l(

wchar_t const* const format,

_locale_t locale,

va_list argptr

);

Параметры
format

Спецификация формата.
argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования: printf и wprintf функции.

Возвращаемое значение
Число записанных символов или отрицательное значение в случае ошибки вывода.

Как и в менее безопасных версиях этих функций, если format является пустым
указателем, вызывается обработчик недопустимых параметров, как описано в
разделе Проверка параметров. Кроме того, в отличие от менее безопасных версий
этих функций, если format не указан допустимый формат, создается исключение
недопустимого параметра. Если продолжение выполнения разрешено, эти функции
возвращают код ошибки и устанавливают этот код ошибки в качестве значения для
errno . Код ошибки по умолчанию — если EINVAL не применяется более

конкретное значение.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в консоль. _vcwprintf_s — версия
_vcprintf_s с расширенными символами. Она принимает строку расширенных

символов в качестве аргумента.

Версии этих функций с суффиксом _l идентичны версиям без суффикса, за


исключением того, что они используют переданный параметр языкового стандарта
вместо текущего языкового стандарта.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см . в статье Предотвращение переполнения
буфера.
Сопоставления подпрограмм с универсальным
текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtcprintf_s _vcprintf_s _vcprintf_s _vcwprintf_s

_vtcprintf_s_l _vcprintf_s_l _vcprintf_s_l _vcwprintf_s_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

_vcprintf_s , <conio.h> и <stdarg.h> <varargs.h>*


_vcprintf_s_l

_vcwprintf_s , <conio.h> или <wchar.h>, и <varargs.h>*


_vcwprintf_s_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Пример
C++

// crt_vcprintf_s.cpp

#include <conio.h>

#include <stdarg.h>

// An error formatting function used to print to the console.

int eprintf_s(const char* format, ...)

va_list args;

va_start(args, format);

int result = _vcprintf_s(format, args);

va_end(args);

return result;

int main()

eprintf_s("(%d:%d): Error %s%d : %s\n", 10, 23, "C", 2111,

"<some error text>");

eprintf_s(" (Related to symbol '%s' defined on line %d).\n",

"<symbol>", 5 );

Output

(10,23): Error C2111 : <some error text>

(Related to symbol '<symbol>' defined on line 5).

См. также раздел


Потоковый ввод-вывод

Функции vprintf

_cprintf, _cprintf_l, _cwprintf, _cwprintf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


vfprintf , _vfprintf_l , vfwprintf ,
_vfwprintf_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Существуют более безопасные версии этих функций; see vfprintf_s,
_vfprintf_s_l, vfwprintf_s_vfwprintf_s_l.

Синтаксис
C

int vfprintf(

FILE *stream,

const char *format,

va_list argptr

);

int _vfprintf_l(

FILE *stream,

const char *format,

_locale_t locale,

va_list argptr

);

int vfwprintf(

FILE *stream,

const wchar_t *format,

va_list argptr

);

int _vfwprintf_l(

FILE *stream,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
stream

Указатель на структуру FILE .

format

Спецификация формата.
argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в описании синтаксиса спецификации формата.

Возвращаемое значение
Функции vfprintf и vfwprintf возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода. Если какой-либо stream или format является пустым указателем,
вызывается обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если продолжение выполнения разрешено, функции
возвращают значение -1 и задают для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в stream .

Функция vfwprintf является версией функции vfprintf с расширенными


символами; обе функции ведут себя одинаково, если поток открыт в режиме ANSI.
Функция vfprintf на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см. в разделе "Предотвращение переполнения
буфера".
Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство
функций выводит точно представленные числа с плавающей запятой в
соответствии с правилами IEEE 754 для округления. В предыдущих версиях
Windows точно представленные числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись вверх. IEEE 754 утверждает, что
они должны округляются до ближайшей четной цифры (также известной как
"Округление банкира"). Например, оба printf("%1.0f", 1.5) и printf("%1.0f",
2.5) должны округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до

3. Это изменение влияет только на точно представляемые числа. Например,


2.35 (который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vftprintf vfprintf vfprintf vfwprintf

_vftprintf_l _vfprintf_l _vfprintf_l _vfwprintf_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

vfprintf , _vfprintf_l <stdio.h> и <stdarg.h> <varargs.h>*

vfwprintf , <stdio.h> или <wchar.h> и <varargs.h>*


_vfwprintf_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

Функции vprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


_vfprintf_p , _vfprintf_p_l ,
_vfwprintf_p , _vfwprintf_p_l
Статья • 03.04.2023

Записывают форматированные выходные данные, используя указатель на список


аргументов, с возможностью указать порядок, в котором эти аргументы
используются в строке формата.

Синтаксис
C

int _vfprintf_p(

FILE *stream,

const char *format,

va_list argptr

);

int _vfprintf_p_l(

FILE *stream,

const char *format,

_locale_t locale,

va_list argptr

);

int _vfwprintf_p(

FILE *stream,

const wchar_t *format,

va_list argptr

);

int _vfwprintf_p_l(

FILE *stream,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
stream

Указатель на структуру FILE .

format

Спецификация формата.
argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в описании синтаксиса спецификации формата.

Возвращаемое значение
Функции _vfprintf_p и _vfwprintf_p возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в stream . Эти функции отличаются от
версий _vfprint_s и _vfwprint_s только в том, что они поддерживают
позиционные параметры. Дополнительные сведения см. в разделе Позиционные
параметры printf_p.

Функция _vfwprintf_p является версией функции _vprintf_p с расширенными


символами; обе функции ведут себя одинаково, если поток открыт в режиме ANSI.
Функция _vprintf_p на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см. в разделе "Предотвращение переполнения
буфера".
Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство
функций выводит точно представленные числа с плавающей запятой в
соответствии с правилами IEEE 754 для округления. В предыдущих версиях
Windows точно представленные числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись. IEEE 754 указывает, что они
должны округить до ближайшей четной цифры (также известной как
"Округление банкира"). Например, оба printf("%1.0f", 1.5) и printf("%1.0f",
2.5) должны округить до 2. Ранее 1,5 округляется до 2 и 2,5 округляется до 3.
Это изменение влияет только на точно представляемые числа. Например, 2,35
(который при представлении в памяти приближается к
2,3500000000000000008) продолжает округление до 2,4. Округление,
выполняемое этими функциями, теперь также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Если или stream format является пустым указателем, или если строка
форматирования содержит недопустимые символы форматирования, вызывается
обработчик недопустимых параметров, как описано в разделе "Проверка
параметров". Если продолжение выполнения разрешено, функции возвращают
значение -1 и задают для errno значение EINVAL .

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vftprintf_p _vfprintf_p _vfprintf_p _vfwprintf_p

_vftprintf_p_l _vfprintf_p_l _vfprintf_p_l _vfwprintf_p_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

_vfprintf_p , _vfprintf_p_l <stdio.h> и <stdarg.h> <varargs.h>*

_vfwprintf_p , <stdio.h> или <wchar.h> и <varargs.h>*


_vfwprintf_p_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.


См. также раздел
Потоковый ввод-вывод

Функции vprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start

printf_p позиционные параметры

_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l

_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l

_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l


vfprintf_s , _vfprintf_s_l , vfwprintf_s ,
_vfwprintf_s_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Эти функции являются версиями vfprintf, _vfprintf_l, vfwprintfс
_vfwprintf_l улучшениями безопасности, как описано в разделе Функции
безопасности в CRT.

Синтаксис
C

int vfprintf_s(

FILE *stream,

const char *format,

va_list argptr

);

int _vfprintf_s_l(

FILE *stream,

const char *format,

_locale_t locale,

va_list argptr

);

int vfwprintf_s(

FILE *stream,

const wchar_t *format,

va_list argptr

);

int _vfwprintf_s_l(

FILE *stream,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
stream

Указатель на структуру FILE .

format

Спецификация формата.
argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации формата.

Возвращаемое значение
Функции vfprintf_s и vfwprintf_s возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода. Если или stream format является пустым указателем или строка
форматирования содержит недопустимые символы форматирования, вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если продолжение выполнения разрешено, функции возвращают
значение -1 и задают для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в stream .

Эти функции отличаются от небезопасных версий только тем, что безопасные


версии проверяют, что строка format содержит допустимые символы
форматирования.

Функция vfwprintf_s является версией функции vfprintf_s с расширенными


символами; обе функции ведут себя одинаково, если поток открыт в режиме ANSI.
Функция vfprintf_s на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!
Убедитесь, что format не является строкой, определяемой пользователем.
Дополнительные сведения см . в статье Предотвращение переполнения
буфера.
Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство
функций печатает точно представленные числа с плавающей запятой в
соответствии с правилами округления IEEE 754. В предыдущих версиях
Windows точно представленные числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись вверх. IEEE 754 гласит, что они
должны округлиться до ближайшей четной цифры (также известный как
"Округление банкира"). Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5)
должны округлиться до 2. Ранее значение 1,5 округлялось до 2, а 2,5
округлялось до 3. Это изменение влияет только на точно представленные
числа. Например, значение 2,35 (которое при представлении в памяти ближе к
2,350000000000000008) продолжает округление до 2,4. Округление,
выполняемое этими функциями, теперь также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбирало FE_TONEAREST поведение. Это изменение затрагивает только
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vftprintf_s vfprintf_s vfprintf_s vfwprintf_s

_vftprintf_s_l _vfprintf_s_l _vfprintf_s_l _vfwprintf_s_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

vfprintf_s , _vfprintf_s_l <stdio.h> и <stdarg.h> <varargs.h>*

vfwprintf_s , <stdio.h> или <wchar.h> и <varargs.h>*


_vfwprintf_s_l <stdarg.h>

* Требуется для совместимости с UNIX V.


Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

Функции vprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


vfscanf , vfwscanf
Статья • 03.04.2023

Считывают форматированные данные из потока. Доступны более безопасные


версии этих функций; См. разделvfscanf_s , vfwscanf_s.

Синтаксис
C

int vfscanf(

FILE *stream,

const char *format,

va_list argptr

);

int vfwscanf(

FILE *stream,

const wchar_t *format,

va_list argptr

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.

arglist

Список аргументов переменных.

Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые успешно
преобразованы и назначены. Возвращаемое значение не включает поля, которые
считываются, но не назначаются. Возвращаемое значение 0 указывает, что поля не
были назначены. Если до первого преобразования возникает ошибка или
достигается конец потока файла, возвращается значение EOF для vfscanf и
vfwscanf .
Эти функции проверяют свои параметры. Если stream или format является пустым
указателем, вызывается обработчик недопустимых параметров, как описано в
разделе Проверка параметров. Если продолжение выполнения разрешено, эти
функции возвращают EOF и устанавливают для errno значение EINVAL .

Комментарии
Функция vfscanf считывает данные из текущей позиции stream в расположения,
на которые указывает список аргументов arglist . Каждый аргумент в списке
должен быть указателем на переменную, которая имеет тип, соответствующий
спецификатору типа в параметре format . format управляет интерпретацией полей
ввода и имеет ту же форму и функцию, что format и аргумент для scanf ; описание
см scanf . в описании format .

vfwscanf  — это версия vfscanf с расширенными символами; аргумент format для

функции vfwscanf  — строка расширенных символов. Эти функции ведут себя


одинаково, если поток открыт в режиме ANSI. vfscanf не поддерживает ввод из
потока ЮНИКОДА.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vftscanf vfscanf vfscanf vfwscanf

Дополнительные сведения см. в разделе Поля спецификации форматирования:


scanf и wscanf функции.

Требования
Компонент Обязательный заголовок

vfscanf <stdio.h>

vfwscanf <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt_vfscanf.c

// compile with: /W3

// This program writes formatted

// data to a file. It then uses vfscanf to

// read the various data back from the file.

#include <stdio.h>

#include <stdarg.h>

FILE *stream;

int call_vfscanf(FILE * istream, char * format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vfscanf(istream, format, arglist);

va_end(arglist);

return result;

int main(void)

long l;

float fp;

char s[81];

char c;

if (fopen_s(&stream, "vfscanf.out", "w+") != 0)

printf("The file vfscanf.out was not opened\n");

else

fprintf(stream, "%s %ld %f%c", "a-string",

65000, 3.14159, 'x');

// Security caution!

// Beware loading data from a file without confirming its size,

// as it may lead to a buffer overrun situation.

// Set pointer to beginning of file:

fseek(stream, 0L, SEEK_SET);

// Read data back from file:

call_vfscanf(stream, "%s %ld %f%c", s, &l, &fp, &c);

// Output data read:

printf("%s\n", s);

printf("%ld\n", l);

printf("%f\n", fp);

printf("%c\n", c);

fclose(stream);

Output

a-string

65000

3.141590

См. также раздел


Потоковый ввод-вывод

_cscanf, _cscanf_l, _cwscanf, _cwscanf_l

fprintf, _fprintf_l, fwprintf, _fwprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

fscanf_s, _fscanf_s_l, fwscanf_s, _fwscanf_s_l

vfscanf_s, vfwscanf_s
vfscanf_s , vfwscanf_s
Статья • 03.04.2023

Считывают форматированные данные из потока. Эти версии vfscanf, vfwscanf


имеют улучшения безопасности, как описано в разделе Функции безопасности в
CRT.

Синтаксис
C

int vfscanf_s(

FILE *stream,

const char *format,

va_list arglist

);

int vfwscanf_s(

FILE *stream,

const wchar_t *format,

va_list arglist

);

Параметры
stream

Указатель на структуру FILE .

format

Строка управления форматом.

arglist

Список аргументов переменных.

Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые успешно
преобразованы и назначены. Возвращаемое значение не включает поля, которые
были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля
не были назначены. Если до первого преобразования возникает ошибка или
достигается конец потока файла, возвращается значение EOF для vfscanf_s и
vfwscanf_s .
Эти функции проверяют свои параметры. Если stream является недопустимым
указателем на файл или format является пустым указателем, эти функции вызывают
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если продолжение выполнения разрешено, эти функции возвращают
EOF и устанавливают для errno значение EINVAL .

Комментарии
Функция vfscanf_s считывает данные из текущей позиции stream в расположения,
на которые указывает список аргументов arglist (если есть). Каждый аргумент в
списке должен быть указателем на переменную, которая имеет тип,
соответствующий спецификатору типа в параметре format . format управляет
интерпретацией полей ввода и имеет ту же форму и функцию, что format и
аргумент для scanf_s ; описание см. в разделе Форматирование полей
спецификации: функции scanf и wscanf . format vfwscanf_s  — это версия vfscanf_s с
расширенными символами; аргумент format для функции vfwscanf_s  — строка
расширенных символов. Эти функции ведут себя одинаково, если поток открыт в
режиме ANSI. vfscanf_s сейчас не поддерживает ввод из потока ЮНИКОДА.

Основное различие между более безопасными функциями (с _s суффиксом) и


другими версиями заключается в том, что первые требуют, чтобы размер каждого
поля типа c , C , s , S и [ в символах передавался как аргумент сразу после
переменной. Дополнительные сведения см. в разделе scanf_sСпецификация
ширины , _scanf_s_l, wscanf_sи _wscanf_s_lscanf.

7 Примечание

Параметр размера имеет тип unsigned , а не size_t .

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vftscanf_s vfscanf_s vfscanf_s vfwscanf_s

Требования
Компонент Обязательный заголовок

vfscanf_s <stdio.h>

vfwscanf_s <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_vfscanf_s.c

// compile with: /W3

// This program writes formatted

// data to a file. It then uses vfscanf_s to

// read the various data back from the file.

#include <stdio.h>

#include <stdarg.h>

#include <stdlib.h>

FILE *stream;

int call_vfscanf_s(FILE * istream, char * format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vfscanf_s(istream, format, arglist);

va_end(arglist);

return result;

int main(void)

long l;

float fp;

char s[81];

char c;

if (fopen_s(&stream, "vfscanf_s.out", "w+") != 0)

printf("The file vfscanf_s.out was not opened\n");

else

fprintf(stream, "%s %ld %f%c", "a-string",

65000, 3.14159, 'x');

// Security caution!

// Beware loading data from a file without confirming its size,

// as it may lead to a buffer overrun situation.

// Set pointer to beginning of file:

fseek(stream, 0L, SEEK_SET);

// Read data back from file:

call_vfscanf_s(stream, "%s %ld %f%c", s, _countof(s), &l, &fp, &c,


1);

// Output data read:

printf("%s\n", s);

printf("%ld\n", l);

printf("%f\n", fp);

printf("%c\n", c);

fclose(stream);

Output

a-string

65000

3.141590

См. также раздел


Потоковый ввод-вывод

_cscanf_s, _cscanf_s_l, _cwscanf_s, _cwscanf_s_l

fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

fscanf, _fscanf_l, fwscanf, _fwscanf_l

vfscanf, vfwscanf
vprintf , _vprintf_l , vwprintf ,
_vwprintf_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Доступны более безопасные версии этих функций, см. в разделе
vprintf_s, _vprintf_s_l, vwprintf_s, . _vwprintf_s_l

Синтаксис
C

int vprintf(

const char *format,

va_list argptr

);

int _vprintf_l(

const char *format,

_locale_t locale,

va_list argptr

);

int vwprintf(

const wchar_t *format,

va_list argptr

);

int _vwprintf_l(

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.


Дополнительные сведения см. в разделе Синтаксис спецификации
форматирования.

Возвращаемое значение
Функции vprintf и vwprintf возвращают число записанных символов, не включая
конечный нуль-символ, или отрицательное значение, если произошла ошибка
вывода. Если format является пустым указателем или строка форматирования
содержит недопустимые символы форматирования, вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
продолжение выполнения разрешено, функции возвращают значение -1 и задают
для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в stdout .

Функция vwprintf является версией функции vprintf с расширенными символами;


обе функции ведут себя одинаково, если поток открыт в режиме ANSI. Функция
vprintf на данный момент не поддерживает вывод данных в поток в кодировке
Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см . в статье Предотвращение переполнения
буфера. Обнаружены недопустимые строки формата, что приводит к ошибке.
Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций
выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtprintf vprintf vprintf vwprintf

_vtprintf_l _vprintf_l _vprintf_l _vwprintf_l

Требования
Подпрограмма Обязательный заголовок Необязательные заголовки

vprintf , _vprintf_l <stdio.h> и <stdarg.h> <varargs.h>*

vwprintf , _vwprintf_l <stdio.h> или <wchar.h> и <stdarg.h> <varargs.h>*

* Требуется для совместимости с UNIX V.

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

Функции vprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


_vprintf_p , _vprintf_p_l , _vwprintf_p ,
_vwprintf_p_l
Статья • 03.04.2023

Записывают форматированные выходные данные, используя указатель на список


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

Синтаксис
C

int _vprintf_p(

const char *format,

va_list argptr

);

int _vprintf_p_l(

const char *format,

_locale_t locale,

va_list argptr

);

int _vwprintf_p(

const wchar_t *format,

va_list argptr

);

int _vwprintf_p_l(

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации формата.


Возвращаемое значение
Функции _vprintf_p и _vwprintf_p возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в stdout . Эти функции отличаются от
vprintf_s и vwprintf_s только тем, что они поддерживают возможность указать

порядок, в котором используются аргументы. Дополнительные сведения см. в


разделе Позиционные параметры printf_p.

Функция _vwprintf_p является версией функции _vprintf_p с расширенными


символами; обе функции ведут себя одинаково, если поток открыт в режиме ANSI.
Функция _vprintf_p на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см . в статье Предотвращение переполнения
буфера.
Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство
функций печатает точно представленные числа с плавающей запятой в
соответствии с правилами округления IEEE 754. В предыдущих версиях
Windows точно представленные числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись вверх. IEEE 754 гласит, что они
должны округлиться до ближайшей четной цифры (также известный как
"Округление банкира"). Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5)
должны округлиться до 2. Ранее значение 1,5 округлялось до 2, а 2,5
округлялось до 3. Это изменение влияет только на точно представленные
числа. Например, значение 2,35 (которое при представлении в памяти ближе к
2,350000000000000008) продолжает округление до 2,4. Округление,
выполняемое этими функциями, теперь также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбирало FE_TONEAREST поведение. Это изменение затрагивает только
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Если format является пустым указателем или строка форматирования содержит


недопустимые символы форматирования, вызывается обработчик недопустимых
параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, функции возвращают значение -1 и задают для errno
значение EINVAL .

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtprintf_p _vprintf_p _vprintf_p _vwprintf_p

_vtprintf_p_l _vprintf_p_l _vprintf_p_l _vwprintf_p_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

_vprintf_p , _vprintf_p_l <stdio.h> и <stdarg.h> <varargs.h>*

_vwprintf_p , <stdio.h> или <wchar.h> и <varargs.h>*


_vwprintf_p_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C

смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

Функции vprintf

_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l

_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l

_sprintf_p, _sprintf_p_l, _swprintf_p, _swprintf_p_l

vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l

va_arg, va_copy, va_end, va_start

_vfprintf_p, _vfprintf_p_l, _vfwprintf_p, _vfwprintf_p_l

_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l

printf_p позиционные параметры


vprintf_s , _vprintf_s_l , vwprintf_s ,
_vwprintf_s_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Эти версии vprintf, _vprintf_l, vwprintf_vwprintf_l имеют улучшения
безопасности, как описано в разделе Функции безопасности в CRT.

Синтаксис
C

int vprintf_s(

const char *format,

va_list argptr

);

int _vprintf_s_l(

const char *format,

_locale_t locale,

va_list argptr

);

int vwprintf_s(

const wchar_t *format,

va_list argptr

);

int _vwprintf_s_l(

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации формата.


Возвращаемое значение
Функции vprintf_s и vwprintf_s возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода. Если format является пустым указателем или строка
форматирования содержит недопустимые символы форматирования, вызывается
обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если продолжение выполнения разрешено, функции возвращают
значение -1 и задают для errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в stdout .

Безопасные версии этих функций отличаются от vprintf и vwprintf только тем, что
безопасные версии проверяют, что строка формата содержит допустимые
символы форматирования.

Функция vwprintf_s является версией функции vprintf_s с расширенными


символами; обе функции ведут себя одинаково, если поток открыт в режиме ANSI.
Функция vprintf_s на данный момент не поддерживает вывод данных в поток в
кодировке Юникод.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см . в статье Предотвращение переполнения
буфера.
Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство
функций печатает точно представленные числа с плавающей запятой в
соответствии с правилами округления IEEE 754. В предыдущих версиях
Windows точно представленные числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись вверх. IEEE 754 гласит, что они
должны округлиться до ближайшей четной цифры (также известный как
"Округление банкира"). Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5)
должны округлиться до 2. Ранее значение 1,5 округлялось до 2, а 2,5
округлялось до 3. Это изменение влияет только на точно представленные
числа. Например, значение 2,35 (которое при представлении в памяти ближе к
2,350000000000000008) продолжает округление до 2,4. Округление,
выполняемое этими функциями, теперь также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбирало FE_TONEAREST поведение. Это изменение затрагивает только
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtprintf_s vprintf_s vprintf_s vwprintf_s

_vtprintf_s_l _vprintf_s_l _vprintf_s_l _vwprintf_s_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

vprintf_s , _vprintf_s_l <stdio.h> и <stdarg.h> <varargs.h>*

vwprintf_s , <stdio.h> или <wchar.h> и <varargs.h>*


_vwprintf_s_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции среды выполнения C
смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

См. также раздел


Потоковый ввод-вывод

Функции vprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


vscanf , vwscanf
Статья • 03.04.2023

Считывает отформатированные данные из стандартного входного потока.


Доступны более безопасные версии этих функций; См. разделvscanf_s , vwscanf_s.

Синтаксис
C

int vscanf(

const char *format,

va_list arglist

);

int vwscanf(

const wchar_t *format,

va_list arglist

);

Параметры
format

Строка управления форматированием.

arglist

Список аргументов переменных.

Возвращаемое значение
Возвращает количество полей, которые успешно преобразованы и назначены;
Возвращаемое значение не включает поля, которые были прочитаны, но не
назначены. Возвращаемое значение 0 указывает, что поля не были назначены.

Если format является указателем NULL , вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, эти функции возвращают EOF и устанавливают для errno
значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.
Комментарии
Функция vscanf считывает данные из стандартного входного потока stdin и
записывает эти данные в расположения, указанные списком аргументов arglist .
Каждый аргумент в списке должен быть указателем на переменную, которая имеет
тип, соответствующий спецификатору типа в параметре format . Если копирование
производится между перекрывающимися строками, поведение не определено.

) Важно!

При использовании для vscanf чтения строки всегда указывайте ширину


формата %s (например, "%32s" вместо "%s"). В противном случае
неправильно отформатированные входные данные могут привести к
переполнению буфера. В качестве альтернативы можно использовать vscanf_s,
vwscanf_s или fgets.

vwscanf — это версия vscanf с расширенными символами; аргумент format для

vwscanf — строка расширенных символов. vwscanf и vscanf ведут себя одинаково,


если поток открыт в режиме ANSI. vscanf не поддерживает ввод из потока
ЮНИКОДА.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtscanf vscanf vscanf vwscanf

Дополнительные сведения см. в разделе Поля спецификации форматирования:


scanf и wscanf функции.

Требования
Подпрограмма Обязательный заголовок

vscanf <stdio.h>

vwscanf <stdio.h> или <wchar.h>


Консоль не поддерживается в приложениях универсальная платформа Windows
(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения

C смогут использовать их в приложениях UWP. Дополнительные сведения о


совместимости см. в разделе Compatibility.

Пример
C

// crt_vscanf.c

// compile with: /W3

// This program uses the vscanf and vwscanf functions

// to read formatted input.

#include <stdio.h>

#include <stdarg.h>

int call_vscanf(char *format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vscanf(format, arglist);

va_end(arglist);

return result;

int call_vwscanf(wchar_t *format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vwscanf(format, arglist);

va_end(arglist);

return result;

int main( void )

int i, result;

float fp;

char c, s[81];

wchar_t wc, ws[81];

result = call_vscanf( "%d %f %c %C %80s %80S", &i, &fp, &c, &wc, s, ws


);

printf( "The number of fields input is %d\n", result );

printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);

result = call_vwscanf( L"%d %f %hc %lc %80S %80ls", &i, &fp, &c, &wc, s,
ws );

wprintf( L"The number of fields input is %d\n", result );

wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s,


ws);

Output

71 98.6 h z Byte characters


36 92.3 y n Wide charactersThe number of fields input is 6

The contents are: 71 98.599998 h z Byte characters

The number of fields input is 6

The contents are: 36 92.300003 y n Wide characters

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Потоковый ввод-вывод

Локаль

fscanf, _fscanf_l, fwscanf, _fwscanf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

vscanf_s, vwscanf_s
vscanf_s , vwscanf_s
Статья • 03.04.2023

Считывает отформатированные данные из стандартного входного потока. Эти


версии vscanfимеют vwscanf улучшения безопасности, как описано в разделе
Функции безопасности в CRT.

Синтаксис
C

int vscanf_s(

const char *format,

va_list arglist

);

int vwscanf_s(

const wchar_t *format,

va_list arglist

);

Параметры
format

Строка управления форматированием.

arglist

Список аргументов переменных.

Возвращаемое значение
Возвращает число полей, успешно преобразованных и назначенных;
Возвращаемое значение не включает поля, которые были прочитаны, но не
назначены. Возвращаемое значение 0 указывает, что поля не были назначены.
Значение EOF возвращается в случае ошибки или при обнаружении символа конца
файла или конца строки при первой попытке чтения символа. Если format является
указателем NULL , вызывается обработчик недопустимых параметров, как описано
в разделе Проверка параметров. Если выполнение может быть продолжено, то
функции vscanf_s и vwscanf_s возвращают ошибку EOF и устанавливают для errno
значение EINVAL .
Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция vscanf_s считывает данные из стандартного входного потока stdin и
записывает эти данные в расположения, указанные списком аргументов arglist .
Каждый аргумент в списке должен быть указателем на переменную, которая имеет
тип, соответствующий спецификатору типа в параметре format . Если копирование
производится между перекрывающимися строками, поведение не определено.

vwscanf_s — это версия vscanf_s с расширенными символами; аргумент format для


vwscanf_s — строка расширенных символов. vwscanf_s и vscanf_s ведут себя

одинаково, если поток открыт в режиме ANSI. vscanf_s не поддерживает ввод из


потока ЮНИКОДА.

В отличие от vscanf и vwscanf , vscanf_s и vwscanf_s требуют, чтобы размер буфера


был указан для всех входных параметров типа c, C, s, S или строковых наборов
элементов управления, которые заключены в []. Размер буфера в символах
передается как другой параметр сразу после указателя на буфер или переменную.
Размер буфера в символах для wchar_t строки не совпадает с размером в байтах.

Размер буфера включает завершающее значение NULL. Можно использовать поле


спецификации ширины, чтобы гарантировать, что считываемый токен поместится в
буфер. Если поле спецификации ширины не используется, а считываемые маркеры
слишком велики, чтобы поместиться в буфер, ничего не записывается в этот буфер.

7 Примечание

Параметр size имеет тип unsigned , а не size_t .

Дополнительные сведения см. в разделе Спецификация ширины scanf.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vtscanf_s vscanf_s vscanf_s vwscanf_s


Дополнительные сведения см. в разделе Поля спецификации форматирования:
scanf и wscanf функции.

Требования
Подпрограмма Обязательный заголовок

vscanf_s <stdio.h>

wscanf_s <stdio.h> или <wchar.h>

Консоль не поддерживается в приложениях универсальная платформа Windows


(UWP). Стандартные дескрипторы потока, связанные с консолью , stdin stdout и
stderr , должны быть перенаправлены, прежде чем функции времени выполнения
C смогут использовать их в приложениях UWP. Дополнительные сведения о
совместимости см. в разделе Compatibility.

Пример
C

// crt_vscanf_s.c

// compile with: /W3

// This program uses the vscanf_s and vwscanf_s functions

// to read formatted input.

#include <stdio.h>

#include <stdarg.h>

#include <stdlib.h>

int call_vscanf_s(char *format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vscanf_s(format, arglist);

va_end(arglist);

return result;

int call_vwscanf_s(wchar_t *format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vwscanf_s(format, arglist);

va_end(arglist);

return result;

int main( void )

int i, result;

float fp;

char c, s[81];

wchar_t wc, ws[81];

result = call_vscanf_s("%d %f %c %C %s %S", &i, &fp, &c, 1,

&wc, 1, s, _countof(s), ws, _countof(ws) );

printf( "The number of fields input is %d\n", result );

printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws);

result = call_vwscanf_s(L"%d %f %hc %lc %S %ls", &i, &fp, &c, 2,

&wc, 1, s, _countof(s), ws, _countof(ws) );

wprintf( L"The number of fields input is %d\n", result );

wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s,


ws);

Если эта программа получает входные данные, показанные в примере, она создает
следующий результат:

Input

71 98.6 h z Byte characters

36 92.3 y n Wide characters

Output

The number of fields input is 6

The contents are: 71 98.599998 h z Byte characters

The number of fields input is 6

The contents are: 36 92.300003 y n Wide characters

См. также раздел


Поддержка математических функций для чисел с плавающей запятой
Потоковый ввод-вывод

Локаль

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

scanf_s, _scanf_s_l, wscanf_s, _wscanf_s_l

vscanf, vwscanf
_vscprintf , _vscprintf_l , _vscwprintf ,
_vscwprintf_l
Статья • 03.04.2023

Возвращает число символов в строке, сформатированной с использованием


указателя на список аргументов.

Синтаксис
C

int _vscprintf(

const char *format,

va_list argptr

);

int _vscprintf_l(

const char *format,

_locale_t locale,

va_list argptr

);

int _vscwprintf(

const wchar_t *format,

va_list argptr

);

int _vscwprintf_l(

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
format

Строка управления форматом.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования.
Возвращаемое значение
Функция _vscprintf возвращает число символов, которые были бы созданы, если
строка, указанная в списке аргументов, была бы напечатана либо отправлена в
файл или буфер с помощью указанных кодов форматирования. Возвращаемое
значение не включает завершающий символ NULL. Функция _vscwprintf
выполняет эту же операцию для расширенных символов.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Если format является пустым указателем, вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, функции возвращают значение -1 и задают для errno
значение EINVAL .

Комментарии
Каждый argument (при наличии) преобразуется согласно соответствующей
спецификации формата в параметре format . Формат состоит из обычных символов
и имеет те же форму и функциональные возможности, что и аргумент format для
printf.

) Важно!

Если параметр format является определяемой пользователем строкой,


убедитесь, что она содержат завершающий нуль-символ и имеет правильное
количество и тип параметров. Дополнительные сведения см . в статье
Предотвращение переполнения буфера.

Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представляемые числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись вверх. IEEE 754 утверждает, что они должны округлить до
ближайшей четной цифры (также известный как "Округление банкира").
Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до
2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет
только на точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vsctprintf _vscprintf _vscprintf _vscwprintf

_vsctprintf_l _vscprintf_l _vscprintf_l _vscwprintf_l

Требования
Подпрограмма Обязательный заголовок

_vscprintf , _vscprintf_l <stdio.h>

_vscwprintf , _vscwprintf_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для vsprintf.

См. также раздел


Потоковый ввод-вывод

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

Функции vprintf
_vscprintf_p , _vscprintf_p_l ,
_vscwprintf_p , _vscwprintf_p_l
Статья • 03.04.2023

Возвращают число символов в форматированной строке, используя указатель на


список аргументов, с возможностью указать порядок, в котором эти аргументы
используются.

Синтаксис
C

int _vscprintf_p(

const char *format,

va_list argptr

);

int _vscprintf_p_l(

const char *format,

_locale_t locale,

va_list argptr

);

int _vscwprintf_p (

const wchar_t *format,

va_list argptr

);

int _vscwprintf_p_l(

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
format

Строка управления форматом.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.


Дополнительные сведения см. в разделе Синтаксис спецификации
форматирования.

Возвращаемое значение
Функция _vscprintf_p возвращает число символов, которые были бы созданы,
если строка, указанная в списке аргументов, была бы напечатана либо отправлена
в файл или буфер с помощью указанных кодов форматирования. Возвращаемое
значение не включает завершающий символ NULL. Функция _vscwprintf_p
выполняет эту же операцию для расширенных символов.

Комментарии
Эти функции отличаются от _vscprintf и _vscwprintf только тем, что они
поддерживают возможность указать порядок, в котором используются аргументы.
Дополнительные сведения см. в разделе printf_p Позиционные параметры.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Если format является пустым указателем, вызывается обработчик недопустимых


параметров, как описано в разделе Проверка параметров. Если продолжение
выполнения разрешено, функции возвращают значение -1 и задают для errno
значение EINVAL .

) Важно!

Если параметр format является определяемой пользователем строкой,


убедитесь, что она содержат завершающий нуль-символ и имеет правильное
количество и тип параметров. Дополнительные сведения см . в статье
Предотвращение переполнения буфера.
Начиная с Windows 10 версии 2004
(сборка 19041) printf семейство функций выводит точно представленные
числа с плавающей запятой в соответствии с правилами IEEE 754 для
округления. В предыдущих версиях Windows точно представляемые числа с
плавающей запятой, заканчивающиеся на "5", всегда округлялись вверх. IEEE
754 утверждает, что они должны округлить до ближайшей четной цифры
(также известный как "Округление банкира"). Например, и printf("%1.0f",
1.5) printf("%1.0f", 2.5) должны округлиться до 2. Ранее значение 1,5
округлялось до 2, а 2,5 — до 3. Это изменение влияет только на точно
представленные числа. Например, значение 2,35 (которое при представлении
в памяти ближе к 2,35000000000000008) по-прежнему округляется до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбирало FE_TONEAREST поведение. Это изменение
затрагивает только программы, созданные с помощью Visual Studio 2019
версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vsctprintf_p _vscprintf_p _vscprintf_p _vscwprintf_p

_vsctprintf_p_l _vscprintf_p_l _vscprintf_p_l _vscwprintf_p_l

Требования
Подпрограмма Обязательный заголовок

_vscprintf_p , _vscprintf_p_l <stdio.h>

_vscwprintf_p , _vscwprintf_p_l <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
См. пример для vsprintf.

См. также раздел


Функции vprintf

_scprintf_p, _scprintf_p_l, _scwprintf_p, _scwprintf_p_l

_vscprintf, _vscprintf_l, _vscwprintf, _vscwprintf_l\


vsnprintf , _vsnprintf , _vsnprintf_l ,
_vsnwprintf , _vsnwprintf_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Доступны более безопасные версии этих функций; см.
разделvsnprintf_s , _vsnprintf_s, _vsnprintf_s_l, _vsnwprintf_s, . _vsnwprintf_s_l

Синтаксис
C

int vsnprintf(

char *buffer,

size_t count,

const char *format,

va_list argptr

);

int _vsnprintf(

char *buffer,

size_t count,

const char *format,

va_list argptr

);

int _vsnprintf_l(

char *buffer,

size_t count,

const char *format,

_locale_t locale,

va_list argptr

);

int _vsnwprintf(

wchar_t *buffer,

size_t count,

const wchar_t *format,

va_list argptr

);

int _vsnwprintf_l(

wchar_t *buffer,

size_t count,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

template <size_t size>

int vsnprintf(

char (&buffer)[size],

size_t count,

const char *format,

va_list argptr

); // C++ only

template <size_t size>

int _vsnprintf(

char (&buffer)[size],

size_t count,

const char *format,

va_list argptr

); // C++ only

template <size_t size>

int _vsnprintf_l(

char (&buffer)[size],

size_t count,

const char *format,

_locale_t locale,

va_list argptr

); // C++ only

template <size_t size>

int _vsnwprintf(

wchar_t (&buffer)[size],

size_t count,

const wchar_t *format,

va_list argptr

); // C++ only

template <size_t size>

int _vsnwprintf_l(

wchar_t (&buffer)[size],

size_t count,

const wchar_t *format,

_locale_t locale,

va_list argptr

); // C++ only

Параметры
buffer

Место хранения выходных данных.

count

Наибольшее количество символов для записи.

format

Спецификация формата.

argptr

Указатель на список аргументов.


locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Синтаксис спецификации


форматирования.

Возвращаемое значение
Функция vsnprintf возвращает количество записанных символов, не считая
завершающего символа NULL. Если размер буфера, указанный параметром count ,
недостаточно велик, чтобы содержать выходные данные, указанные format в и
argptr , возвращаемым значением vsnprintf является число записанных символов,
не считая символ null, если count они были достаточно большими. Если
возвращаемое значение больше count –1, выходные данные были усечены.
Возвращаемое значение –1 указывает, что произошла ошибка кодирования.

Обе _vsnprintf функции и _vsnwprintf возвращают количество записанных


символов, если число записываемых символов меньше или равно count . Если
число записываемых символов больше , эти count функции возвращают значение
-1, указывающее на усечение выходных данных.

Значение, возвращаемое всеми этими функциями, не включает завершающее


значение NULL независимо от того, записывается ли он.

Если count значение равно нулю и buffer равно NULL , возвращается число
символов, которые будут записывать функции. Значение не учитывает
завершающийся NULL . Этот результат можно использовать для выделения
достаточного пространства буфера для строки и завершающего значения
NULL, а затем снова вызвать функцию для заполнения буфера.
Если count значение равно нулю, но buffer не NULL равно , ничего не
записывается и функция возвращает -1 .
Если format имеет значение NULL , или если buffer значение равно NULL и
count не равно нулю, эти функции вызывают обработчик недопустимых

параметров, как описано в разделе Проверка параметров. Если разрешается


продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

Комментарии
Каждая из этих функций принимает указатель на список аргументов, затем
форматирует count данные и записывает до символов в память, на которую
buffer указывает . Функция vsnprintf всегда записывает знак завершения NULL,

даже если усекает выходные данные. При использовании _vsnprintf и


_vsnwprintf буфер завершается со значением NULL, только если в конце есть место

(то есть, если число записываемых символов меньше count ).

) Важно!

Чтобы избежать определенных видов угроз безопасности, убедитесь, что


format это не определяемая пользователем строка. Дополнительные сведения
см . в статье Предотвращение переполнения буфера.
Начиная с Windows 10
версии 2004 (сборка 19041) printf семейство функций выводит точно
представленные числа с плавающей запятой в соответствии с правилами IEEE
754 для округления. В предыдущих версиях Windows точно представляемые
числа с плавающей запятой, заканчивающиеся на "5", всегда округлялись
вверх. IEEE 754 утверждает, что они должны округлить до ближайшей четной
цифры (также известный как "Округление банкира"). Например, и
printf("%1.0f", 1.5) printf("%1.0f", 2.5) должны округлиться до 2. Ранее
значение 1,5 округлялось до 2, а 2,5 — до 3. Это изменение влияет только на
точно представленные числа. Например, значение 2,35 (которое при
представлении в памяти ближе к 2,35000000000000008) по-прежнему
округляется до 2,4. Округление, выполняемое этими функциями, теперь также
учитывает режим округления с плавающей запятой, заданный параметром
fesetround. Ранее округление всегда выбирало FE_TONEAREST поведение. Это
изменение затрагивает только программы, созданные с помощью Visual Studio
2019 версии 16.2 и более поздних версий. Чтобы использовать устаревшее
поведение округления с плавающей запятой, свяжите с
legacy_stdio_float_rounding.obj.

7 Примечание

Чтобы убедиться в наличии места для завершающего значения NULL при


вызове _vsnprintf , _vsnprintf_l _vsnwprintf и _vsnwprintf_l , убедитесь, что
count длина буфера строго меньше, чем длина буфера, и инициализируйте
буфер значением NULL перед вызовом функции.

Так как vsnprintf всегда записывает завершающий символ NULL, параметр


count может быть равен размеру буфера.
Начиная с UCRT в Visual Studio 2015 и Windows 10, vsnprintf больше не идентичен
_vsnprintf . Функция vsnprintf соответствует стандарту C99; _vnsprintf сохраняется
для обеспечения обратной совместимости со старым кодом Visual Studio.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

Сопоставления подпрограмм с универсальным


текстом

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_vsntprintf _vsnprintf _vsnprintf _vsnwprintf

_vsntprintf_l _vsnprintf_l _vsnprintf_l _vsnwprintf_l

Требования
Подпрограмма Обязательный Обязательный заголовок (C++)
заголовок (C)

vsnprintf , _vsnprintf , <stdio.h> <stdio.h> либо <cstdio>


_vsnprintf_l

_vsnwprintf , _vsnwprintf_l <stdio.h> или <wchar.h> <stdio.h> , <wchar.h> , <cstdio> или


<cwchar>

Функции _vsnprintf , _vsnprintf_l и _vsnwprintf _vsnwprintf_l относятся к


корпорации Майкрософт. Дополнительные сведения о совместимости см. в
разделе Compatibility.

Пример. Использование расширенных


символов с _vsnwprintf()
C
// crt_vsnwprintf.c

// compile by using: cl /W3 crt_vsnwprintf.c

// To turn off error C4996, define this symbol:

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

#include <wtypes.h>

#define BUFFCOUNT (10)

void FormatOutput(LPCWSTR formatstring, ...)

int nSize = 0;

wchar_t buff[BUFFCOUNT];

memset(buff, 0, sizeof(buff));

va_list args;

va_start(args, formatstring);
// Note: _vsnwprintf is deprecated; consider vsnwprintf_s instead

nSize = _vsnwprintf(buff, BUFFCOUNT - 1, formatstring, args); // C4996

wprintf(L"nSize: %d, buff: %ls\n", nSize, buff);

va_end(args);

int main() {

FormatOutput(L"%ls %ls", L"Hi", L"there");

FormatOutput(L"%ls %ls", L"Hi", L"there!");

FormatOutput(L"%ls %ls", L"Hi", L"there!!");

Output

nSize: 8, buff: Hi there

nSize: 9, buff: Hi there!

nSize: -1, buff: Hi there!

Поведение изменяется в том случае, если вместо этого использовать vsnprintf с


узкими строковыми параметрами. Параметр count может представлять весь
размер буфера, и возвращаемое значение — это количество символов, которые
были бы записаны, если бы count был достаточно велик:

Пример. Использование vsnprintf() с


узкими строками
C

// crt_vsnprintf.c

// compile by using: cl /W4 crt_vsnprintf.c

#include <stdio.h>

#include <stdarg.h> // for va_list, va_start

#include <string.h> // for memset

#define BUFFCOUNT (10)

void FormatOutput(char* formatstring, ...)

int nSize = 0;

char buff[BUFFCOUNT];

memset(buff, 0, sizeof(buff));

va_list args;

va_start(args, formatstring);
nSize = vsnprintf(buff, sizeof(buff), formatstring, args);

printf("nSize: %d, buff: %s\n", nSize, buff);

va_end(args);

int main() {

FormatOutput("%s %s", "Hi", "there"); // 8 chars + null

FormatOutput("%s %s", "Hi", "there!"); // 9 chars + null

FormatOutput("%s %s", "Hi", "there!!"); // 10 chars + null

Output

nSize: 8, buff: Hi there

nSize: 9, buff: Hi there!

nSize: 10, buff: Hi there!

См. также раздел


Потоковый ввод-вывод

Функции vprintf

Синтаксис спецификации формата: printf и wprintf функции

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


vsnprintf_s , _vsnprintf_s ,
_vsnprintf_s_l , _vsnwprintf_s ,
_vsnwprintf_s_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Эти функции являются версиями vsnprintf, _vsnprintf, _vsnprintf_l,
_vsnwprintf, с _vsnwprintf_l улучшениями безопасности, как описано в разделе
Функции безопасности в CRT.

Синтаксис
C

int vsnprintf_s(

char *buffer,

size_t sizeOfBuffer,
size_t count,

const char *format,

va_list argptr

);

int _vsnprintf_s(

char *buffer,

size_t sizeOfBuffer,
size_t count,

const char *format,

va_list argptr

);

int _vsnprintf_s_l(

char *buffer,

size_t sizeOfBuffer,
size_t count,

const char *format,

_locale_t locale,

va_list argptr

);

int _vsnwprintf_s(

wchar_t *buffer,

size_t sizeOfBuffer,
size_t count,

const wchar_t *format,

va_list argptr

);

int _vsnwprintf_s_l(

wchar_t *buffer,

size_t sizeOfBuffer,
size_t count,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

template <size_t size>

int _vsnprintf_s(

char (&buffer)[size],

size_t count,

const char *format,

va_list argptr

); // C++ only

template <size_t size>

int _vsnwprintf_s(

wchar_t (&buffer)[size],

size_t count,

const wchar_t *format,

va_list argptr

); // C++ only

Параметры
buffer

Место хранения выходных данных.

sizeOfBuffer

Размер buffer для вывода, как количество символов.

count

Максимальное число записываемых символов (не включая завершающее значение


NULL) или _TRUNCATE.

format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Дополнительные сведения см. в разделе Спецификации формата.

Возвращаемое значение
vsnprintf_s _vsnwprintf_s и _vsnprintf_s возвращают число записанных символов,

не включая завершающее значение NULL или отрицательное значение, если


происходит усечение данных или ошибка вывода.

Если count значение меньше , а sizeOfBuffer число символов данных меньше


или равно count , или count равно _TRUNCATE , а число символов данных
меньше sizeOfBuffer , то записываются все данные и возвращается число
символов.

Если count значение меньше, чем sizeOfBuffer , но объем данных превышает


count число символов, то записываются первые count символы. Происходит
усечение оставшихся данных, и возвращается значение -1 без вызова
обработчика недопустимых параметров.

Если count значение равно _TRUNCATE , а число символов данных равно или
превышает sizeOfBuffer , записывается столько строки, сколько вместится в
buffer (с завершающим значением NULL). Происходит усечение оставшихся
данных, и возвращается значение -1 без вызова обработчика недопустимых
параметров.

Если count значение равно или превышает sizeOfBuffer , но количество


символов данных меньше sizeOfBuffer , то все данные записываются (с
завершающим значением NULL) и возвращается количество символов.

Если count и число символов данных равно или превышает sizeOfBuffer ,


вызывается обработчик недопустимых параметров, как описано в разделе
Проверка параметров. Если после обработчика недопустимых параметров
выполнение приложения продолжается, эти функции устанавливают значение
параметра buffer равным пустой строке, устанавливают для errno значение
ERANGE и возвращают значение –1.

Если параметр buffer или format является пустым ( NULL ) указателем или если
значение параметра count меньше или равно нулю, вызывается обработчик
недопустимых параметров. Если продолжение выполнения разрешено, эти
функции устанавливают для errno значение EINVAL и возвращают -1.

Условия ошибок

Условие Возвращаемое значение errno

buffer имеет значение NULL . -1 EINVAL


Условие Возвращаемое значение errno

format имеет значение NULL . -1 EINVAL

count <= 0 -1 EINVAL

sizeOfBuffer слишком мал (и count != –1 (и buffer задается равным пустой ERANGE


_TRUNCATE ) строке)

Комментарии
Функция vsnprintf_s идентична функции _vsnprintf_s . vsnprintf_s включается для
соответствия стандарту ANSI. Функция _vnsprintf поддерживается для
совместимости с предыдущими версиями.

Каждая из этих функций принимает указатель на список аргументов, затем


форматирует и записывает до count символов заданных данных в область памяти,
на которую указывает buffer , затем добавляет завершающий нуль-символ.

Если count имеет значение _TRUNCATE, эти функции записывают столько строк,
сколько вместится в buffer , оставляя место для завершающего значения NULL.
Если вся строка (с учетом завершающего нуль-символа) помещается в buffer , эти
функции возвращают количество записанных символов (не включая завершающий
нуль-символ); в противном случае эти функции возвращают значение –1, что
указывает на то, что произошло усечение.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Убедитесь, что format не является строкой, определяемой пользователем.


Дополнительные сведения см . в статье Предотвращение переполнения
буфера.
Начиная с Windows 10 версии 2004 (сборка 19041) printf семейство
функций выводит точно представленные числа с плавающей запятой в
соответствии с правилами IEEE 754 для округления. В предыдущих версиях
Windows точно представляемые числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись вверх. IEEE 754 утверждает, что
они должны округлить до ближайшей четной цифры (также известный как
"Округление банкира"). Например, и printf("%1.0f", 1.5) printf("%1.0f", 2.5)
должны округлиться до 2. Ранее значение 1,5 округлялось до 2, а 2,5 — до 3.
Это изменение влияет только на точно представленные числа. Например,
значение 2,35 (которое при представлении в памяти ближе к
2,35000000000000008) по-прежнему округляется до 2,4. Округление,
выполняемое этими функциями, теперь также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбирало FE_TONEAREST поведение. Это изменение затрагивает только
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

7 Примечание

Чтобы было достаточно места для завершающего нуль-символа, убедитесь,


что значение параметра count строго меньше размера буфера, или
используйте _TRUNCATE .

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

 Совет

Если вы получаете неопределенную внешнюю _vsnprintf_s ошибку и


используете универсальную среду выполнения C, добавьте
legacy_stdio_definitions.lib в набор библиотек для связывания.
Универсальная среда выполнения C не экспортирует эту функцию напрямую и
определяется в . <stdio.h> Дополнительные сведения см. в статье Общие
сведения о потенциальных проблемах обновления и изменениях
соответствия Visual Studio 2015.

Сопоставления подпрограмм с универсальным


текстом
TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_vsntprintf_s _vsnprintf_s _vsnprintf_s _vsnwprintf_s

_vsntprintf_s_l _vsnprintf_s_l _vsnprintf_s_l _vsnwprintf_s_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

vsnprintf_s <stdio.h> и <stdarg.h> <varargs.h> *

_vsnprintf_s , <stdio.h> и <stdarg.h> <varargs.h> *


_vsnprintf_s_l

_vsnwprintf_s , <stdio.h> или <wchar.h> , и <varargs.h> *


_vsnwprintf_s_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C++

// crt_vsnprintf_s.cpp

#include <stdio.h>

#include <wtypes.h>

void FormatOutput(LPCSTR formatstring, ...)

int nSize = 0;

char buff[10];

memset(buff, 0, sizeof(buff));

va_list args;

va_start(args, formatstring);

nSize = vsnprintf_s( buff, _countof(buff), _TRUNCATE, formatstring,


args);

printf("nSize: %d, buff: %s\n", nSize, buff);

va_end(args);

int main() {

FormatOutput("%s %s", "Hi", "there");

FormatOutput("%s %s", "Hi", "there!");

FormatOutput("%s %s", "Hi", "there!!");

Output

nSize: 8, buff: Hi there

nSize: 9, buff: Hi there!

nSize: -1, buff: Hi there!

См. также раздел


Потоковый ввод-вывод

Функции vprintf

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start\


vsprintf , _vsprintf_l , vswprintf ,
_vswprintf_l , __vswprintf_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Доступны более безопасные версии этих функций; see vsprintf_s,
_vsprintf_s_l, vswprintf_s_vswprintf_s_l.

Синтаксис
C

int vsprintf(

char *buffer,

const char *format,

va_list argptr

);

int _vsprintf_l(

char *buffer,

const char *format,

_locale_t locale,

va_list argptr

);

int vswprintf(

wchar_t *buffer,

size_t count,

const wchar_t *format,

va_list argptr

);

int _vswprintf_l(

wchar_t *buffer,

size_t count,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

int __vswprintf_l(

wchar_t *buffer,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

template <size_t size>

int vsprintf(

char (&buffer)[size],

const char *format,

va_list argptr

); // C++ only

template <size_t size>

int _vsprintf_l(

char (&buffer)[size],

const char *format,

_locale_t locale,

va_list argptr

); // C++ only

template <size_t size>

int vswprintf(

wchar_t (&buffer)[size],

const wchar_t *format,

va_list argptr

); // C++ only

template <size_t size>

int _vswprintf_l(

wchar_t (&buffer)[size],

const wchar_t *format,

_locale_t locale,

va_list argptr

); // C++ only

Параметры
buffer

Место хранения выходных данных.

count

Максимальное количество символов для хранения в широкой строковой версии


этой функции.

format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Возвращаемое значение
vsprintf и vswprintf возвращает число записанных символов, не включая
завершающий NULL символ, или отрицательное значение при возникновении
ошибки вывода. Если buffer или format является указателем NULL , эти функции
вызывают обработчик недопустимых параметров, как описано в разделе
"Проверка параметров". Если разрешается продолжать выполнение, эти функции
возвращают -1 и задают errno значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, и


_doserrno_sys_errlist_sys_nerr.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в память, на которую указывает
buffer .

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

) Важно!

Использование vsprintf не позволяет ограничить количество записанных


символов, что означает, что код, использующий эту функцию, подвержен
переполнению буфера. Используйте _vsnprintf вместо этого или вызов
_vscprintf , чтобы определить, насколько необходим буфер. Кроме того,
убедитесь, что format не является строкой, определяемой пользователем.
Дополнительные сведения см. в разделе "Предотвращение переполнения
буфера".
Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство
функций выводит точно представленные числа с плавающей запятой в
соответствии с правилами IEEE 754 для округления. В предыдущих версиях
Windows точно представленные числа с плавающей запятой,
заканчивающиеся на "5", всегда округлялись вверх. IEEE 754 утверждает, что
они должны округляются до ближайшей четной цифры (также известной как
"Округление банкира"). Например, оба printf("%1.0f", 1.5) и printf("%1.0f",
2.5) должны округляется до 2. Ранее 1,5 округлялось до 2 и 2,5 округлялось до
3. Это изменение влияет только на точно представляемые числа. Например,
2.35 (который при представлении в памяти приближается к
2,350000000000000000008) продолжает округляется до 2,4. Округление,
выполняемое этими функциями, также учитывает режим округления с
плавающей запятой, заданный параметром fesetround. Ранее округление
всегда выбрало FE_TONEAREST поведение. Это изменение влияет только на
программы, созданные с помощью Visual Studio 2019 версии 16.2 и более
поздних версий. Чтобы использовать устаревшее поведение округления с
плавающей запятой, свяжите с legacy_stdio_float_rounding.obj.

vswprintf соответствует стандарту ISO C, который требует указания второго

параметра ( count ) типа size_t . Чтобы применить нестандартное поведение


принудительно, определите функцию _CRT_NON_CONFORMING_SWPRINTFS . Старое
поведение может не находиться в будущей версии, поэтому для использования
нового соответствующего поведения следует изменить код.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
"Безопасные перегрузки шаблонов".

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные

_vstprintf vsprintf vsprintf vswprintf

_vstprintf_l _vsprintf_l _vsprintf_l _vswprintf_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

vsprintf , _vsprintf_l <stdio.h> и <stdarg.h> <varargs.h> *

vswprintf , <stdio.h> или <wchar.h> , и <varargs.h> *


_vswprintf_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_vsprintf.c

// compile with: cl /W4 crt_vsprintf.c

// This program uses vsprintf to write to a buffer.

// The size of the buffer is determined by _vscprintf.

#define _CRT_SECURE_NO_WARNINGS

#include <stdlib.h>

#include <stdio.h>

#include <stdarg.h>

void test( char const * const format, ... )

va_list args;

int len;

char *buffer;

// retrieve the variable arguments

va_start( args, format );

len = _vscprintf( format, args ) // _vscprintf doesn't count

+ 1; // terminating '\0'

buffer = (char*)malloc( len * sizeof(char) );

if ( 0 != buffer )

vsprintf( buffer, format, args ); // C4996

// Note: vsprintf is deprecated; consider using vsprintf_s instead

puts( buffer );

free( buffer );

va_end( args );

int main( void )

test( "%d %c %d", 123, '<', 456 );

test( "%s", "This is a string" );

Output

123 < 456

This is a string

См. также раздел


Потоковый ввод-вывод

Функции vprintf

Синтаксис спецификации формата: printf и wprintf функции

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


_vsprintf_p , _vsprintf_p_l ,
_vswprintf_p , _vswprintf_p_l
Статья • 03.04.2023

Записывают форматированные выходные данные, используя указатель на список


аргументов, с возможностью указать порядок, в котором эти аргументы
используются.

Синтаксис
C

int _vsprintf_p(

char *buffer,

size_t sizeInBytes,

const char *format,

va_list argptr

);

int _vsprintf_p_l(

char *buffer,

size_t sizeInBytes,

const char *format,

_locale_t locale,

va_list argptr

);

int _vswprintf_p(

wchar_t *buffer,

size_t count,

const wchar_t *format,

va_list argptr

);

int _vswprintf_p_l(

wchar_t *buffer,

size_t count,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

Параметры
buffer

Место хранения выходных данных.


sizeInBytes

Размер buffer в символах.

count

Максимальное количество символов, которое может хранить эта функция в версии


Юникод.

format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Функции _vsprintf_p и _vswprintf_p возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в память, на которую указывает
buffer .

Эти функции отличаются от функций vsprintf_s и vswprintf_s только в том, что


они поддерживают позиционные параметры. Дополнительные сведения см. в
разделе Позиционные параметры printf_p.

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

Если или format параметры buffer являются NULL указателями, если число равно
нулю или строка форматирования содержит недопустимые символы
форматирования, вызывается обработчик недопустимых параметров, как описано
в разделе "Проверка параметров". Если продолжение выполнения разрешено,
функции возвращают значение -1 и задают для errno значение EINVAL .
) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5
округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно
представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vstprintf_p _vsprintf_p _vsprintf_p _vswprintf_p

_vstprintf_p_l _vsprintf_p_l _vsprintf_p_l _vswprintf_p_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

_vsprintf_p , _vsprintf_p_l <stdio.h> и <stdarg.h> <varargs.h>*

_vswprintf_p , <stdio.h> или <wchar.h> и <varargs.h>*


_vswprintf_p_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.


Пример
C

// crt__vsprintf_p.c

// This program uses vsprintf_p to write to a buffer.

// The size of the buffer is determined by _vscprintf_p.

#include <stdlib.h>

#include <stdio.h>

#include <stdarg.h>

void example( char * format, ... )

va_list args;

int len;

char *buffer = NULL;

va_start( args, format );

// _vscprintf doesn't count the

// null terminating string so we add 1.

len = _vscprintf_p( format, args ) + 1;

// Allocate memory for our buffer

buffer = (char*)malloc( len * sizeof(char) );

if (buffer)

_vsprintf_p( buffer, len, format, args );

puts( buffer );

free( buffer );

va_end( args );

int main( void )

// First example

example( "%2$d %1$c %3$d", '<', 123, 456 );

// Second example

example( "%s", "This is a string" );

Output

123 < 456

This is a string

См. также раздел


Потоковый ввод-вывод

Функции vprintf

Синтаксис спецификации формата: printf и wprintf функции

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


vsprintf_s , _vsprintf_s_l , vswprintf_s ,
_vswprintf_s_l
Статья • 03.04.2023

Записывают форматированные выходные данные с помощью указателя на список


аргументов. Эти функции представляют собой версии vsprintf, ,
_vsprintf_lvswprintf_vswprintf_l"__vswprintf_l" с улучшениями безопасности, как
описано в функциях безопасности в CRT.

Синтаксис
C

int vsprintf_s(

char *buffer,

size_t numberOfElements,

const char *format,

va_list argptr

);

int _vsprintf_s_l(

char *buffer,

size_t numberOfElements,

const char *format,

_locale_t locale,

va_list argptr

);

int vswprintf_s(

wchar_t *buffer,

size_t numberOfElements,

const wchar_t *format,

va_list argptr

);

int _vswprintf_s_l(

wchar_t *buffer,

size_t numberOfElements,

const wchar_t *format,

_locale_t locale,

va_list argptr

);

template <size_t size>

int vsprintf_s(

char (&buffer)[size],

const char *format,

va_list argptr

); // C++ only

template <size_t size>

int vswprintf_s(

wchar_t (&buffer)[size],

const wchar_t *format,

va_list argptr

); // C++ only

Параметры
buffer

Место хранения выходных данных.

numberOfElements

Размер buffer в символах.

format

Спецификация формата.

argptr

Указатель на список аргументов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Функции vsprintf_s и vswprintf_s возвращают число записанных символов, не
включая конечный нуль-символ, или отрицательное значение, если произошла
ошибка вывода. Если buffer или format является пустым указателем, если
numberOfElements оно равно нулю или если строка форматирования содержит

недопустимые символы форматирования, вызывается обработчик недопустимых


параметров, как описано в разделе "Проверка параметров". Если продолжение
выполнения разрешено, функции возвращают значение -1 и задают для errno
значение EINVAL .

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno,


_doserrno_sys_errlistи _sys_nerr.

Комментарии
Каждая из этих функций принимает указатель на список аргументов, а затем
форматирует и записывает указанные данные в память, на которую указывает
buffer .
vswprintf_s соответствует стандарту ISO C для vswprintf , который требует указания

второго параметра count типа size_t .

Эти функции отличаются от менее безопасных версий только тем, что они
поддерживают позиционные параметры. Дополнительные сведения см. в разделе
printf_p "Позиционные параметры".

Версии этих функций с суффиксом _l идентичны за исключением того, что они


используют переданный параметр языкового стандарта вместо языкового
стандарта текущего потока.

В C++использование этих функций упрощается перегрузками шаблонов.


Перегрузки могут автоматически определять длину буфера, устраняя
необходимость указания аргумента размера. Кроме того, они могут автоматически
заменять небезопасные функции своими безопасными аналогами.
Дополнительные сведения см. в разделе "Безопасные перегрузки шаблонов".

) Важно!

Начиная с Windows 10 версии 2004 (сборка 19041), printf семейство функций


выводит точно представленные числа с плавающей запятой в соответствии с
правилами IEEE 754 для округления. В предыдущих версиях Windows точно
представленные числа с плавающей запятой, заканчивающиеся на "5", всегда
округлялись. IEEE 754 указывает, что они должны округить до ближайшей
четной цифры (также известной как "Округление банкира"). Например, оба
printf("%1.0f", 1.5) и printf("%1.0f", 2.5) должны округить до 2. Ранее 1,5
округляется до 2 и 2,5 округляется до 3. Это изменение влияет только на точно
представляемые числа. Например, 2,35 (который при представлении в памяти
приближается к 2,3500000000000000008) продолжает округление до 2,4.
Округление, выполняемое этими функциями, теперь также учитывает режим
округления с плавающей запятой, заданный параметром fesetround. Ранее
округление всегда выбрало FE_TONEAREST поведение. Это изменение влияет
только на программы, созданные с помощью Visual Studio 2019 версии 16.2 и
более поздних версий. Чтобы использовать устаревшее поведение округления
с плавающей запятой, свяжите с "legacy_stdio_float_rounding.obj".

Сопоставления подпрограмм универсального текста

TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE


Обычной определены Определенные Определенные
TCHAR.H _UNICODE и _MBCS не _MBCS _UNICODE
Обычной определены Определенные Определенные

_vstprintf_s vsprintf_s vsprintf_s vswprintf_s

_vstprintf_s_l _vsprintf_s_l _vsprintf_s_l _vswprintf_s_l

Требования
Подпрограмма Обязательный заголовок Необязательные
заголовки

vsprintf_s , _vsprintf_s_l <stdio.h> и <stdarg.h> <varargs.h>*

vswprintf_s , <stdio.h> или , и <wchar.h> <varargs.h>*


_vswprintf_s_l <stdarg.h>

* Требуется для совместимости с UNIX V.

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_vsprintf_s.c

// Compile with: cl /W4 crt_vsprintf_s.c

// This program uses vsprintf_s to write to a buffer.

// The size of the buffer is determined by _vscprintf.

#include <stdlib.h>

#include <stdio.h>

#include <stdarg.h>

void test( char const * const format, ... )

va_list args;

int len;

char * buffer;

va_start( args, format );

len = _vscprintf( format, args ) // _vscprintf doesn't count

+ 1; // terminating '\0'

buffer = (char *) malloc( len * sizeof(char) );

if ( NULL != buffer )

vsprintf_s( buffer, len, format, args );

puts( buffer );

free( buffer );

va_end( args );

int main( void )

test( "%d %c %d", 123, '<', 456 );

test( "%s", "This is a string" );

Output

123 < 456

This is a string

См. также раздел


Потоковый ввод-вывод

Функции vprintf

Синтаксис спецификации формата: printf и wprintf функции

fprintf, _fprintf_l, fwprintf, _fwprintf_l

printf, _printf_l, wprintf, _wprintf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

va_arg, va_copy, va_end, va_start


vsscanf , vswscanf
Статья • 03.04.2023

Считывают форматированные данные из строки. Доступны более безопасные


версии этих функций; См. разделvsscanf_s , vswscanf_s.

Синтаксис
C

int vsscanf(

const char *buffer,

const char *format,

va_list arglist

);

int vswscanf(

const wchar_t *buffer,

const wchar_t *format,

va_list arglist

);

Параметры
buffer

Сохраненные данные

format

Строка управления форматом. Дополнительные сведения см. в разделе Поля


спецификации форматирования: scanf и wscanf функции.

arglist

Список аргументов переменных.

Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые успешно
преобразованы и назначены. Возвращаемое значение не включает поля, которые
были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля
не были назначены. Если до первого преобразования возникает ошибка или
достигается конец строки, возвращается значение EOF .
Если buffer или format является указателем NULL , вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
разрешается продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция vsscanf считывает данные из buffer в расположения, указанные
аргументами в списке аргументов arglist . Каждый аргумент в списке должен быть
указателем на переменную, которая имеет тип, соответствующий спецификатору
типа в параметре format . Аргумент format определяет интерпретацию полей
входных данных и имеет такую же форму и функцию, как аргумент format для
функции scanf . Если копирование производится между перекрывающимися
строками, поведение не определено.

) Важно!

При использовании для vsscanf чтения строки всегда указывайте ширину


формата %s (например, "%32s" вместо "%s"). В противном случае
неправильно отформатированные входные данные могут привести к
переполнению буфера.

vswscanf — это двухбайтовая версия vsscanf ; аргументы для vswscanf

представляют собой двухбайтовые строки. vsscanf не обрабатывает


многобайтовые шестнадцатеричные символы. vswscanf не обрабатывает
полноширивые шестнадцатеричные символы Юникода или символы зоны
совместимости. В противном случае поведение vswscanf и vsscanf идентично.

Сопоставления подпрограмм с универсальным


текстом

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vstscanf vsscanf vsscanf vswscanf


Требования
Подпрограмма Обязательный заголовок

vsscanf <stdio.h>

vswscanf <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_vsscanf.c

// compile with: /W3

// This program uses vsscanf to read data items

// from a string named tokenstring, then displays them.

#include <stdio.h>

#include <stdarg.h>

int call_vsscanf(char *tokenstring, char *format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vsscanf(tokenstring, format, arglist);

va_end(arglist);

return result;

int main( void )

char tokenstring[] = "15 12 14...";

char s[81];

char c;

int i;

float fp;

// Input various data from tokenstring:

// max 80 character string:

call_vsscanf(tokenstring, "%80s", s);

call_vsscanf(tokenstring, "%c", &c);

call_vsscanf(tokenstring, "%d", &i);

call_vsscanf(tokenstring, "%f", &fp);

// Output the data read

printf("String = %s\n", s);

printf("Character = %c\n", c);

printf("Integer: = %d\n", i);

printf("Real: = %f\n", fp);

Output

String = 15

Character = 1

Integer: = 15

Real: = 15.000000

См. также раздел


Потоковый ввод-вывод

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

vsscanf_s, vswscanf_s
vsscanf_s , vswscanf_s
Статья • 03.04.2023

Считывают форматированные данные из строки. Эти версии vsscanfимеют vswscanf


улучшения безопасности, как описано в разделе Функции безопасности в CRT.

Синтаксис
C

int vsscanf_s(

const char *buffer,

const char *format,

va_list argptr

);

int vswscanf_s(

const wchar_t *buffer,

const wchar_t *format,

va_list arglist

);

Параметры
buffer

Сохраненные данные

format

Строка управления форматом. Дополнительные сведения см. в разделе Поля


спецификации формата: scanf и wscanf функции.

arglist

Список аргументов переменных.

Возвращаемое значение
Каждая из этих функций возвращает количество полей, которые успешно
преобразованы и назначены. Возвращаемое значение не включает поля, которые
были прочитаны, но не назначены. Возвращаемое значение 0 указывает, что поля
не были назначены. Если до первого преобразования возникает ошибка или
достигается конец строки, возвращается значение EOF .
Если buffer или format является указателем NULL , вызывается обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
разрешается продолжать выполнение, эти функции возвращают -1 и задают errno
значение EINVAL .

Сведения об этих и других кодах ошибок см. в разделе errno, _doserrno, _sys_errlistи
_sys_nerr.

Комментарии
Функция vsscanf_s считывает данные из buffer в расположения, указанные
аргументами в списке аргументов arglist . Аргументы в списке аргументов задают
указатели на переменные, имеющие тип, соответствующий спецификатору типа в
format . В отличие от менее безопасной версии vsscanf параметр размера буфера
является обязательным при использовании символов полей типа c, C, s, S или
наборов элементов управления строк, заключенных в []. Размер буфера в символах
должен быть указан в качестве другого параметра сразу после каждого параметра
буфера, которому он требуется.

Размер буфера включает завершающее значение NULL. Можно использовать поле


спецификации ширины, чтобы гарантировать, что считываемый токен поместится в
буфер. Если поле спецификации ширины не используется, а считываемые в файле
маркеры слишком велики, чтобы поместиться в буфер, в этот буфер ничего не
записывается.

Дополнительные сведения см. в разделе scanf_s, _scanf_s_l, _wscanf_s_lwscanf_s и


scanf Type Field Characters.

7 Примечание

Параметр размера имеет тип unsigned , а не size_t .

Аргумент format определяет интерпретацию полей входных данных и имеет такую


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

vswscanf_s — это двухбайтовая версия vsscanf_s ; аргументы для vswscanf_s

представляют собой двухбайтовые строки. vsscanf_s не обрабатывает


многобайтовые шестнадцатеричные символы. vswscanf_s не обрабатывает
полноширинный шестнадцатеричный символ Юникода или символы зоны
совместимости. В противном случае поведение vswscanf_s и vsscanf_s идентично.

Сопоставления подпрограмм универсального текста

Подпрограмма _UNICODE и _MBCS не _MBCS _UNICODE


TCHAR.H определены Определенные Определенные

_vstscanf_s vsscanf_s vsscanf_s vswscanf_s

Требования
Подпрограмма Обязательный заголовок

vsscanf_s <stdio.h>

vswscanf_s <stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_vsscanf_s.c

// compile with: /W3

// This program uses vsscanf_s to read data items

// from a string named tokenstring, then displays them.

#include <stdio.h>

#include <stdarg.h>

#include <stdlib.h>

int call_vsscanf_s(char *tokenstring, char *format, ...)

int result;

va_list arglist;

va_start(arglist, format);

result = vsscanf_s(tokenstring, format, arglist);

va_end(arglist);

return result;

int main( void )

char tokenstring[] = "15 12 14...";

char s[81];

char c;

int i;

float fp;

// Input various data from tokenstring:

// max 80 character string:

call_vsscanf_s(tokenstring, "%80s", s, _countof(s));

call_vsscanf_s(tokenstring, "%c", &c, sizeof(char));

call_vsscanf_s(tokenstring, "%d", &i);

call_vsscanf_s(tokenstring, "%f", &fp);

// Output the data read

printf("String = %s\n", s);

printf("Character = %c\n", c);

printf("Integer: = %d\n", i);

printf("Real: = %f\n", fp);

Output

String = 15

Character = 1

Integer: = 15

Real: = 15.000000

См. также раздел


Потоковый ввод-вывод

scanf, _scanf_l, wscanf, _wscanf_l

sscanf, _sscanf_l, swscanf, _swscanf_l

sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l

vsscanf, vswscanf
wcrtomb
Статья • 03.04.2023

Преобразует расширенный символ в соответствующее представление


многобайтового символа. Доступна более безопасная версия этой функции; см.
раздел wcrtomb_s.

Синтаксис
C

size_t wcrtomb(

char *mbchar,

wchar_t wchar,

mbstate_t *mbstate

);

template <size_t size>

size_t wcrtomb(

char (&mbchar)[size],

wchar_t wchar,

mbstate_t *mbstate

); // C++ only

Параметры
mbchar

Итоговый преобразованный многобайтовый символ.

wchar

Расширенный символ для преобразования.

mbstate

Указатель на объект mbstate_t .

Возвращаемое значение
Возвращает число байтов, необходимых для представления преобразованного
многобайтового символа, или значение -1, если произошла ошибка.

Комментарии
Функция wcrtomb преобразует строку расширенных символов, начиная с
указанного состояния преобразования, содержащегося в mbstate , из значения,
содержащегося в wchar , в адрес, представленный mbchar . Возвращаемое значение
— число байтов, необходимых для представления в соответствующего
многобайтового символа, но не более MB_CUR_MAX байт.

Если mbstate имеет значение null, то используется внутренний объект mbstate_t ,


содержащий состояние преобразования mbchar . Если последовательность wchar
символов не имеет соответствующего многобайтового представления символов,
возвращается значение -1, а errno для задается значение EILSEQ .

Функция wcrtomb отличается от wctombфункции возможностью _wctomb_l


перезапуска. Состояние преобразования хранится в переменной mbstate для
последующих вызовов тех же или других перезапускаемых функций. При
смешанном использовании перезапускаемых и неперезапускаемых функций
результаты становятся неопределенными. Например, в приложении следует
использовать функцию wcsrlen вместо функции wcsnlen , если в последующем
вызове используется функция wcsrtombs , а не функция wcstombs .

В C++ эта функция имеет перегрузку шаблона, которая вызывает более новые и
безопасные аналоги этой функции. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Исключения
Функция wcrtomb является потокобезопасной, если ни одна из функций в текущем
потоке не вызывает setlocale , пока выполняется данная функция и пока mbstate
имеет значение null.

Пример
C

// crt_wcrtomb.c

// compile with: /W3

// This program converts a wide character

// to its corresponding multibyte character.

#include <string.h>

#include <stdio.h>

#include <wchar.h>

int main( void )

size_t sizeOfCovertion = 0;

mbstate_t mbstate;

char mbStr = 0;

wchar_t* wcStr = L"Q";

// Reset to initial conversion state

memset(&mbstate, 0, sizeof(mbstate));

sizeOfCovertion = wcrtomb(&mbStr, *wcStr, &mbstate); // C4996

// Note: wcrtomb is deprecated; consider using wcrtomb_s instead

if (sizeOfCovertion > 0)

printf("The corresponding wide character \"");

wprintf(L"%s\"", wcStr);

printf(" was converted to the \"%c\" ", mbStr);

printf("multibyte character.\n");

else

printf("No corresponding multibyte character "

"was found.\n");

Output

The corresponding wide character "Q" was converted to the "Q" multibyte
character.

Требования
Подпрограмма Обязательный заголовок

wcrtomb <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

mbsinit
wcrtomb_s
Статья • 03.04.2023

Преобразует расширенный символ в соответствующее представление


многобайтового символа. Версия wcrtomb с усовершенствованиями безопасности,
как описано в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t wcrtomb_s(

size_t *pReturnValue,

char *mbchar,

size_t sizeOfmbchar,
wchar_t *wchar,

mbstate_t *mbstate

);

template <size_t size>

errno_t wcrtomb_s(

size_t *pReturnValue,

char (&mbchar)[size],

wchar_t *wchar,

mbstate_t *mbstate

); // C++ only

Параметры
pReturnValue

Возвращает записанное число символов или –1 в случае возникновения ошибки.

mbchar

Итоговый преобразованный многобайтовый символ.

sizeOfmbchar

Размер переменной mbchar в байтах.

wchar

Расширенный символ для преобразования.

mbstate

Указатель на объект mbstate_t .


Возвращаемое значение
Возвращает нуль в случае успешного выполнения или значение errno при
возникновении ошибки.

Комментарии
Функция wcrtomb_s преобразует строку расширенных символов, начиная с
указанного состояния преобразования, содержащегося в mbstate , из значения,
содержащегося в wchar , в адрес, представленный mbchar . Значением pReturnValue
будет число преобразованных байтов, но не более MB_CUR_MAX байтов, или -1, если
произошла ошибка.

Если mbstate имеет значение null, используется внутреннее состояние


преобразования mbstate_t . Если символ, содержащийся в wchar , не имеет
соответствующего многобайтового символа pReturnValue , значение равно -1, а
функция возвращает errno значение EILSEQ .

Функция wcrtomb_s отличается от wctomb_sфункции возможностью _wctomb_s_l


перезапуска. Состояние преобразования хранится в переменной mbstate для
последующих вызовов тех же или других перезапускаемых функций. При
смешанном использовании перезапускаемых и неперезапускаемых функций
результаты становятся неопределенными. Например, в приложении следует
использовать функцию wcsrlen вместо функции wcslen , если в последующем
вызове используется функция wcsrtombs_s , а не функция wcstombs_s .

В C++ использование этой функции упрощено наличием шаблонных перегрузок;


перегруженные методы могут автоматически определять длину буфера (что
исключает необходимость указания аргумента с размером буфера), а также они
могут автоматически заменять более старые, незащищенные функции их новыми
безопасными аналогами. Дополнительные сведения см. в разделе Безопасные
перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Исключения
Функция wcrtomb_s является потокобезопасной, если ни одна из функций в
текущем потоке не вызывает setlocale , пока выполняется данная функция, и
mbstate имеет значение null.

Пример
C

// crt_wcrtomb_s.c

// This program converts a wide character

// to its corresponding multibyte character.

//

#include <string.h>

#include <stdio.h>

#include <wchar.h>

int main( void )

errno_t returnValue;

size_t pReturnValue;

mbstate_t mbstate;

size_t sizeOfmbStr = 1;

char mbchar = 0;

wchar_t* wchar = L"Q\0";

// Reset to initial conversion state

memset(&mbstate, 0, sizeof(mbstate));

returnValue = wcrtomb_s(&pReturnValue, &mbchar, sizeof(char),

*wchar, &mbstate);

if (returnValue == 0) {

printf("The corresponding wide character \"");

wprintf(L"%s\"", wchar);

printf(" was converted to a the \"%c\" ", mbchar);

printf("multibyte character.\n");

else

printf("No corresponding multibyte character "

"was found.\n");

Output

The corresponding wide character "Q" was converted to a the "Q" multibyte
character.

Требования
Подпрограмма Обязательный заголовок

wcrtomb_s <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

mbsinit
wcsrtombs
Статья • 03.04.2023

Преобразует строку расширенных символов в соответствующее представление


многобайтовой строки. Доступна более безопасная версия этой функции; см.
раздел wcsrtombs_s.

Синтаксис
C

size_t wcsrtombs(

char *mbstr,

const wchar_t **wcstr,

sizeof count,

mbstate_t *mbstate

);

template <size_t size>

size_t wcsrtombs(

char (&mbstr)[size],

const wchar_t **wcstr,

sizeof count,

mbstate_t *mbstate

); // C++ only

Параметры
mbstr

Расположение адреса итоговой преобразованной строки многобайтовых


символов.

wcstr

Косвенно указывает на расположение преобразуемой строки расширенных


символов.

count

Число преобразуемых символов.

mbstate

Указатель на объект состояния преобразования mbstate_t .

Возвращаемое значение
Возвращает число успешно преобразованных байтов, не включая завершающий
байт NULL (если имеется); в противном случае — значение -1, если произошла
ошибка.

Комментарии
Функция wcsrtombs преобразует строку расширенных символов, начиная с
указанного состояния преобразования, содержащегося в mbstate , из значений,
косвенно указанных в wcstr , в адрес mbstr . Преобразование будет продолжаться
для каждого символа до тех пор, пока не встретится расширенный завершающий
символ null, или не обнаружится несоответствующий символ, или когда следующий
символ может превысить ограничение, указанное в count . Если функция wcsrtombs
встречает расширенный нуль-символ (L"\0") перед или после count символов, она
преобразовывает его в 8-битный 0 и останавливается.

Таким образом, строка многобайтовых символов mbstr завершается символом


NULL только в том случае, если функция wcsrtombs встречает расширенный нуль-
символ во время преобразования. Если последовательности, на которые
указывают параметры wcstr и mbstr , перекрываются, то поведение wcsrtombs не
определено. На функцию wcsrtombs влияет категория LC_TYPE текущего языкового
стандарта.

Функция wcsrtombs отличается от wcstombsфункции возможностью _wcstombs_l


перезапуска. Состояние преобразования хранится в переменной mbstate для
последующих вызовов тех же или других перезапускаемых функций. При
смешанном использовании перезапускаемых и неперезапускаемых функций
результаты становятся неопределенными. Например, в приложении следует
использовать функцию wcsrlen вместо функции wcsnlen , если в последующем
вызове используется функция wcsrtombs , а не функция wcstombs .

Если аргумент mbstr равен NULL , функция wcsrtombs возвращает необходимый


размер строки назначения в байтах. Если mbstate имеет значение null,
используется внутреннее состояние преобразования mbstate_t . Если
последовательность wchar символов не имеет соответствующего многобайтового
представления символов, возвращается значение -1, а errno для задается значение
EILSEQ .

В C++ эта функция имеет шаблонную перегрузку, которая вызывает более новые и
безопасные аналоги этой функции. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Исключения
Функция wcsrtombs является многопоточной при условии, что во время
выполнения этой функции не вызывается ни функция в текущем потоке
setlocale mbstate , ни функция не имеет значения NULL.

Пример
C++

// crt_wcsrtombs.cpp

// compile with: /W3

// This code example converts a wide

// character string into a multibyte

// character string.

#include <stdio.h>

#include <memory.h>

#include <wchar.h>

#include <errno.h>

#define MB_BUFFER_SIZE 100

int main()

const wchar_t wcString[] =

{L"Every good boy does fine."};

const wchar_t *wcsIndirectString = wcString;

char mbString[MB_BUFFER_SIZE];

size_t countConverted;

mbstate_t mbstate;

// Reset to initial shift state

::memset((void*)&mbstate, 0, sizeof(mbstate));

countConverted = wcsrtombs(mbString, &wcsIndirectString,

MB_BUFFER_SIZE, &mbstate); // C4996

// Note: wcsrtombs is deprecated; consider using wcsrtombs_s

if (errno == EILSEQ)

printf( "An encoding error was detected in the string.\n" );

else

printf( "The string was successfuly converted.\n" );

Output

The string was successfuly converted.

Требования
Подпрограмма Обязательный заголовок

wcsrtombs <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

wcrtomb

wcrtomb_s

wctomb, _wctomb_l

wcstombs, _wcstombs_l

mbsinit
wcsrtombs_s
Статья • 03.04.2023

Преобразует строку расширенных символов в соответствующее представление


многобайтовой строки. Версия wcsrtombs с усовершенствованиями безопасности,
как описано в разделе Функции безопасности в CRT.

Синтаксис
C

errno_t wcsrtombs_s(

size_t *pReturnValue,

char *mbstr,

size_t sizeInBytes,

const wchar_t **wcstr,

sizeof count,

mbstate_t *mbstate

);

template <size_t size>

errno_t wcsrtombs_s(

size_t *pReturnValue,

char (&mbstr)[size],

const wchar_t **wcstr,

sizeof count,

mbstate_t *mbstate

); // C++ only

Параметры
pReturnValue

Размер преобразованной строки в байтах, включая признак конца null.

mbstr

Адрес буфера для итоговой преобразованной строки многобайтовых символов.

sizeInBytes

Размер (в байтах) буфера mbstr .

wcstr

Указывает на строку расширенных символов, которую необходимо преобразовать.

count

Максимальное число байтов для хранения в буфере mbstr или _TRUNCATE.


mbstate

Указатель на объект состояния преобразования mbstate_t .

Возвращаемое значение
Нуль в случае успеха или код ошибки в случае неудачи.

Условие ошибки Возвращаемое


значение и
errno

mbstr значение NULL и sizeInBytes > 0 EINVAL

wcstr имеет значение NULL . EINVAL

Буфер назначения слишком мал, чтобы вместить преобразованную ERANGE


строку (если параметр count не имеет значение _TRUNCATE ; см.
примечания ниже).

При возникновении любого из этих условий вызывается исключение


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

Комментарии
Функция wcsrtombs_s преобразует строку расширенных символов, на которую
указывает wcstr , в многобайтовые символы, сохраненные в буфере, на который
указывает mbstr . При этом используется состояние преобразования, содержащееся
в mbstate . Преобразование будет продолжаться для каждого символа до тех пор,
пока не будет выполнено одно из указанных ниже условий.

Встретился расширенный нуль-символ.

Обнаружен расширенный символ, который не может быть преобразован

Число байтов, сохраненных в буфере mbstr , равно count .

Конечная строка всегда заканчивается null (даже при возникновении ошибки).

Если count является специальным значением _TRUNCATE, то wcsrtombs_s


преобразует столько строки, сколько поместится в буфер назначения, при этом
остается место для признака конца null.
Если wcsrtombs_s исходная строка успешно преобразуется, размер
преобразованной строки в байтах, включая признак конца null, помещает в
*pReturnValue (при условии pReturnValue , что значение не NULL равно ). Размер

вычисляется, даже если mbstr аргумент имеет значение NULL ; он позволяет


определить требуемый размер буфера. Если mbstr имеет значение NULL , count
игнорируется.

Если wcsrtombs_s обнаруживает расширенный символ, который он не может


преобразовать в многобайтовый символ, он помещает значение -1 в
* pReturnValue , задает для буфера назначения пустую строку, задает значение
errno EILSEQ и возвращает EILSEQ .

Если последовательности, на которые указывают параметры wcstr и mbstr ,


перекрываются, то поведение wcsrtombs_s не определено. На функцию wcsrtombs_s
влияет категория LC_TYPE текущего языкового стандарта.

) Важно!

Убедитесь, что строки wcstr и mbstr не перекрываются, и что параметр count


правильно отражает количество преобразуемых расширенных символов.

Функция wcsrtombs_s отличается от wcstombs_sфункции возможностью


_wcstombs_s_l перезапуска. Состояние преобразования хранится в переменной
mbstate для последующих вызовов тех же или других перезапускаемых функций.
При смешанном использовании перезапускаемых и неперезапускаемых функций
результаты становятся неопределенными. Например, в приложении следует
использовать функцию wcsrlen вместо функции wcslen , если в последующем
вызове используется функция wcsrtombs_s , а не функция wcstombs_s .

В C++ использование данных функций упрощено наличием шаблонных


перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Исключения
Функция wcsrtombs_s является потокобезопасной, если ни одна из функций в
текущем потоке не вызывает setlocale , пока выполняется данная функция, и
mbstate имеет значение null.

Пример
C++

// crt_wcsrtombs_s.cpp

//

// This code example converts a wide

// character string into a multibyte

// character string.

//

#include <stdio.h>

#include <memory.h>

#include <wchar.h>

#include <errno.h>

#define MB_BUFFER_SIZE 100

int main()

const wchar_t wcString[] =

{L"Every good boy does fine."};

const wchar_t *wcsIndirectString = wcString;

char mbString[MB_BUFFER_SIZE];

size_t countConverted;

errno_t err;

mbstate_t mbstate;

// Reset to initial shift state

::memset((void*)&mbstate, 0, sizeof(mbstate));

err = wcsrtombs_s(&countConverted, mbString, MB_BUFFER_SIZE,

&wcsIndirectString, MB_BUFFER_SIZE, &mbstate);

if (err == EILSEQ)

printf( "An encoding error was detected in the string.\n" );

else

printf( "The string was successfully converted.\n" );

Output

The string was successfully converted.

Требования
Подпрограмма Обязательный заголовок

wcsrtombs_s <wchar.h>

См. также:
Преобразование данных

Локаль

Интерпретация последовательностей многобайтовых символов

wcrtomb

wcrtomb_s

wctomb, _wctomb_l

wcstombs, _wcstombs_l

mbsinit
wcstombs , _wcstombs_l
Статья • 29.03.2023

Преобразует последовательность расширенных символов в соответствующую


последовательность многобайтовых символов. Доступны более безопасные версии
этих функций; См. разделwcstombs_s , _wcstombs_s_l.

Синтаксис
C

size_t wcstombs(

char *mbstr,

const wchar_t *wcstr,

size_t count

);

size_t _wcstombs_l(

char *mbstr,

const wchar_t *wcstr,

size_t count,

_locale_t locale

);

template <size_t size>

size_t wcstombs(

char (&mbstr)[size],

const wchar_t *wcstr,

size_t count

); // C++ only

template <size_t size>

size_t _wcstombs_l(

char (&mbstr)[size],

const wchar_t *wcstr,

size_t count,

_locale_t locale

); // C++ only

Параметры
mbstr

Адрес последовательности многобайтовых символов.

wcstr

Адрес последовательности расширенных символов.


count

Максимальное количество байтов, которые могут храниться в выходной строке


многобайтовых символов.

locale

Используемый языковой стандарт.

Возвращаемое значение
Если функция wcstombs успешно преобразовывает строку многобайтовых
символов, она возвращает число байтов, записанных в выходную строку
многобайтовых символов, исключая конечный символ NULL (при его наличии).
Если аргумент mbstr равен NULL , функция wcstombs возвращает необходимый
размер строки назначения в байтах. Если wcstombs обнаруживает расширенный
символ, который он не может преобразовать в многобайтовый символ, он
возвращает приведение -1 к типу size_t и задает значение EILSEQ errno .

Комментарии
Функция wcstombs преобразовывает строку расширенных символов, на которую
указывает параметр wcstr , в соответствующие многобайтовые символы и
сохраняет результаты в массиве mbstr . Параметр count указывает максимальное
число байтов, которые могут храниться в выходной строке многобайтовых
символов (т. е., размер mbstr ). Как правило, неизвестно, сколько байт потребуется
при преобразовании строки расширенных символов. Для некоторых расширенных
символов в выходной строке требуется только один байт; для других требуется 2
байта. Если в многобайтовой выходной строке имеется 2 байта для каждого
широкого символа во входной строке (включая расширенный символ NULL ),
результат гарантированно соответствует.

Начиная с Windows 10 версии 1803 (10.0.17134.0), универсальная среда выполнения


C поддерживает использование кодовой страницы UTF-8. Используйте ,
wcstombs(NULL, wcstr, 0) чтобы получить правильный размер, необходимый для

преобразования, так как предположить, что вам потребуется два байта для
каждого широкого символа, может быть недостаточно. Дополнительные сведения
о поддержке UTF-8 см. в разделе Поддержка UTF-8.

Если wcstombs обнаруживает расширенный символ NULL (L'\0') до или при count
возникновении, он преобразует его в 8-разрядный 0 и останавливается. Таким
образом, многобайтовая строка символов в mbstr параметре завершается null,
только если wcstombs во время преобразования встречает символ с расширенным
символом NULL . Если последовательности, на которые указывают параметры wcstr
и mbstr , перекрываются, то поведение wcstombs не определено.

Если аргумент mbstr равен NULL , функция wcstombs возвращает необходимый


размер строки назначения в байтах.

wcstombs проверяет свои параметры. Если wcstr имеет значение NULL или больше

count , эта INT_MAX функция вызывает обработчик недопустимых параметров, как


описано в разделе Проверка параметров. Если выполнение может быть
продолжено, функция устанавливает параметр errno в значение EINVAL и
возвращает –1.

Функция wcstombs использует текущий языковой стандарт для любых аспектов


поведения, зависящих от языкового стандарта; функция _wcstombs_l идентична за
исключением того, что она использует переданный языковой стандарт. Для
получения дополнительной информации см. Locale.

В C++ эти функции имеют шаблонные перегрузки, которые вызывают более новые
и безопасные аналоги этих функций. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

wcstombs <stdlib.h>

_wcstombs_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа иллюстрирует поведение функции wcstombs .

// crt_wcstombs.c

// compile with: /W3

// This example demonstrates the use

// of wcstombs, which converts a string

// of wide characters to a string of

// multibyte characters.

#include <stdlib.h>

#include <stdio.h>

#define BUFFER_SIZE 100

int main( void )

size_t count;

char *pMBBuffer = (char *)malloc( BUFFER_SIZE );

wchar_t *pWCBuffer = L"Hello, world.";

printf("Convert wide-character string:\n" );

count = wcstombs(pMBBuffer, pWCBuffer, BUFFER_SIZE ); // C4996

// Note: wcstombs is deprecated; consider using wcstombs_s instead

printf(" Characters converted: %u\n",

count );

printf(" Multibyte character: %s\n\n",

pMBBuffer );

free(pMBBuffer);

Output

Convert wide-character string:

Characters converted: 13

Multibyte character: Hello, world.

См. также:
Преобразование данных

Локаль

_mbclen, mblen, _mblen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

wctomb, _wctomb_l

WideCharToMultiByte
wcstombs_s , _wcstombs_s_l
Статья • 03.04.2023

Преобразует последовательность расширенных символов в соответствующую


последовательность многобайтовых символов. Версия wcstombsс
усовершенствованиями безопасности, _wcstombs_l описанными в разделе Функции
безопасности в CRT.

Синтаксис
C

errno_t wcstombs_s(

size_t *pReturnValue,

char *mbstr,

size_t sizeInBytes,

const wchar_t *wcstr,

size_t count

);

errno_t _wcstombs_s_l(

size_t *pReturnValue,

char *mbstr,

size_t sizeInBytes,

const wchar_t *wcstr,

size_t count,

_locale_t locale

);

template <size_t size>

errno_t wcstombs_s(

size_t *pReturnValue,

char (&mbstr)[size],

const wchar_t *wcstr,

size_t count

); // C++ only

template <size_t size>

errno_t _wcstombs_s_l(

size_t *pReturnValue,

char (&mbstr)[size],

const wchar_t *wcstr,

size_t count,

_locale_t locale

); // C++ only

Параметры
pReturnValue

Размер преобразованной строки в байтах, включая признак конца null.

mbstr

Адрес буфера для итоговой преобразованной строки многобайтовых символов.

sizeInBytes

Размер (в байтах) буфера mbstr .

wcstr

Указывает на строку расширенных символов, которую необходимо преобразовать.

count

Максимальное число байтов для хранения в буфере mbstr , не включая


завершающий символ NULL или _TRUNCATE.

locale

Используемый языковой стандарт.

Возвращаемое значение
Нуль в случае успеха или код ошибки в случае неудачи.

Условие ошибки Возвращаемое


значение и
errno

mbstr значение NULL и sizeInBytes > 0 EINVAL

wcstr имеет значение NULL . EINVAL

Буфер назначения слишком мал, чтобы вместить преобразованную ERANGE


строку (если параметр count не имеет значение _TRUNCATE ; см.
примечания ниже).

Если возникает какое-либо из этих условий, вызывается исключение


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

Комментарии
Функция wcstombs_s преобразует строку расширенных символов, на которую
указывает wcstr , в многобайтовые символы, сохраненные в буфере, на который
указывает mbstr . Преобразование будет продолжаться для каждого символа до тех
пор, пока не будет выполнено одно из указанных ниже условий.

Встретился расширенный нуль-символ.

Обнаружен расширенный символ, который не может быть преобразован

Число байтов, сохраненных в буфере mbstr , равно count .

Конечная строка всегда заканчивается null (даже если есть ошибка).

Если count является специальным значением _TRUNCATE, то wcstombs_s


преобразует столько строки, сколько поместится в буфер назначения, сохраняя при
этом место для конца null. Если строка усечена, возвращается STRUNCATE значение ,
а преобразование считается успешным.

Если wcstombs_s исходная строка успешно преобразуется, она помещает размер


преобразованной строки в байтах, включая признак конца null, в *pReturnValue
(при условии pReturnValue , что значение не NULL равно ). Размер вычисляется,
даже если mbstr аргумент имеет значение NULL ; он позволяет определить
требуемый размер буфера. Если mbstr имеет значение NULL , count игнорируется.

Если wcstombs_s встречается расширенный символ, который он не может


преобразовать в многобайтовый символ, он помещает 0 в *ReturnValue ,
устанавливает буфер назначения в пустую строку, задает значение errno EILSEQ и
возвращает EILSEQ .

Если последовательности, на которые указывают параметры wcstr и mbstr ,


перекрываются, то поведение wcstombs_s не определено.

) Важно!

Убедитесь, что строки wcstr и mbstr не перекрываются, и что параметр count


правильно отражает количество преобразуемых расширенных символов.

Функция wcstombs_s использует текущий языковой стандарт для любых аспектов


поведения, зависящих от языкового стандарта; функция _wcstombs_s_l идентична
wcstombs за исключением того, что она использует переданный языковой стандарт.
Для получения дополнительной информации см. Locale.
В C++ использование данных функций упрощено наличием шаблонных
перегрузок; перегруженные методы могут автоматически определять длину буфера
(что исключает необходимость указания аргумента с размером буфера), а также
они могут автоматически заменять более старые, незащищенные функции их
новыми безопасными аналогами. Дополнительные сведения см. в разделе
Безопасные перегрузки шаблонов.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

wcstombs_s <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа иллюстрирует поведение функции wcstombs_s .

// crt_wcstombs_s.c

// This example converts a wide character

// string to a multibyte character string.

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#define BUFFER_SIZE 100

int main( void )

size_t i;

char *pMBBuffer = (char *)malloc( BUFFER_SIZE );

const wchar_t*pWCBuffer = L"Hello, world.";

printf( "Convert wide-character string:\n" );

// Conversion

wcstombs_s(&i, pMBBuffer, (size_t)BUFFER_SIZE,

pWCBuffer, (size_t)BUFFER_SIZE - 1); // -1 so the appended


NULL doesn't fall outside the allocated buffer

// Output

printf(" Characters converted: %u\n", i);

printf(" Multibyte character: %s\n\n", pMBBuffer );

// Free multibyte character buffer

if (pMBBuffer)

free(pMBBuffer);

return 0;

Output

Convert wide-character string:

Characters converted: 14

Multibyte character: Hello, world.

См. также:
Преобразование данных

Локаль

_mbclen, mblen, _mblen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

wctomb_s, _wctomb_s_l

WideCharToMultiByte
wctob
Статья • 03.04.2023

Определяет, соответствует ли расширенный символ многобайтовому символу, и


возвращает его представление в многобайтовой кодировке.

Синтаксис
C

int wctob(

wint_t wchar

);

Параметры
wchar

Значение, которое необходимо преобразовать.

Возвращаемое значение
Если wctob расширенный символ успешно преобразуется, он возвращает его
многобайтовое представление только в том случае, если многобайтовый символ
является однобайтовой длиной. Если wctob встречается расширенный символ, он
не может преобразоваться в многобайтовый символ или если многобайтовый
символ не является одним байтом длиной, он возвращает значение -1.

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

Если функция wctob завершилась неудачно и соответствующий многобайтовый


символ не найден, функция устанавливает для параметра errno значение EILSEQ и
возвращает значение –1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

wctob <wchar.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа иллюстрирует поведение функции wctob .

// crt_wctob.c

#include <stdio.h>

#include <wchar.h>

int main( void )

int bChar = 0;

wint_t wChar = 0;

// Set the corresponding wide character to exactly one byte.

wChar = (wint_t)'A';

bChar = wctob( wChar );

if (bChar == WEOF)

printf( "No corresponding multibyte character was found.\n");

else

printf( "Determined the corresponding multibyte character to"

" be \"%c\".\n", bChar);

Output

Determined the corresponding multibyte character to be "A".

См. также:
Преобразование данных

Локаль

_mbclen, mblen, _mblen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

wctomb, _wctomb_l

WideCharToMultiByte
wctomb , _wctomb_l
Статья • 03.04.2023

Преобразует расширенный символ в соответствующий многобайтовый символ.


Доступны более безопасные версии этих функций; см. ,wctomb_s_wctomb_s_l .

Синтаксис
C

int wctomb(

char *mbchar,

wchar_t wchar

);

int _wctomb_l(

char *mbchar,

wchar_t wchar,

_locale_t locale

);

Параметры
mbchar

Адрес последовательности многобайтовых символов.

wchar

Расширенный символ.

Возвращаемое значение
Если функция wctomb преобразует расширенный символ в многобайтовый символ,
она возвращает число байтов (которое никогда не превышает MB_CUR_MAX ) в
расширенном символе. Если wchar является расширенным нуль-символом (L '\0'),
wctomb возвращает 1. Если целевой указатель mbchar равен NULL , wctomb

возвращает значение 0. Если преобразование невозможно в текущем языковом


стандарте, wctomb возвращает значение -1 и errno имеет значение EILSEQ .

Комментарии
Функция wctomb преобразует свой аргумент wchar в соответствующий
многобайтовый символ и сохраняет результат в mbchar . Эту функцию можно
вызывать из любой точки в любой программе. Функция wctomb использует текущий
языковой стандарт для любых аспектов поведения, зависящих от языкового
стандарта; функция _wctomb_l идентична wctomb за исключением того, что она
использует переданный языковой стандарт. Для получения дополнительной
информации см. Locale.

wctomb проверяет свои параметры. В противном mbchar случае NULL вызывается

обработчик недопустимых параметров, как описано в разделе "Проверка


параметров". Если выполнение может быть продолжено, параметр errno
устанавливается в значение EINVAL и функция возвращает –1.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Сведения об изменении этого поведения см. в разделе "Глобальное состояние" в
CRT.

Требования
Подпрограмма Обязательный заголовок

wctomb <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа иллюстрирует поведение функции wctomb.

C++

// crt_wctomb.cpp

// compile with: /W3

#include <stdio.h>

#include <stdlib.h>

int main( void )

int i;

wchar_t wc = L'a';

char *pmb = (char *)malloc( MB_CUR_MAX );

printf( "Convert a wide character:\n" );

i = wctomb( pmb, wc ); // C4996

// Note: wctomb is deprecated; consider using wctomb_s

printf( " Characters converted: %u\n", i );

printf( " Multibyte character: %.1s\n\n", pmb );

Output

Convert a wide character:

Characters converted: 1

Multibyte character: a

См. также:
Преобразование данных

Локаль

_mbclen, mblen, _mblen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

wcstombs, _wcstombs_l

WideCharToMultiByte
wctomb_s , _wctomb_s_l
Статья • 18.03.2023

Преобразует расширенный символ в соответствующий многобайтовый символ.


Версия wctombс усовершенствованиями безопасности, _wctomb_l описанными в
разделе Функции безопасности в CRT.

Синтаксис
C

errno_t wctomb_s(

int *pRetValue,

char *mbchar,

size_t sizeInBytes,

wchar_t wchar

);

errno_t _wctomb_s_l(

int *pRetValue,

char *mbchar,

size_t sizeInBytes,

wchar_t wchar,

_locale_t locale

);

Параметры
pRetValue

Число байтов или код, указывающий результат.

mbchar

Адрес последовательности многобайтовых символов.

sizeInBytes

Размер буфера mbchar .

wchar

Преобразуемый расширенный символ.

locale

Используемый языковой стандарт.


Возвращаемое значение
Нуль в случае успеха или код ошибки в случае неудачи.

Ситуации, которые могут привести к ошибке

mbchar sizeInBytes Возвращаемое значение pRetValue

NULL >0 EINVAL не изменено

any > INT_MAX EINVAL не изменено

any слишком мало EINVAL не изменено

При возникновении любого из указанных выше условий ошибки вызывается


обработчик недопустимых параметров, как описано в разделе Проверка
параметров. Если выполнение может быть продолжено, функция wctomb
возвращает значение EINVAL и устанавливает параметр errno в значение EINVAL .

Возвращаемое значение EILSEQ указывает, что значение, переданное через


параметр wchar , не является допустимым расширенным символом.

Комментарии
Функция wctomb_s преобразует свой аргумент wchar в соответствующий
многобайтовый символ и сохраняет результат в mbchar . Эту функцию можно
вызывать из любой точки в любой программе.

Если функция wctomb_s преобразует расширенный символ в многобайтовый


символ, она помещает число байтов (которое никогда не превышает MB_CUR_MAX ) в
расширенном символе в целое число со знаком, на которое указывает pRetValue .
Если wchar является расширенным нуль-символом (L '\0'), wctomb_s заполняет
pRetValue символом 1. Если целевой указатель mbchar имеет значение NULL ,
wctomb_s то помещает значение 0 в pRetValue . Если преобразование невозможно в

текущем языковом стандарте, wctomb_s помещает -1 в pRetValue .

Функция wctomb_s использует текущий языковой стандарт для информации,


обусловленной языковыми стандартами; функция _wctomb_s_l идентична за
исключением того, что она использует переданный языковой стандарт. Для
получения дополнительной информации см. Locale.
По умолчанию глобальное состояние этой функции ограничивается приложением.
Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

wctomb_s <stdlib.h>

_wctomb_s_l <stdlib.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
Эта программа иллюстрирует поведение функции wctomb_s .

C++

// crt_wctomb_s.cpp

#include <stdio.h>

#include <stdlib.h>

int main( void )

int i;

wchar_t wc = L'a';

char *pmb = (char *)malloc( MB_CUR_MAX );

printf_s( "Convert a wide character:\n" );

wctomb_s( &i, pmb, MB_CUR_MAX, wc );

printf_s( " Characters converted: %u\n", i );

printf_s( " Multibyte character: %.1s\n\n", pmb );

Output

Convert a wide character:

Characters converted: 1

Multibyte character: a

См. также:
Преобразование данных

Локаль

_mbclen, mblen, _mblen_l

mbstowcs, _mbstowcs_l

mbtowc, _mbtowc_l

wcstombs, _wcstombs_l

WideCharToMultiByte
wctrans
Статья • 03.04.2023

Определяет сопоставление одного набора кодов символов с другим.

Синтаксис
C

wctrans_t wctrans(

const char *property


);

Параметры
property

Строка, указывающая одно из допустимых преобразований.

Возвращаемое значение
LC_CTYPE Если категория текущего языкового стандарта не определяет
сопоставление, имя которого соответствует строке property свойства , функция
возвращает ноль. В противном случае он возвращает ненулевое значение,
подходящее для использования в качестве второго аргумента для последующего
вызова towctransметода .

Комментарии
Эта функция определяет сопоставление одного набора кодов символов с другим.

Следующие пары вызовов имеют одинаковое поведение во всех языковых


стандартах, но можно определить больше сопоставлений даже в языковом
стандарте "C":

Функция Эквивалентно

tolower(c) towctrans(c, wctrans("towlower"))

towupper(c) towctrans(c, wctrans("toupper"))


Требования
Подпрограмма Обязательный заголовок

wctrans <wctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt_wctrans.cpp

// compile with: /EHsc

// This example determines a mapping from one set of character

// codes to another.

#include <wchar.h>

#include <wctype.h>

#include <stdio.h>

#include <iostream>

int main()

wint_t c = 'a';

printf_s("%d\n",c);

wctrans_t i = wctrans("toupper");

printf_s("%d\n",i);

wctrans_t ii = wctrans("towlower");

printf_s("%d\n",ii);

wchar_t wc = towctrans(c, i);

printf_s("%d\n",wc);

Output

97

65

См. также раздел


Преобразование данных

setlocale, _wsetlocale
wctype
Статья • 03.04.2023

Определяет правило классификации кодов расширенных символов.

Синтаксис
C

wctype_t wctype(

const char * property

);

Параметры
property

Строка свойства.

Возвращаемое значение
LC_CTYPE Если категория текущего языкового стандарта не определяет правило
классификации, имя которого соответствует строке property свойства , функция
возвращает ноль. В противном случае он возвращает ненулевое значение,
подходящее для использования в качестве второго аргумента для последующего
вызова towctransметода .

Комментарии
Функция определяет правило классификации кодов расширенных символов.
Следующие пары вызовов имеют одинаковое поведение во всех языковых
стандартах (но реализация может определить больше правил классификации даже
в языковом стандарте "C").

Функция Эквивалентно

iswalnum(c) iswctype(c, wctype( "alnum" ))

iswalpha(c) iswctype(c, wctype( "alpha" ))

iswcntrl(c) iswctype(c, wctype( "cntrl" ))


Функция Эквивалентно

iswdigit(c) iswctype(c, wctype( "digit" ))

iswgraph(c) iswctype(c, wctype( "graph" ))

iswlower(c) iswctype(c, wctype( "lower" ))

iswprint(c) iswctype(c, wctype( "print" ))

iswpunct(c) iswctype(c, wctype( "punct" ))

iswspace(c) iswctype(c, wctype( "space" ))

iswupper(c) iswctype(c, wctype( "upper" ))

iswxdigit(c) iswctype(c, wctype( "xdigit" ))

Требования
Подпрограмма Обязательный заголовок

wctype <wctype.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

См. также:
Преобразование данных

setlocale, _wsetlocale
write
Статья • 03.04.2023

Имя write функции POSIX, реализованной корпорацией Майкрософт, является


устаревшим псевдонимом _write для функции. По умолчанию создается
предупреждение компилятора (уровень 3) C4996. Имя не рекомендуется, так как
оно не соответствует стандартным правилам C для имен, относящихся к
реализации. Однако функция по-прежнему поддерживается.

Вместо этого рекомендуется использовать _write . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
_write
Статья • 03.04.2023

Записывает данные в файл.

Синтаксис
C

int _write(

int fd,

const void *buffer,

unsigned int count

);

Параметры
fd

Дескриптор файла, в который записываются данные.

buffer

Записываемые данные.

count

Число байтов.

Возвращаемое значение
В случае успешного _write выполнения возвращает число записанных байтов. Если
фактическое пространство, оставшееся на диске, меньше размера буфера, функция
пытается записать данные на диск, _write происходит сбой и не сбрасывается
содержимое буфера на диск. Возвращаемое значение -1 указывает на ошибку. Если
передаются недопустимые параметры, эта функция вызывает обработчик
недопустимых параметров, как описано в разделе Проверка параметров. Если
выполнение разрешено, функция возвращает значение -1 и errno имеет одно из
трех значений: EBADF , что означает, что дескриптор файла недопустим или файл не
открыт для записи; ENOSPC , что означает, что на устройстве недостаточно места для
операции; или EINVAL , что означает, что buffer был пустой указатель или что в
режиме Юникода был передан нечетный размер count байтов.
Дополнительные сведения об этих и других кодах возврата см. в разделе errno,
_doserrno, _sys_errlistи _sys_nerr.

Если файл открыт в текстовом режиме, каждый символ перевода строки


заменяется парой возврата строки каретки в выходных данных. Замена не влияет
на возвращаемое значение.

При открытии файла в режиме перевода Юникода( например, если fd открыт с


помощью _open или _sopen и параметр режима, включающий _O_WTEXT ,
_O_U16TEXT или _O_U8TEXT , или , если он открыт с помощью fopen и параметр

режима, включающий ccs=UNICODE , ccs=UTF-16LE или ccs=UTF-8 , или если режим


изменен на режим преобразования Юникода с помощью ), _setmode buffer
интерпретируется как указатель на массив wchar_t , содержащий UTF-16 данные.
Попытка записи нечетного числа байт в этом режиме приводит к возникновению
ошибки проверки параметра.

Комментарии
Функция _write записывает count байт из buffer в файл, связанный с fd .
Операция записи начинается с текущего положения указателя файла (при
наличии), связанного с данным файлом. Если файл открыт для добавления,
операция начинается с текущего конца файла. После операции записи указатель
файла увеличивается на число записанных байтов.

При записи в файлы, открытые в текстовом режиме, _write обрабатывает символ


CTRL+Z как логический конец файла. При записи на устройство _write символ
CTRL+Z в буфере обрабатывается как признак конца вывода.

По умолчанию глобальное состояние этой функции ограничивается приложением.


Чтобы изменить это поведение, см. статью Глобальное состояние в CRT.

Требования
Подпрограмма Обязательный заголовок

_write <io.h>

Дополнительные сведения о совместимости см. в разделе Compatibility.

Пример
C

// crt__write.c

//

// This program opens a file for output and uses _write to write

// some bytes to the file.

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <errno.h>

#include <share.h>

char buffer[] = "This is a test of '_write' function";

int main( void )

int fileHandle = 0;

unsigned bytesWritten = 0;

if ( _sopen_s(&fileHandle, "write.o", _O_RDWR | _O_CREAT,

_SH_DENYNO, _S_IREAD | _S_IWRITE) )

return -1;

if (( bytesWritten = _write( fileHandle, buffer, sizeof( buffer ))) == -1


)

switch(errno)

case EBADF:

perror("Bad file descriptor!");

break;

case ENOSPC:

perror("No space left on device!");

break;

case EINVAL:

perror("Invalid parameter: buffer was NULL!");

break;

default:

// An unrelated error occurred

perror("Unexpected error!");

else

printf_s( "Wrote %u bytes to file.\n", bytesWritten );

_close( fileHandle );

Output

Wrote 36 bytes to file.

См. также раздел


Низкоуровневый ввод-вывод

fwrite

_open, _wopen

_read

_setmode
wcsicoll
Статья • 03.04.2023

Имя wcsicoll функции, зависят от Майкрософт, является устаревшим псевдонимом


_wcsicoll для функции. По умолчанию создается предупреждение компилятора
(уровень 3) C4996. Имя не рекомендуется, так как оно не соответствует
стандартным правилам C для имен, относящихся к реализации. Однако функция
по-прежнему поддерживается.

Вместо этого рекомендуется использовать _wcsicoll . Кроме того, вы можете


продолжать использовать это имя функции и отключить предупреждение.
Дополнительные сведения см. в разделе "Отключение имен функций
предупреждения и POSIX".
xor
Статья • 03.04.2023

Альтернатива оператору ^ .

Синтаксис
C

#define xor ^

Remarks
Макрос возвращает оператор ^ .

Пример
C++

// iso646_xor.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 3, b = 2, result;

result= a ^ b;

cout << result << endl;

result= a xor b;

cout << result << endl;

Output

Требования
Заголовка:< iso646.h>
xor_eq
Статья • 03.04.2023

Альтернатива оператору ^= .

Синтаксис
C

#define xor_eq ^=

Remarks
Макрос возвращает оператор ^= .

Пример
C++

// iso646_xor_eq.cpp

// compile with: /EHsc

#include <iostream>

#include <iso646.h>

int main( )

using namespace std;

int a = 3, b = 2, result;

result= a ^= b;

cout << result << endl;

a = 3;

b = 2;

result= a xor_eq b;

cout << result << endl;

Output

Требования
Заголовка:< iso646.h>
y0 , y1 , yn
Статья • 03.04.2023

Имена y0 y1 функций POSIX, реализованные корпорацией Майкрософт, и yn


являются устаревшими псевдонимами для _y0_y1функций и _yn функций. По
умолчанию они создают предупреждение компилятора (уровень 3) C4996. Имена
являются устаревшими, так как они не соответствуют стандартным правилам C для
имен, относящихся к реализации. Однако функции по-прежнему поддерживаются.

Вместо этого рекомендуется использовать _y0и _y1_yn вместо этого. Вы также


можете продолжать использовать эти имена функций и отключить
предупреждение. Дополнительные сведения см. в разделе "Отключение имен
функций предупреждения и POSIX".

Вам также может понравиться