strerror, strerror_s, strerrorlen_s
From cppreference.net
|
Definiert im Header
<string.h>
|
||
|
char
*
strerror
(
int
errnum
)
;
|
(1) | |
|
errno_t strerror_s
(
char
*
buf, rsize_t bufsz, errno_t errnum
)
;
|
(2) | (seit C11) |
|
size_t
strerrorlen_s
(
errno_t errnum
)
;
|
(3) | (seit C11) |
1)
Gibt einen Zeiger auf die textuelle Beschreibung des Systemfehlercodes
errnum
zurück, identisch mit der Beschreibung, die von
perror()
ausgegeben werden würde.
errnum
wird üblicherweise aus der Variable
errno
bezogen, jedoch akzeptiert die Funktion jeden Wert vom Typ
int
. Der Inhalt der Zeichenkette ist localespezifisch.
Der zurückgegebene String darf vom Programm nicht modifiziert werden, kann jedoch durch einen nachfolgenden Aufruf der
strerror
-Funktion überschrieben werden.
strerror
muss nicht thread-sicher sein. Implementierungen können verschiedene Zeiger auf statische schreibgeschützte String-Literale zurückgeben oder immer wieder denselben Zeiger zurückgeben, der auf einen statischen Puffer zeigt, in dem strerror den String platziert.
2)
Gleich wie
(1)
, außer dass die Nachricht in den benutzerbereitgestellten Speicher
buf
kopiert wird. Es werden maximal
bufsz-1
Bytes geschrieben, der Puffer ist immer nullterminiert. Wenn die Nachricht gekürzt werden musste, um in den Puffer zu passen, und
bufsz
größer als 3 ist, dann werden nur
bufsz-4
Bytes geschrieben und die Zeichen
"..."
vor dem Nullterminator angehängt. Zusätzlich werden folgende Fehler zur Laufzeit erkannt und rufen die aktuell installierte
constraint handler
-Funktion auf:
-
-
bufist ein Nullzeiger -
bufszist null oder größer als RSIZE_MAX
-
Das Verhalten ist undefiniert, wenn das Schreiben in
buf
über das Ende des Arrays hinaus erfolgt, was passieren kann, wenn die Größe des Puffers, auf den
buf
zeigt, kleiner ist als die Anzahl der Zeichen in der Fehlermeldung, die wiederum kleiner ist als
bufsz
.
3)
Berechnet die Länge der ungekürzten lokalisierungsabhängigen Fehlermeldung, die
strerror_s
schreiben würde, wenn es mit
errnum
aufgerufen würde. Die Länge enthält den Nullterminator nicht.
-
Wie bei allen grenzprüfenden Funktionen sind
strerror_sundstrerrorlen_snur garantiert verfügbar, wenn __STDC_LIB_EXT1__ durch die Implementierung definiert ist und wenn der Benutzer __STDC_WANT_LIB_EXT1__ auf den Integer-Konstantenwert 1 setzt, bevor <string.h> eingebunden wird.
Inhaltsverzeichnis |
Parameter
| errnum | - | Integralwert, der sich auf einen Fehlercode bezieht |
| buf | - | Zeiger auf einen benutzerbereitgestellten Puffer |
| bufsz | - | Größe des benutzerbereitgestellten Puffers |
Rückgabewert
2)
Null, wenn die gesamte Nachricht erfolgreich in
buf
gespeichert wurde, andernfalls ungleich null.
3)
Länge (ohne den Nullterminator) der Nachricht, die
strerror_s
zurückgeben würde
Hinweise
POSIX
erlaubt nachfolgende Aufrufe von
strerror
, den von einem früheren Aufruf zurückgegebenen Zeigerwert für ungültig zu erklären. Es wird ebenfalls spezifiziert, dass es der
LC_MESSAGES
-Locale-Facet ist, der den Inhalt dieser Nachrichten steuert.
strerror_s
ist die einzige grenzprüfende Funktion, die eine Abschneidung erlaubt, da es als wünschenswerter erachtet wurde, so viele Informationen wie möglich über einen Fehler bereitzustellen. POSIX definiert ebenfalls
strerror_r
für ähnliche Zwecke.
Beispiel
Diesen Code ausführen
#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 } }
Mögliche Ausgabe:
File opening error: No such file or directory Now in German: Datei oder Verzeichnis nicht gefunden Now in Japanese: そのようなファイル、又はディレクトリはありません
Referenzen
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.24.6.2 Die strerror-Funktion (S. 371)
-
- K.3.7.4.2 Die strerror_s-Funktion (S. 622)
-
- K.3.7.4.3 Die strerrorlen_s-Funktion (S. 623)
- C99-Standard (ISO/IEC 9899:1999):
-
- 7.21.6.2 Die strerror-Funktion (S. 334)
- C89/C90-Standard (ISO/IEC 9899:1990):
-
- 4.11.6.2 Die strerror-Funktion
Siehe auch
|
gibt eine Zeichenkette entsprechend dem aktuellen Fehler auf
stderr
aus
(Funktion) |
|
|
Makro, das zu einer POSIX-kompatiblen thread-lokalen Fehlernummer-Variable expandiert
(Makro-Variable) |
|
|
C++-Dokumentation
für
strerror
|
|