Namespaces
Variants

strerror, strerror_s, strerrorlen_s

From cppreference.net
< c ‎ | string ‎ | byte
Definido en el encabezado <string.h>
char * strerror ( int errnum ) ;
(1)
errno_t strerror_s ( char * buf, rsize_t bufsz, errno_t errnum ) ;
(2) (desde C11)
size_t strerrorlen_s ( errno_t errnum ) ;
(3) (desde C11)
1) Devuelve un puntero a la descripción textual del código de error del sistema errnum , idéntico a la descripción que sería impresa por perror() .
errnum generalmente se adquiere de la variable errno , sin embargo la función acepta cualquier valor de tipo int . El contenido de la cadena es específico de la configuración regional.
La cadena devuelta no debe ser modificada por el programa, pero puede ser sobrescrita por una llamada posterior a la función strerror . strerror no requiere ser segura para hilos. Las implementaciones pueden devolver diferentes punteros a literales de cadena estáticos de solo lectura o pueden devolver el mismo puntero repetidamente, apuntando a un búfer estático en el que strerror coloca la cadena.
2) Igual que (1) , excepto que el mensaje se copia en el almacenamiento proporcionado por el usuario buf . No se escriben más de bufsz-1 bytes, el buffer siempre termina en nulo. Si el mensaje tuvo que truncarse para ajustarse al buffer y bufsz es mayor que 3, entonces solo se escriben bufsz-4 bytes, y los caracteres "..." se añaden antes del terminador nulo. Además, los siguientes errores se detectan en tiempo de ejecución y llaman a la función constraint handler actualmente instalada:
  • buf es un puntero nulo
  • bufsz es cero o mayor que RSIZE_MAX
El comportamiento es indefinido si la escritura en buf ocurre más allá del final del array, lo cual puede suceder cuando el tamaño del buffer apuntado por buf es menor que el número de caracteres en el mensaje de error que a su vez es menor que bufsz .
3) Calcula la longitud del mensaje de error específico de la configuración regional sin truncar que strerror_s escribiría si se llamara con errnum . La longitud no incluye el terminador nulo.
Como con todas las funciones con verificación de límites, strerror_s y strerrorlen_s solo están garantizadas de estar disponibles si __STDC_LIB_EXT1__ está definido por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <string.h> .

Contenidos

Parámetros

errnum - valor integral que hace referencia a un código de error
buf - puntero a un búfer proporcionado por el usuario
bufsz - tamaño del búfer proporcionado por el usuario

Valor de retorno

1) Puntero a una cadena de bytes terminada en nulo correspondiente al errno código de error errnum .
2) Cero si el mensaje completo se almacenó exitosamente en buf , distinto de cero en caso contrario.
3) Longitud (sin incluir el terminador nulo) del mensaje que strerror_s devolvería

Notas

POSIX permite que llamadas posteriores a strerror invaliden el valor del puntero devuelto por una llamada anterior. También especifica que es el facet de localización LC_MESSAGES el que controla el contenido de estos mensajes.

strerror_s es la única función con verificación de límites que permite truncamiento, porque se consideró más deseable proporcionar la mayor cantidad de información posible sobre un fallo. POSIX también define strerror_r para propósitos similares.

Ejemplo

#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
    }
}

Salida posible:

File opening error: No such file or directory
Now in German: Datei oder Verzeichnis nicht gefunden
Now in Japanese: そのようなファイル、又はディレクトリはありません

Referencias

  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.24.6.2 La función strerror (p: 371)
  • K.3.7.4.2 La función strerror_s (p: 622)
  • K.3.7.4.3 La función strerrorlen_s (p: 623)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.21.6.2 La función strerror (p: 334)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.11.6.2 La función strerror

Véase también

muestra una cadena de caracteres correspondiente al error actual en stderr
(función)
macro que se expande a variable de número de error local al hilo compatible con POSIX
(macro variable)