Einsteiger Problem mit scanf
-
Hallo,
nach einer längeren pause (2 Jahre) wollte ich mal wieder anfangen ein kleines CLI Spiel zu programmieren. Ich hab allerdings ein kleines Problem mit scanf...
Ich möchte gerne dass der Spieler seinen Schwierigkeitsgrad auswählen kann. Zum Test habe ich es erstmal so eingerichtet, dass wenn der benuzer "?" eingibt, die möglichen Eingaben angezeigt werden.Hier ist der Code:
char *en_diff; //choosed difficulty bool ch_diff = 0; //already choosed? while (ch_diff == 0) //if not choosed -> ask { printf("difficulty:"); scanf("%s", &en_diff); if (en_diff == "?\0") { printf("beginner - veteran - elite\n\n"); } else { printf("Invalid input. Try ? for possible answers.\n\n"); } }
Was muss ich ändern, damit das programm meine Eingabe richtig erkennt? Bis jetzt ignoriert er es wenn ich ein "?" eingebe.
-
char-Arrays kann man nicht mit == vergleichen (beziehungsweise man kann schon, aber es was macht etwas anderes als du denkst). Nimm
strcmp
zum Vergleich von char-Arrays oder (da du nur einzelne Zeichen einliest) gleich einen char als Datentyp (die kann man mit == vergleichen).edit: Und das Einlesen selbst ist auch noch fehlerhaft: Du überschreibst den Wert deines (zudem noch uninitialisierten) Zeigers.
-
#include <stdlib.h> #include <stdio.h> /* den C++ Müll der hier stand, habe ich mal entfernt */ /* * */ void StartGame() { char en_diff[BUFSIZ]; //choosed difficulty unsigned char ch_diff = 0; //already choosed? while (ch_diff == 0) //if not choosed -> ask { printf("difficulty:"); fgets( en_diff,BUFSIZ,stdin ); if( strstr(en_diff,"?")==en_diff ) { printf("beginner - veteran - elite\n\n"); } else { printf("Invalid input. Try ? for possible answers.\n\n"); } } }
-
Super
danke!
hab es jetzt so gemacht:
#include <cstdlib> #include <cstdio> #include <cstring> using namespace std; /* * */ void StartGame() { char en_diff[BUFSIZ]; //choosed difficulty int ch_diff = 0; //already choosed? while (ch_diff == 0) //if not choosed -> ask { printf("difficulty:"); fgets( en_diff,BUFSIZ,stdin ); if (strstr(en_diff,"?")==en_diff) { printf("easy - veteran - elite\n\n"); } else if (strstr(en_diff,"easy")==en_diff) { ch_diff = 1; } else if (strstr(en_diff,"veteran")==en_diff) { ch_diff = 2; } else if (strstr(en_diff,"elite")==en_diff) { ch_diff = 3; } else { printf("Invalid input. Try ? for possible answers.\n\n"); } } }
-
Dir sollte klar sein, dass du auf diese Art nicht auf Gleichheit der Strings prüfst, sondern darauf, ob sie mit einem bestimmten String anfangen. Wenn dir jemand etwa "elite ist nicht, was ich will" eingibt, wird das Programm auf die Art so handeln, als wäre "elite" eingegeben worden.
Sinnvoller (auch performanter) ist, was SeppJ vorschlägt: strcmp.
if(0 == strcmp(en_diff, "easy")) { /* ... */ } /* etc. */
-
Nachtrag: Wenn du das mit fgets einliest, ist der Zeilenumbruch noch im String. D.h.
if(0 == strcmp(en_diff, "easy\n")) { /* ... */ } /* etc. */
Mea culpa.
-
Irgendwas läuft hier im Thread schief. Was will der TE nun für eine Sprache programmieren?
- C++/CLI ?
- C++ ?
- C ?Er programmiert offensichtlich mit einen C++ Compiler C, erwähnt CLI im ersten Post. Also bitte erstmal klar stellen, was dieser nun wirklich will! Weil momentan sieht der von ihm zuletzt gepostete Code wie sehr schlechtes C++ aus.
-
Ich nehme an, dass CLI hier im (älteren) Sinn von "command line interface" gemeint ist, nicht im .net-Zusammenhang. C++ sehe ich darin nicht (bool ist seit C99 in stdbool.h vorhanden).
-
seldon schrieb:
Ich nehme an, dass CLI hier im (älteren) Sinn von "command line interface" gemeint ist, nicht im .net-Zusammenhang. C++ sehe ich darin nicht (bool ist seit C99 in stdbool.h vorhanden).
Dann schaue dir die Includes an.
#include <cstdlib> #include <cstdio> #include <cstring> using namespace std;
-
Ah. Mein Fehler; ich hatte grad eben nur den ersten Beitrag nochmal überflogen.