Namespaces
Variants

strerror, strerror_s, strerrorlen_s

From cppreference.net
< c ‎ | string ‎ | byte
Определено в заголовочном файле <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 - размер предоставленного пользователем буфера

Возвращаемое значение

1) Указатель на байтовую строку с нулевым завершением, соответствующую коду ошибки errno errnum .
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 переменную номера ошибки
(макропеременная)