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
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
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
Programm A13_02.c