Eingabe mit Werten aus Array vergleichen.
-
Guten Abend.
Ich versuche ein Programm zu schreiben, indem ein Spieler ein Wort eingibt und ein anderer es erraten muss.
Dabei kann Spieler 2 immer nur einen Buchstaben eingeben.Das Programm ist noch nicht fertig. Es fehlt noch die bedingung, dass Spieler 2 nicht unendlich oft raten darf. Außerdem erkennt das Programm noch nicht, wann das Wort erraten wurde.
Im Moment habe ich jedoch ein anderes Problem. Das Programm müsste den von Spieler 2 eingegebenen Buchstaben mit allen Buchstaben aus dem Wort von Spieler 1 vergleichen.
Das Wort wird in einem Array gespeichert. Es müssten alle Werte im Array mit dem Buchstaben verglichen werden und bei einer richtigen eingabe muss das gespeichert werden damit das Programm weiß wann das Wort erraten wurde.Bis hier bin ich schon gekommen, aber es kommt immer die Meldung das der Buchstabe falsch ist?
/* Wortratespiel mit 2 Spielern Erklärung: Spieler 1 gibt ein Wort ein. Danch muss Spieler 2 einen Buchstaben raten. Stimmt dieser mit IRGENDEINEM Buchstaben aus dem Wort von Spieler 1 überein, kann Spieler 2 weitermachen, ansonsten kommt eine Fehlermeldung. */ #include <stdio.h> #include <conio.h> int main(void) { char bestaetigung, wortwahl[15],buchstabe; char wortbestaetigung; printf("Das Wortratespiel \n"); //Überschrift und Spielregeln printf("\n"); printf("Regeln:\n"); printf(" Spieler 1 gibt ein Wort ein.\n"); printf(" Spieler 2 muss das Wort durch eingeben\n"); printf(" eines Buchstaben erraten!\n"); printf("\n"); //Ab hier geht das eigentliche Programm los. printf("Sind beide Spieler mit den Regeln einverstanden (J)(N)\n"); //Regeln müssen akzeptiert werden! scanf("%c",&bestaetigung); switch (bestaetigung){ case'j': case'J': //Spieler 1 gibt nun ein Wort ein. printf("Spieler 1 gibt ein Wort ein: \n"); scanf("%s",&wortwahl[0]); // printf("Dein Wort ist: %s \n",wortwahl); Eventuell das Wort nochmal anzeigen um sicher zu gehen das es richtig // geschrieben wurde do{ fflush(stdin); printf("Spieler 2 gib nun einen Buchstaben ein:"); scanf("%s",&buchstabe); if (buchstabe != wortwahl) // <--Hier liegt das Problem... Es kommt immer "Falsch" als Ausgabe. { printf("\tLeider falsch\n"); printf(""); fflush(stdin); } else{ printf("\nSuper!\n"); printf(""); fflush(stdin); } } while (buchstabe != 'N'); break; case 'N': case 'n': printf("Regeln akzeptieren"); break; } getch(); }
-
Du vergleichst einen Buchstaben mit einem kompletten Wort. Das geht natürlich nicht. Du musst mit einer Schleife durch das Wortwahl-Array gehen und Buchstabe für Buchstabe vergleichen.
Übrigens sollte man Buchstaben mit %c einlesen.L. G.
Steffo
-
Wie schreibe ich die Schleife da am besten?
In dem Array können die Buchstaben varrieren, also in der einen Runde sind 3 Buchstaben und in der anderen 10 drinnen.
Gibt es eine "allgemeine" Lösung?
-
wildtobias schrieb:
Gibt es eine "allgemeine" Lösung?
int istBuchstabeInWort(const char *wort, const char buchstabe) { while(wort) { if(*wort == buchstabe) return 1; ++wort; } return 0; } int main() { ... if(!istBuchstabeInWort(wortwahl, buchstabe)) { //Buchstabe ist nicht im Wort enthalten ... } ... }
Edit: Eine vergessene Klammer nachgetragen
-
Belli schrieb:
int istBuchstabeInWort(const char *wort, const char buchstabe) { /* ... */ while(wort) { /* ... */ } /* ... */ } /* ... */
Das sollte man für Anfänger der Deutlichkeitshalber vielleicht eher so schreiben:
int istBuchstabeInWort(const char *wort, const char buchstabe) { /* ... */ while(wort != NULL) { /* ... */ } /* ... */ } /* ... */
-
Steffo schrieb:
Belli schrieb:
int istBuchstabeInWort(const char *wort, const char buchstabe) { /* ... */ while(wort) { /* ... */ } /* ... */ } /* ... */
int istBuchstabeInWort(const char *wort, const char buchstabe) { /* ... */ while(wort != NULL) { /* ... */ } /* ... */ } /* ... */
Ist beides falsch.
Muss in etwa so aussehen:int istBuchstabeInWort(const char *wort, const char buchstabe) { /* ... */ if( wort ) while(*wort) { /* ... */ } /* ... */ }
oder für Anfänger
int istBuchstabeInWort(const char *wort, const char buchstabe) { /* ... */ if( wort!=NULL ) while(*wort != '\0') { /* ... */ } /* ... */ }
-
Wutz schrieb:
Ist beides falsch.
Schei..., hast natürlich recht ... an einen Nullzeiger habe ich nicht gedacht, aber auf jeden Fall muss es natürlich
while(*wort)
heißen!
-
danke für die vielen Antworten. Leider kann ich nur bedingt etwas damit anfangen.
int istBuchstabeInWort(const char *wort, const char buchstabe)
*wort gibt einen Pointer an, aber was genau macht/ist ein Pointer?
wozu "const" vor char?Wo in meinem Programm kann ich das wie einbinden? Also ab wann sucht er im Array nach passenden Buchstaben?
Sorry für die vielen Fragen aber ich lerne grade C und stehe noch am Anfang.
-
wildtobias schrieb:
int istBuchstabeInWort(const char *wort, const char buchstabe)
*wort gibt einen Pointer an, aber was genau macht/ist ein Pointer?
Ein Pointer zeigt auf eine Adresse. In diesem Fall auf dein Array. Man kann Pointer auch hochzählen, dadurch kann man z. B. die Indizes des Arrays durchlaufen.
wozu "const" vor char?
Const steht für Konstante. Damit verhindert man, dass versehentlich Änderungen an den Variablen vorgenommen werden. Außerdem kann der Compiler noch Optimierungen vornehmen, wenn er weiss, dass sich ein Wert nicht ändert (Caching).
Wo in meinem Programm kann ich das wie einbinden?
Du musst erst mal ganz oben nach den header-includes deine Funktion definieren:
int istBuchstabeInWort(const char *wort, const char buchstabe);
Dann kannst du die Funktion beispielsweise nach der main-Funktion einfügen.
Also ab wann sucht er im Array nach passenden Buchstaben?
Ab dem nullten Index.
L. G.
Steffo
-
wildtobias schrieb:
Sorry für die vielen Fragen aber ich lerne grade C und stehe noch am Anfang.
Wie/Wo lernst du denn C?
Mach dir mal klar was
char wortwahl[15];
bedeutet.Du musst deine gefundenen Buchstaben auch irgendwo eintragen, damit du weißt, wann das Wort gefunden wurde.
-
@DirkB
Ich lerne C in der Schule (12 klasse). Bis jetzt hatten wir im Informatikunterricht keine Pro. Sprache gelernt.char wortwahl [15]; Bedeutet, dass ein Array mit Platz für 14 Werten vom Typ Character initialisiert wird.
Das mit dem Buchstaben kommt nocht. Zuerst soll das Programm erkennen ob der Buchstabe stimmt oder nicht.
-
wildtobias schrieb:
char wortwahl [15]; Bedeutet, dass ein Array mit Platz für 14 Werten vom Typ Character initialisiert wird.
Falsch geraten.
char wortwahl [15];
Definiert ein Array für 15 char-Elemente.
Mit außerhalb von Codeblöcken (implizit) oder innerhalb (explizit) vorgegebener Speicherklasse static wird auch initialisiert, sonst nicht.