Namespaces
Variants

strerror, strerror_s, strerrorlen_s

From cppreference.net
< c ‎ | string ‎ | byte
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 :
  • buf est un pointeur nul
  • bufsz est 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_s et strerrorlen_s ne 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

#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