Benutzer-Werkzeuge

Webseiten-Werkzeuge


capt09

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
capt09 [2020/10/28 16:04] – angelegt administratorcapt09 [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, über die Sie das Programm ausführen. Aber was ist, wenn Sie Eingaben vom Benutzer erhalten möchten? Wie lesen wir, was der Benutzer in die Konsole eingibt?
 +
 +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 <stdio.h>
 +
 +void main (void)
 +{
 +  char input[256];
 +  int age;
 +  
 +  printf ("Wie ist Dein Name, User?\n");
 +  scanf ("%s", input);
 +  printf ("Hallo, %s. Wie alt bist Du?\n", input);
 +  scanf ("%d", &age);
 +  printf ("Na gut, %s, Du siehst jung aus, für %d...\n", input, age);
 +}
 +</code>
 +
 +**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, und es können eigenartige Dinge passieren ...
 +
 +===== 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 <stdio.h>
 +
 +void main (void)
 +  {
 +  char input[256], name[256];
 +  int age;
 +  
 +  printf ("Wie ist Dein Name, User?\n");
 +  fgets (input, 256, stdin);
 +  sscanf (input, "%s", name);
 +  
 +  printf ("Hallo, %s. Wie alt bist Du?\n", name);
 +  while (1)
 +  {
 +    fgets (input, 256, stdin);
 +    if (sscanf (input, "%d", &age) == 1) break;
 +    printf ("Das ist kein Alter - versuche es nochmal!\n");
 +  }
 +  printf ("Na gut, %s, Du siehst jung aus, für %d...\n", name, age);
 +}
 +</code>
 +
 +**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 "standard input") eingestellt, wodurch es angewiesen wird, von der Konsole zu lesen.
 +
 +<note important>
 +**[STDIN UND STDOUT]**\\
 +Wir sprechen in diesem Artikel über **stdin**, den Stream "standard input", was der Benutzer an der Konsole eingibt. Manchmal werden Verweise auf **stdout** angezeigt, bei dem es sich um den Stream "standard output" handelt. Wie zu erwarten, handelt es sich hierbei um eine Ausgabe, die auf der Konsole gedruckt wird, normalerweise über **printf**.
 +</note>
 +
 +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, ob der Benutzer das eingegeben hat, was Sie erwarten, und führen eine Schleife durch, bis er eine gültige Antwort gibt. Sie können diese Methode verwenden, um so ziemlich alles zu interpretieren, was ein Benutzer eingibt, und um alle Fälle sicher zu behandeln, in denen er etwas Unerwartetes eingibt!
 +
 ===== 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|{{:icons:go-top.png?30|Zurück zum Inhalt}}]]\ \  [[capt08|{{:icons:go-previous.png?30|Vorige Seite}}]]\ \  [[capt10|{{:icons:go-next.png?30|Nächste Seite}}]]
 +
  
capt09.1603897442.txt.gz · Zuletzt geändert: 2020/10/28 16:04 von administrator