strerror, strerror_s, strerrorlen_s
From cppreference.net
|
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:
-
-
bufes un puntero nulo -
bufszes 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_systrerrorlen_ssolo 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
Ejecutar este código
#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) |
|
|
Documentación de C++
para
strerror
|
|