strerror, strerror_s, strerrorlen_s
Header: <string.h>
- Returns a pointer to the textual description of the system error code errnum, identical to the description that would be printed by perror().
# Declarations
char* strerror( int errnum );
errno_t strerror_s( char *buf, rsize_t bufsz, errno_t errnum );
(since C11)
size_t strerrorlen_s( errno_t errnum );
(since C11)
# Parameters
errnum: integral value referring to an error codebuf: pointer to a user-provided bufferbufsz: size of the user-provided buffer
# Notes
POSIX allows subsequent calls to strerror to invalidate the pointer value returned by an earlier call. It also specifies that it is the LC_MESSAGES locale facet that controls the contents of these messages.
strerror_s is the only bounds-checked function that allows truncation, because providing as much information as possible about a failure was deemed to be more desirable. POSIX also defines strerror_r for similar purposes.
# Example
#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
}
}