Zeichenketten vergleichen
Hat der Benutzer das richtige Passwort eingegeben? (In einem echten Programm würde der Benutzer es eintippen. Die Programme auf dieser Seite bekommen ihre Daten aus Variablen.) Die erste Idee ist, die Zeichenketten mit == zu vergleichen. Das lässt sich hier kompilieren, tut aber nicht, was du erwartest:
char passwort[] = "sesam";
char eingabe[] = "sesam";
if (eingabe == passwort) {
printf("Zugriff erlaubt\n");
} else {
printf("Zugriff verweigert\n");
}Das gibt Folgendes aus:
Zugriff verweigertBeide Arrays enthalten denselben Text, und trotzdem sagt das Programm, sie seien verschieden. Das liegt daran, dass == nicht die Zeichen zweier Arrays vergleicht. Es fragt nur, ob beide Seiten dasselbe Array sind, dieselbe Stelle im Speicher des Computers. Jedes Array hat seinen eigenen Platz im Speicher, bei zwei verschiedenen Arrays lautet die Antwort also immer „nein“. (Clang warnt davor, aber diese Seite zeigt keine Warnungen.)
Um Texte zu vergleichen, verwende die Funktion strcmp (string compare, Zeichenketten vergleichen) aus string.h. Sie geht beide Zeichenketten Zeichen für Zeichen durch und liefert eine ganze Zahl: 0, wenn die Texte gleich sind:
char passwort[] = "sesam";
char eingabe[] = "sesam";
if (strcmp(eingabe, passwort) == 0) {
printf("Zugriff erlaubt\n");
} else {
printf("Zugriff verweigert\n");
}Das gibt Folgendes aus:
Zugriff erlaubtVorsicht: Hier bedeutet 0 „gleich“, also das Gegenteil dessen, was du vielleicht erwartest. In einer Bedingung ist 0 falsch, if (strcmp(eingabe, passwort)) würde also „wenn die Texte verschieden sind“ bedeuten. Schreibe immer == 0, damit der Code genau sagt, was er tut.
Wenn die Texte verschieden sind, verrät dir die Zahl ihre alphabetische Reihenfolge. Sie ist negativ, wenn der erste Text vor dem zweiten kommt, und positiv, wenn er danach kommt. Verlasse dich nicht auf eine bestimmte Zahl wie -1. Prüfe nur, ob sie kleiner oder größer als 0 ist:
char erstes[] = "Apfel";
char zweites[] = "Banane";
if (strcmp(erstes, zweites) < 0) {
printf("%s kommt zuerst\n", erstes);
} else {
printf("%s kommt zuerst\n", zweites);
}Das gibt Folgendes aus:
Apfel kommt zuerststrcmp vergleicht Zeichen als Zahlen: 'A' ist 65, 'B' ist 66 und so weiter, und die Kleinbuchstaben beginnen bei 'a', das ist 97. Groß- und Kleinbuchstaben sind also verschieden: strcmp("Sesam", "sesam") ist nicht 0. Und jeder Großbuchstabe kommt vor jedem Kleinbuchstaben, für strcmp kommt "Zebra" also vor "apfel".
So schreibst du es:
Anweisungen
- 1
Die Eingabe ist richtig, aber das Programm gibt
Zugriff verweigertaus. Korrigiere die Bedingung: Vergleiche die Texte mitstrcmpund== 0. Dann gibt das ProgrammZugriff erlaubtaus. - 2
Erstelle unter der Bedingung die Namen zweier Spieler,
char spieler1[] = "Mia";undchar spieler2[] = "Leo";. Gib mitstrcmpden aus, der in alphabetischer Reihenfolge zuerst kommt, alsLeo kommt zuerst.