Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
capt09 [2020/10/28 16:04] – angelegt administrator | capt09 [2020/10/29 10:45] (aktuell) – [Parameter lesen] administrator | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Kapitel neun - Benutzereingabe ====== | ||
+ | |||
+ | **Eingaben des Benutzers lesen und verarbeiten** | ||
+ | |||
+ | Im vorherigen Kapitel haben wir uns mit dem Drucken der Programmausgabe auf dem Terminal befasst. Um jedoch mit dem Benutzer interagieren zu können, muss dies in beide Richtungen erfolgen. In diesem Kapitel wird erläutert, wie wir Eingaben lesen und interpretieren können, die der Benutzer in das Terminal eingibt. Wir haben gesehen, dass die **printf**-Funktion in den vorherigen Kapiteln häufig verwendet wurde. Dies ist die Standardmethode zum Schreiben von formatiertem Text in die Konsole, die Befehlszeile, | ||
+ | |||
+ | In den letzten Kapiteln haben wir uns die Funktion **sscanf** angesehen, die Werte aus einer Zeichenfolge liest. Es gibt eine äquivalente Funktion namens **scanf**, die Werte direkt von der Konsole liest, wie im folgenden Beispiel: | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | void main (void) | ||
+ | { | ||
+ | char input[256]; | ||
+ | int age; | ||
+ | | ||
+ | printf ("Wie ist Dein Name, User? | ||
+ | scanf (" | ||
+ | printf (" | ||
+ | scanf (" | ||
+ | printf ("Na gut, %s, Du siehst jung aus, für %d...\n", | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **scanf** funktioniert genau wie **sscanf**, hat jedoch ein Argument weniger, da es eher von der Konsole als von einer Zeichenfolge liest. | ||
+ | |||
+ | Dies ist jedoch nicht der beste Weg, um Konsoleneingaben zu erhalten. Es funktioniert nur dann wirklich, wenn Sie einen Benutzer haben, der genau das eingibt, was Sie erwarten. Leider neigen Benutzer dazu, Dinge einzugeben, die Sie nicht erwarten, und **scanf** kommt damit nicht gut zurecht. Wenn der Benutzer im obigen Code beispielsweise **257 Zeichen** eingibt, wenn er nach seinem Namen gefragt wird, wird der für die Eingabezeichenfolge zugewiesene Speicherplatz überlaufen, | ||
+ | |||
+ | ===== Ein besserer Weg ===== | ||
+ | |||
+ | Ein besserer Ansatz besteht darin, jede Zeile zu lesen, die der Benutzer in eine Pufferzeichenfolge eingibt, und dann mit **sscanf** Werte aus dieser Zeichenfolge zu lesen. Die **C**-Libaryfunktion **fgets** ist hierfür hilfreich. Schauen Sie sich dieses Beispiel an: | ||
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | void main (void) | ||
+ | { | ||
+ | char input[256], name[256]; | ||
+ | int age; | ||
+ | | ||
+ | printf ("Wie ist Dein Name, User? | ||
+ | fgets (input, 256, stdin); | ||
+ | sscanf (input, " | ||
+ | | ||
+ | printf (" | ||
+ | while (1) | ||
+ | { | ||
+ | fgets (input, 256, stdin); | ||
+ | if (sscanf (input, " | ||
+ | printf ("Das ist kein Alter - versuche es nochmal!\n" | ||
+ | } | ||
+ | printf ("Na gut, %s, Du siehst jung aus, für %d...\n", | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | **fgets** nimmt drei Argumente an. Der erste ist der Puffer, in dem die Eingabe gespeichert werden soll. Die zweite ist die maximale Anzahl von Bytes, die in diesen Puffer geschrieben werden. Dies ist nützlich, um die oben erwähnte Überlaufsituation zu verhindern. Schließlich braucht es ein Argument, das angibt, woher es lesen soll. In diesem Fall ist dies auf **stdin** (kurz für " | ||
+ | |||
+ | <note important> | ||
+ | **[STDIN UND STDOUT]**\\ | ||
+ | Wir sprechen in diesem Artikel über **stdin**, den Stream " | ||
+ | </ | ||
+ | |||
+ | Jedes Mal, wenn wir den Benutzer um Eingabe bitten, lesen wir mit **fgets** bis zu 256 Zeichen, was auch immer sie eingeben (bis zu dem Punkt, an dem sie die Eingabetaste drücken), und interpretieren sie dann mit **sscanf**. Wenn Sie nach dem Alter des Benutzers fragen, verwenden wir außerdem den von **sscanf** zurückgegebenen Wert (beschrieben im vorherigen Kapitel), um zu überprüfen, | ||
+ | |||
===== Parameter lesen ===== | ===== Parameter lesen ===== | ||
Zeile 97: | Zeile 161: | ||
**Oben:** Der Rechner liest die beiden Werte und den Operator aus dem **argv**-Array und druckt das Ergebnis | **Oben:** Der Rechner liest die beiden Werte und den Operator aus dem **argv**-Array und druckt das Ergebnis | ||
+ | |||
+ | ---- | ||
+ | |||
+ | [[learnc|{{: | ||
+ | |||