Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

1 - Text über ein Terminal eingeben

In der Lektion Werte über ein Terminal einlesen wurden Zahlen über das SimpleIDE Terminal eingegeben und in Variablen abgespeichert. So etwas kann auch mit Textgrößen gemacht werden.


Eine Sequenz aus Buchstaben bezeichnen wir auch kurz als String. Strings werden in sogenannten Zeichenfeldern abgelegt. Die Adressen der ersten Elemente eines Feldes, die Zeichen enthalten, werden für die Ein- und Ausgabe von Text auf dem SimpleIDE Terminal benutzt.

 

 

 

Übung 1

 

  • Gib das unten stehende Programm ein, speicher es unter dem Namen A13_01 und starte es anschließend.
  • Gib einen beliebigen Text im SimpleIDE Terminal ein und drücke die Eingabetaste.
  • Prüfe, ob nach dem Text Eingegeben wurde:  der vorher eingegebene Text im Terminalfenster erscheint.

 

 

Programm A13_01.c

Programm A13_01.c

 

Wie arbeitet das Programm A13_01.c?

 

In Zeile 7 wird ein Zeichenfeld mit 16 Elementen deklariert. Jedes der 16 ein Byte großen Feldelemente kann einen Wert zwischen 0 und 255 annehmen. Große und kleine Buchstaben werden über die sogenannte ASCII Tabelle kodiert, d.h. einem bestimmten Buchstaben wird ein entsprechender Zahlenwert zwischen 32 und 126 zugeordnet.


Zeile 7   char text[16];

 

Wird nun ein bestimmter Text eingegeben und mit der Eingabetaste abgeschlossen, überträgt die Funktion getStr(text, 15) die Startadresse des Textes und begrenzt die Maximalzahl eingegebener Zeichen auf 15. Bei weniger als 15 Zeichen beendet die Eingabetaste die Funktion getStr. Die Funktion beendet sich von selbst, nach Eingabe von 15 Zeichen.


Zeile 11   print("Gib einen Text ein: ");

Zeile 12   getStr(text, 15);         

 

Warum ist getStr auf 15 Zeichen begrenzt?

 

In der Sprache C werden Strings immer  mit einer Null nach dem letzten Zeichen abgeschlossen. Die Funktion getStr hängt automatisch an einen eingegebenen Text eine Null an. Wenn also ein Zeichenfeld mit 16 Elementen deklariert wurde, dann lassen sich 15 Zeichen und die Null unterbringen.


Die print-Funktion in Zeile 13 gibt den vorher eingegebenen Text auf dem Terminal aus. Die Formatanweisung % s weist darauf hin, dass ein nullterminierter String ausgegeben werden soll.

 

 Zeile 13   print("\nEingegeben wurde: %s \n", text);

 

In den drei folgenden Programmzeilen werden jedesmal gleiche Zeichenfelder mit jeweils 8 Zeichen deklariert, die die Zeichen abc 123 mit Null-Terminierung enthalten.

 

Eine Zeichenfolge, die mit einer Null abgeschlossen wird, bezeichnen wir als nullterminierten String.

 

  • char pass[8] = {"abc 123"};
    
  • char pass[8] = {'a', 'b', 'c', ' ', '1', '2', '3', '\0'};
    
  • char pass[8] = {97, 98, 99, 32, 49, 50, 51, 0};
    

 

In der simpletools-Bibliothek ist auch die Standard String-C-Bibliothek enthalten. Eine der in ihr enthaltenen Funktionen ist strcmp.  Sie vergleicht zwei Strings auf Gleichheit. Der Rückgabewert spiegelt die Position des ersten Unterschieds in den beiden Strings wieder. Ein Wert von 0 sagt aus, dass die beiden Strings identisch sind.

 

if(strcmp(pass, text) == 0) print("Identisch!");

   else print("Verschieden!");

 

Die if..else-Abfrage mit der Bedingung strcmp(pass, text) == 0 gibt eine 1 zurück, wenn der Vergleich mit strcmp zutrifft, sonst eine Null und führt bei Gleichheit der Texte den sich anschließenden Befehlsblock aus:


print (“Identisch!”)

 

Der Logik-Operator ! macht aus einer Null eine 1 und jeden Wert ungleich Null zu 0. Das folgende Programmbeispiel zeigt eine in der Wirkung zweite Variante zu der eben besprochenen if..else-Abfrage:

 

if(!strcmp(pass, text)) print("Übereinstimmung!");

    else print("Verschieden!");

 

Bei Übereinstimmung liefert strcmp eine 0 und der ! Operator macht daraus eine 1, so dass die if .. else-Anweisung Übereinstimmung ausgibt. Bei fehlender Übereinstimmung gibt strcmp einen Wert ungleich 0 zurück, der vom !-Operator zu 0 invertiert wird und die if..else-Anweisung veranlasst Verschieden auszugeben.

 

Als nächstes werden wir uns einen Passwort-Tester bauen, der auf die Funktionen scan und strcmp zurückgreift.

 

Übung 2

 

  • Gib das unten stehende Programm ein und speicher es unter dem Namen  A13_02 ab.
  • Starte das Programm.
  • Gib als Passwort abc 123 ein; achte darauf, dass zwischen abc und 123 ein Leerzeichen gesetzt wird.
  • Überprüfe, ob das Programm mit dem Hinweis reagiert: Passwort ist korrekt.
  • Starte das Programm noch einmal und gib jetzt ein falsches Passwort ein.
  • Überprüfe, ob das Programm mit dem Hinweis reagiert: Zugang verweigert.

 

 

Programm A13_02.c

Programm A13_02.c
Terminalausgabe zu Programm A13_02.c

 

Jetzt kommst du!

 

Häufig werden die eingegebenen Passwörter nicht im Klartext sondern durch Sternchen im Terminal wiedergegeben; damit verhindert man, dass zufällig anwesende Personen das Passwort mitlesen können. In einer letzten Übung werden wir uns dieser Aufgabe widmen.

Übung 3

 

  • Ersetze die Zeilen 13 und 14 im Programm A13_02 durch eine for-Schleife.
  • Speicher das Programm unter dem Namen A13_03 ab.
  • Starte das Programm und überprüfe, ob es bei der Eingabe statt der eingetippten Buchstaben Sternchensymbole anzeigt und stelle fest, ob das richtig eingegebene Passwort erkannt wird.

 

Programm A13_02.c

Programm A13_03.s

Kommentar schreiben

Kommentare

  • olaf (Sonntag, 10. Dezember 2017 08:35)

    wow...die mit Abstand beste Site, die ich bisher zu diesem Thema gesehen habe :-))
    Vielen Dank dafür. Hilft super beim Erklären!!

  • David Eisenblätter (Sonntag, 11. Februar 2018 13:38)

    Sehr schön erklärt, und zufällig heute, wo ich nochmal nach einer detailierten Gedankenstütze diesbezüglich gesucht habe!

    Vielen vielen Dank!

    David.

Bitte geben Sie den Code ein
* Pflichtfelder
Druckversion Druckversion | Sitemap
© Reinhard Rahner - Gettorf