7.3. Die do-while-Schleife
Im Gegensatz zur while- und for-Schleife überprüft die do-while-Konstruktion erst nach der Ausführung des Schleifenkörpers, ob die Schleifenbedingung erfüllt ist. Das bedeutet, daß die Anweisungen im Körper einer do-while-Schleife wenigstens einmal zur Ausführung gelangen. Aus diesem Grunde gilt diese Schleife als "nicht abweisend" . Der Bedarf an einer Schleife dieses Typs ist eher gering; die do-while-Schleife kommt daher in der Praxis nicht besonders oft zum Einsatz. Die allgemeine Form der do-while-Schleife sieht folgendermaßen aus:
do{
Schleifenkörper;
}
while(Bedingung);
Auch hier gilt, daß mehrere Anweisungen als Anweisungsblock geschrieben werden müssen. Bei der do-while-Schleife empfiehlt es sich jedoch, zur besseren Lesbarkeit den Schleifenkörper immer in geschweifte Klammern zu setzen.
Typische Anwendungsfälle für do-while-Schleifen sind alle möglichen Formen von Benutzerdialogen, wobei eine Menüauswahl oder eine Eingabeforderung zumindest einmal präsentiert werden soll.
/* yesno.c
* fordert den Benutzer zur Eingabe von 'j' für 'ja'
* oder 'n' für 'nein' auf. Je nach Eingabe werden
* verschiedene Werte an das Betriebssystem zurück-
* gegeben
*/
#include <stdio.h>
#include <ctype.h> /* wg toupper */
int main(void){
char cAnswer;
do{
printf(" (J/N) ");
cAnswer = toupper( getchar());
/* die Funktion toupper() überprüft, ob ein Klein-
* buchstabe vorliegt und wandelt ihn gegebenenfalls
* in einen Großbuchstaben um.
* Auf diese Art können wir sicherstellen, daß beiderlei
* Eingaben (Groß- oder Kleinbuchstabe) gültig sind.
*/
getchar();
/* verbleibenden Zeilenvorschub aus dem
* Tastaturpuffer lesen
*/
}
while( cAnswer != 'J' && cAnswer != 'N' );
if( cAnswer == 'J')
return(0);
else
return(1);
}
Die Ausführungsreihenfolge der do-while-Schleife sorgt dafür, daß die Eingabeforderung (mit printf() und getchar()) schon präsentiert werden kann, bevor die Bedingung der while-Anweisung das erste Mal überprüft wird. Im vorliegenden Beispiel kommt es darauf an, daß der Anwender nach jeder Fehleingabe erneut mit dem Prompt "(J/N)" konfrontiert wird. Deshalb soll die Kontrolle nach Eingabe ungültiger Zeichen wieder zurück an die do-Anweisung gehen. Genau dies geschieht, wenn nach der ersten Benutzereingabe die Auswertung der Schleifenbedingung das Ergebnis "wahr" liefert. Damit wir in der Schleifenbedingung das eingegebene Zeichen nicht mit 'J' und 'j’ bzw. 'N' und 'n' vergleichen müssen, wandeln wir dieses mit Hilfe von toupper() gleich bei der Eingabe in einen Großbuchstaben um (siehe Kapitel 9.2). Damit reduziert sich der Vergleich auf 'J' und 'N'.
Die return-Anweisung bewirkt die Rückkehr aus einer Funktion zu ihrem Aufrufer. Sie übergibt diesem den mit ihr assoziierten Wert (Rückgabewert bzw. Returncode). Im Fall von main() bewirkt return die Rückkehr zum Betriebssystem. Die hier verwendeten Rückgabewerte 0 bzw. 1 können auf der Ebene des Betriebssystems abgefragt werden (z.B. unter DOS durch errorlevel). Näheres zu return finden Sie in Kapitel 10.5.