strerror, strerror_s, strerrorlen_s
From cppreference.net
|
Défini dans l'en-tête
<string.h>
|
||
|
char
*
strerror
(
int
errnum
)
;
|
(1) | |
|
errno_t strerror_s
(
char
*
buf, rsize_t bufsz, errno_t errnum
)
;
|
(2) | (depuis C11) |
|
size_t
strerrorlen_s
(
errno_t errnum
)
;
|
(3) | (depuis C11) |
1)
Retourne un pointeur vers la description textuelle du code d'erreur système
errnum
, identique à la description qui serait affichée par
perror()
.
errnum
est généralement obtenu à partir de la variable
errno
, cependant la fonction accepte n'importe quelle valeur de type
int
. Le contenu de la chaîne est spécifique aux paramètres régionaux.
La chaîne retournée ne doit pas être modifiée par le programme, mais peut être écrasée par un appel ultérieur à la fonction
strerror
.
strerror
n'est pas tenue d'être thread-safe. Les implémentations peuvent retourner différents pointeurs vers des littéraux de chaîne en lecture seule statiques ou peuvent retourner le même pointeur à plusieurs reprises, pointant vers un tampon statique dans lequel strerror place la chaîne.
2)
Identique à
(1)
, sauf que le message est copié dans le stockage fourni par l'utilisateur
buf
. Pas plus de
bufsz-1
octets sont écrits, le tampon est toujours terminé par un caractère nul. Si le message a dû être tronqué pour s'adapter au tampon et que
bufsz
est supérieur à 3, alors seulement
bufsz-4
octets sont écrits, et les caractères
"..."
sont ajoutés avant le terminateur nul. De plus, les erreurs suivantes sont détectées à l'exécution et appellent la fonction
gestionnaire de contraintes
actuellement installée :
-
-
bufest un pointeur nul -
bufszest zéro ou supérieur à RSIZE_MAX
-
Le comportement est indéfini si l'écriture dans
buf
dépasse la fin du tableau, ce qui peut se produire lorsque la taille du tampon pointé par
buf
est inférieure au nombre de caractères dans le message d'erreur qui est lui-même inférieur à
bufsz
.
3)
Calcule la longueur du message d'erreur spécifique à la locale non tronqué que
strerror_s
écrirait s'il était appelé avec
errnum
. La longueur n'inclut pas le terminateur nul.
-
Comme pour toutes les fonctions à vérification des limites,
strerror_setstrerrorlen_sne sont garantis d'être disponibles que si __STDC_LIB_EXT1__ est défini par l'implémentation et si l'utilisateur définit __STDC_WANT_LIB_EXT1__ à la constante entière 1 avant d'inclure <string.h> .
Table des matières |
Paramètres
| errnum | - | valeur entière faisant référence à un code d'erreur |
| buf | - | pointeur vers un tampon fourni par l'utilisateur |
| bufsz | - | taille du tampon fourni par l'utilisateur |
Valeur de retour
1)
Pointeur vers une chaîne d'octets terminée par un caractère nul correspondant au
errno
code d'erreur
errnum
.
2)
Zéro si l'intégralité du message a été stockée avec succès dans
buf
, non-zéro sinon.
3)
Longueur (sans inclure le terminateur nul) du message que
strerror_s
retournerait
Notes
POSIX
permet que les appels ultérieurs à
strerror
invalident la valeur du pointeur retourné par un appel précédent. Il spécifie également que c'est le
LC_MESSAGES
facet de locale qui contrôle le contenu de ces messages.
strerror_s
est la seule fonction à vérification des limites qui permet la troncation, car fournir autant d'informations que possible sur un échec a été jugé plus souhaitable. POSIX définit également
strerror_r
pour des usages similaires.
Exemple
Exécuter ce code
#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 } }
Sortie possible :
File opening error: No such file or directory Now in German: Datei oder Verzeichnis nicht gefunden Now in Japanese: そのようなファイル、又はディレクトリはありません
Références
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.24.6.2 La fonction strerror (p: 371)
-
- K.3.7.4.2 La fonction strerror_s (p: 622)
-
- K.3.7.4.3 La fonction strerrorlen_s (p: 623)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.21.6.2 La fonction strerror (p: 334)
- Norme C89/C90 (ISO/CEI 9899:1990) :
-
- 4.11.6.2 La fonction strerror
Voir aussi
|
affiche une chaîne de caractères correspondant à l'erreur actuelle vers
stderr
(fonction) |
|
|
macro qui s'étend à la variable thread-local du numéro d'erreur compatible POSIX
(macro variable) |
|
|
Documentation C++
pour
strerror
|
|