strerror, strerror_s, strerrorlen_s
From cppreference.net
|
Определено в заголовочном файле
<string.h>
|
||
|
char
*
strerror
(
int
errnum
)
;
|
(1) | |
|
errno_t strerror_s
(
char
*
buf, rsize_t bufsz, errno_t errnum
)
;
|
(2) | (начиная с C11) |
|
size_t
strerrorlen_s
(
errno_t errnum
)
;
|
(3) | (начиная с C11) |
1)
Возвращает указатель на текстовое описание системного кода ошибки
errnum
, идентичное описанию, которое было бы выведено функцией
perror()
.
errnum
обычно получается из переменной
errno
, однако функция принимает любое значение типа
int
. Содержимое строки зависит от локали.
Возвращаемая строка не должна изменяться программой, но может быть перезаписана последующим вызовом функции
strerror
.
strerror
не обязана быть потокобезопасной. Реализации могут возвращать разные указатели на статические строковые литералы только для чтения или могут возвращать один и тот же указатель снова и снова, указывая на статический буфер, в который strerror помещает строку.
2)
То же, что и
(1)
, за исключением того, что сообщение копируется в предоставленное пользователем хранилище
buf
. Записывается не более
bufsz-1
байт, буфер всегда завершается нулевым символом. Если сообщение пришлось усечь для соответствия буферу и
bufsz
больше 3, то записывается только
bufsz-4
байт, и перед нулевым терминатором добавляются символы
"..."
. Кроме того, следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную
функцию обработки ограничений
:
-
-
bufявляется нулевым указателем -
bufszравен нулю или превышает RSIZE_MAX
-
Поведение не определено, если запись в
buf
происходит за пределами массива, что может случиться, когда размер буфера, на который указывает
buf
, меньше количества символов в сообщении об ошибке, которое в свою очередь меньше
bufsz
.
3)
Вычисляет длину неусечённого локализованного сообщения об ошибке, которое
strerror_s
записало бы, если бы была вызвана с
errnum
. Длина не включает нулевой терминатор.
-
Как и все функции с проверкой границ,
strerror_sиstrerrorlen_sгарантированно доступны только если __STDC_LIB_EXT1__ определён реализацией и если пользователь определяет __STDC_WANT_LIB_EXT1__ как целочисленную константу 1 перед включением <string.h> .
Содержание |
Параметры
| errnum | - | целочисленное значение, указывающее на код ошибки |
| buf | - | указатель на предоставленный пользователем буфер |
| bufsz | - | размер предоставленного пользователем буфера |
Возвращаемое значение
2)
Ноль, если всё сообщение было успешно сохранено в
buf
, ненулевое значение в противном случае.
3)
Длина (не включая нулевой завершитель) сообщения, которое вернула бы функция
strerror_s
Примечания
POSIX
разрешает последующим вызовам
strerror
аннулировать значение указателя, возвращённое предыдущим вызовом. Также спецификация указывает, что именно
LC_MESSAGES
категория локали управляет содержимым этих сообщений.
strerror_s
является единственной функцией с проверкой границ, которая допускает усечение, поскольку предоставление максимально возможного объема информации о сбое было признано более предпочтительным. POSIX также определяет
strerror_r
для аналогичных целей.
Пример
Запустить этот код
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <errno.h> #include <string.h> #include <locale.h> int main(void) { FILE *fp = fopen(tmpnam((char[L_tmpnam]){0}), "r"); if(fp==NULL) { printf("File opening error: %s\n", strerror(errno)); setlocale(LC_MESSAGES, "de_DE.utf8"); printf("Now in German: %s\n", strerror(errno)); #ifdef __STDC_LIB_EXT1__ setlocale(LC_ALL, "ja_JP.utf8"); // printf needs CTYPE for multibyte output size_t errmsglen = strerrorlen_s(errno) + 1; char errmsg[errmsglen]; strerror_s(errmsg, errmsglen, errno); printf("Now in Japanese: %s\n", errmsg); #endif } }
Возможный вывод:
File opening error: No such file or directory Now in German: Datei oder Verzeichnis nicht gefunden Now in Japanese: そのようなファイル、又はディレクトリはありません
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.24.6.2 Функция strerror (стр. 371)
-
- K.3.7.4.2 Функция strerror_s (стр. 622)
-
- K.3.7.4.3 Функция strerrorlen_s (стр. 623)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.21.6.2 Функция strerror (стр. 334)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.11.6.2 Функция strerror
Смотрите также
|
выводит строку символов, соответствующую текущей ошибке, в
stderr
(функция) |
|
|
макрос, раскрывающийся в POSIX-совместимую thread-local переменную номера ошибки
(макропеременная) |
|
|
Документация C++
для
strerror
|
|