#include <stdio.h> void perror( const char *string );perror kann zum Erzeugen von (englischen) Fehlermeldungen verwendet werden.
Die Routine gibt die folgenden Daten über stderr aus:
Die möglichen Werte von errno sowie die zugehörigen (englischen) Fehlertexte werden in ANSI-C in der Datei errno.h deklariert.
Da errno durch einen großen Teil der Routinen der Laufzeitbibliothek neu gesetzt wird, sollte perror unmittelbar nach der Erkennung eines Fehlers aufgerufen werden: Ein Programm, das an dieser Stelle erst noch andere Routinen "dazwischenschiebt", läuft Gefahr, daß diese errno verändern.
Einige Fehlercodes sind standardisiert, andere sind systemspezifisch (unter Unix gibt es eine gewisse Standardisierung).
Rückgabewert: keiner
Beispiel:
FILE *fr;
char in_file[] = "daten.dat";
if ( ( fr = fopen(in_file, "r") ) == NULL ) {
perror(in_file);
exit(1);
}
Ein mit Microsoft C übersetztes Programm liefert im Fehlerfall:
daten.dat: No such file or directoryGnu C unter DOS liefert:
daten.dat: file not found
strerror
#include <string.h> char *strerror( int errnum );Die Routine strerror läßt sich von Programmen zum Erzeugen von (englischen) Fehlermeldungen verwenden.
Beispiel:
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(void)
{
printf("%s\n", strerror(ERANGE));
printf("%s\n", strerror(EDOM));
return 0;
}
ERANGE und EDOM sind in ANSI-C vorgesehene Fehlercodes,
weitere Fehlercodes sind systemspezifisch. Wird das obige Programm mit Microsoft C übersetzt, so liefert es
Result too large Math argumentRückgabewert:
Beispiel:
#include <stdio.h>
#include <errno.h>
#include <math.h>
int main(void)
{
double x, y;
x = 1.0;
y = sqrt(x);
if ( errno )
perror("sqrt");
else
printf("sqrt(%f) = %f\n", x, y);
x = -x;
y = sqrt(x);
if ( errno )
perror("sqrt");
else
printf("sqrt(%f) = %f\n", x, y);
return 0;
}
Ausgabe:
gcc unter Solaris 2.3 auf Sparc-Rechner sqrt(1.000000) = 1.000000 sqrt: Argument out of domainMit Hilfe von strerror läßt sich die obige Fehlerausgabe etwas weiter ausgestalten:
printf("sqrt(%f): %s\n", x, strerror(errno));
anstelle von perror("sqrt") bewirkt folgende Ausgabe
sqrt(1.000000) = 1.000000 sqrt(-1.000000): Argument out of domainDas Verhalten des Programms im Fehlerfall ist jedoch nicht systemunabhängig:
cc unter Unix System V/68 auf Motorola sqrt(1.000000) = 1.000000 sqrt: DOMAIN error sqrt(-1.000000): Argument out of domain