Fehlerbehandlung in C-Sprache
Die Sprache C bietet keine direkte Unterstützung für die Fehlerbehandlung, aber als Systemprogrammiersprache ermöglicht sie Ihnen den Zugriff auf die zugrunde liegenden Daten in Form von Rückgabewerten. Wenn ein Fehler auftritt, geben die meisten C- oder UNIX-Funktionsaufrufe 1 oder NULL zurück und setzen außerdem einen Fehlercode errno, der eine globale Variable ist, die angibt, dass während des Funktionsaufrufs ein Fehler aufgetreten ist. In der Header-Datei <error.h> finden Sie verschiedene Fehlercodes.
Ein C-Programmierer kann also den Rückgabewert überprüfen und dann basierend auf dem Rückgabewert entscheiden, welche geeignete Aktion zu ergreifen ist. Entwickler sollten errno auf 0 setzen, wenn das Programm initialisiert wird, was eine gute Programmierpraxis ist. Ein Wert von 0 zeigt an, dass das Programm keine Fehler enthält.
errno, perror() 和 strerror()
Die Sprache C stellt die Funktionen perror() und strerror() bereit, um Textnachrichten im Zusammenhang mit errno anzuzeigen.
- Die perror()- Funktion zeigt die übergebene Zeichenfolge an, gefolgt von einem Doppelpunkt, einem Leerzeichen und der Textdarstellung des aktuellen errno-Werts.
- Die Funktion strerror() gibt einen Zeiger auf die Textdarstellung des aktuellen errno-Werts zurück.
Lassen Sie uns einen Fehlerzustand simulieren, indem wir versuchen, eine Datei zu öffnen, die nicht existiert. Sie können Fehlermeldungen auf verschiedene Arten ausgeben, hier verwenden wir eine Funktion, um die Verwendung zu demonstrieren. Beachten Sie außerdem, dass Sie den stderr- Dateistream verwenden sollten, um alle Fehler auszugeben.
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno ;
int main ()
{
FILE * pf;
int errnum;
pf = fopen ("unexist.txt", "rb");
if (pf == NULL)
{
errnum = errno;
fprintf(stderr, "Value of errno: %d\n", errno);
perror("Error printed by perror");
fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
}
else
{
fclose (pf);
}
return 0;
}
Versuch es
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Wert der Fehlernummer: 2 Von perror ausgegebener Fehler: Datei oder Verzeichnis nicht vorhanden Fehler beim Öffnen der Datei: Keine solche Datei oder kein Verzeichnis
Division durch Null Fehler
Bei der Durchführung einer Divisionsoperation ist das Nichtprüfen, ob der Divisor Null ist, ein häufiges Problem für Programmierer beim Programmieren und führt zu einem Laufzeitfehler.
Um dies zu verhindern, prüft der folgende Code, ob der Divisor Null ist, bevor die Division ausgeführt wird:
#include <stdio.h>
#include <stdlib.h>
main()
{
int dividend = 20;
int divisor = 0;
int quotient;
if( divisor == 0){
fprintf(stderr, "Division by zero! Exiting...\n");
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient );
exit(0);
}
Versuch es
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Durch Null teilen! Verlassen...
Programmbeendigungsstatus
Wenn ein Programm eine Operation erfolgreich ausführt und normal beendet wird, hat es normalerweise den Wert EXIT_SUCCESS. Hier ist EXIT_SUCCESS das Makro, das als 0 definiert ist.
Wenn im Programm eine Fehlerbedingung vorliegt, hat es beim Beenden des Programms den Statuswert EXIT_FAILURE, der als -1 definiert ist. Das obige Programm kann also geschrieben werden als:
#include <stdio.h>
#include <stdlib.h>
main()
{
int dividend = 20;
int divisor = 5;
int quotient;
if( divisor == 0){
fprintf(stderr, "Division by zero! Exiting...\n");
exit(EXIT_FAILURE);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient );
exit(EXIT_SUCCESS);
}
Versuch es
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Wert des Quotienten: 4
Rekursion in C-Sprache
Rekursion ist der Prozess der Wiederholung von Elementen auf selbstähnliche Weise. Ebenso wird in Programmiersprachen der Aufruf einer Funktion selbst innerhalb einer Funktion als rekursiver Aufruf bezeichnet. folgendermaßen:
void recursion(){
recursion(); /* 函数调用自身 */
}
int main(){
recursion();
}
Die C-Sprache unterstützt Rekursion, dh eine Funktion kann sich selbst aufrufen. Bei der Verwendung von Rekursion muss der Programmierer jedoch darauf achten, eine Bedingung für das Verlassen der Funktion zu definieren, da er sonst in eine Endlosschleife eintritt.
Rekursive Funktionen spielen eine wichtige Rolle bei der Lösung vieler mathematischer Probleme, wie z. B. der Berechnung der Fakultät einer Zahl, der Generierung der Fibonacci-Folge und so weiter.
Fakultät einer Zahl
Das folgende Beispiel berechnet die Fakultät einer gegebenen Zahl mit einer rekursiven Funktion:
#include <stdio.h>
int factorial(unsigned int i){
if(i <= 1){
return 1;
}
return i * factorial(i - 1);
}
int main() {
int i = 15;
printf("Factorial of %d is %d\n", i, factorial(i));
return 0;
}
Versuch es
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
Fakultät von 15 ist 2004310016
Fibonacci-Folge
Das folgende Beispiel verwendet eine rekursive Funktion, um die Fibonacci-Folge für eine bestimmte Zahl zu generieren:
#include <stdio.h>
int fibonaci(int i){
if(i == 0){
return 0;
}
if(i == 1){
return 1;
}
return fibonaci(i-1) + fibonaci(i-2);
}
int main(){
int i;
for (i = 0; i < 10; i++){
printf("%d\t%n", fibonaci(i));
}
return 0;
}
Versuch es
Wenn der obige Code kompiliert und ausgeführt wird, erzeugt er das folgende Ergebnis:
0 1 1 2 3 5 8 13 21 34