Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 30.11.2007, 12:07 Titel: Problem mit Variableneingabe in C++ |
|
|
Hallo, ich hoffe ich blamier mich hier nicht.
Also hab folgendes problem:
ich wollt nen menü programmieren in c++, das funktiert soweit auch schon ziemlich gut:
Code: |
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int spieler1=2,spieler2=0,eingabe;
do {
printf("Hallo!!!\n");
printf("1) Spieler 1:");
if (spieler1==0) printf ("Computer-leicht");
if (spieler1==1) printf ("Computer-mittel");
if (spieler1==2) printf ("Computer-gozu");
if (spieler1==3) printf(getenv("USERNAME"));
printf("\n");
printf("2) Spieler 2:");
if (spieler2==0) printf ("Computer-leicht");
if (spieler2==1) printf ("Computer-mittel");
if (spieler2==2) printf ("Computer-gozu");
if (spieler2==3) {printf(getenv("USERNAME"));printf("s Kumpel");}
printf("\n3) Spiel starten\n");
cin >> eingabe;
if (eingabe==3) break;
if (eingabe==1) spieler1=(spieler1+1)%4;
if (eingabe==2) spieler2=(spieler2+1)%4;
system("cls");
} while (true);
}
|
wenn ich zahlen eingeb dann funzt das programm...
aber wenn ich nen Buchstaben eingeb dann hängt sich das Programm auf... |
|
Nach oben |
|
 |
PMedia
Anmeldungsdatum: 14.08.2006 Beiträge: 2847
|
Verfasst am: 30.11.2007, 12:46 Titel: |
|
|
mhm, für Zeichen gabs doch den Datentyp Char, AFAIK. Ich weiß auch nicht ob C++ selbst Datentypen konvertiert, wie Basic, oder ob man sich darum selbst kümmern soll.
Meine C++-Kenntnisse beschränken sich aufs Lesen , sollen aber auch bald erweitert werden. |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 30.11.2007, 13:26 Titel: |
|
|
danke für deine antwort. das Prolem ist glaub ich auch dass man eigentlic
keinen Buchstaben eintippen dürfte denn eingabe ist ja ne integer Zahl.
Das ist das erste was definitiv schonmal falsch ist. Man müsste die Eingabe da auf Zahlen beschränken. |
|
Nach oben |
|
 |
Progger_X Mr. Lagg
Anmeldungsdatum: 24.11.2004 Beiträge: 784 Wohnort: Leipzig
|
Verfasst am: 30.11.2007, 14:17 Titel: |
|
|
Naja, du müsstest wahrscheinlich so was machen:
Code: |
char temp;
cin>>temp;
eingabe = atoi(temp);
|
Oder so was in der Richtung; cin Speichert in der Konsole alles, was du eingegeben hast, und schreibt es in die Variable, die du angibst; wenn das aber nicht da rein passt, überspringt es einfach das cin, und wartet so lange, bis irgendwo der variablentyp, der eingeben wurde, in eine variable passt.. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 30.11.2007, 15:28 Titel: Re: Problem mit Variableneingabe in C++ |
|
|
Code: |
if (spieler1==0) printf ("Computer-leicht");
if (spieler1==1) printf ("Computer-mittel");
if (spieler1==2) printf ("Computer-gozu");
if (spieler1==3) printf(getenv("USERNAME"));
|
urgs
Code: |
switch(spieler1){
case 0: printf("Computer-leicht"); break;
case 1: printf("Computer-mittel"); break;
case 2: printf("Computer-gozu"); break;
case 3: printf(getenv("USERNAME"));
}
|
(nein case schreibt man nicht groß, das is der code-block vom forum.. case komplett in kleinbuchstaben, genauso if) _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 30.11.2007, 16:21 Titel: |
|
|
Code: | #include <iostream>
#include <string>
#include <sstream>
int main()
{
std::string s;
std::stringstream sstream;
std::cin>>s;
sstream<<s;
if (!isdigit(sstream.peek()))
std::cout<<"Keine Zahl!"<<std::endl;
/* solltest du jetzt wieder was einlesen wollen, dann musst du den stringstream
noch leeren. also: sstream.str(""); */
return 0;
}
|
Geht den Umweg über einen String und einen Stringstream.
Peek schaut dabei nur nach dem nächsten Zeichen im Stream, legt es aber quasi wieder zurück - oder bewegt einfach den internen Zeiger nicht weiter, je nachdem, wie du's dir vorstellen möchtest.
Allerdings solltest du dich für C oder C++ entscheiden. Ein printf() gehört nicht wirklich in ein sauberes C++-Programm, und dann mixt du das auch noch mit std::cin.
Also bleib entweder bei C (dann statt <iostream> <cstdio>) und verwende printf() und scanf() oder bei C++, dann verwende aber auch std::cout zum Ausgeben.
Achja, gegen deinen If-Irrgarten solltest du allerdings wasw tun. O___O
Und mit den system()-Aufrufen würd ich auch sparsam sein - solltest du mal auf einem anderen System compilieren wollen. Könntest dir z.B. selbst was basteln, was dir je nachdem, für welches System compiliert wird (-> Präprozessor) eine eigene CLS-Variante bauen. Bei Windows kannst du's ja gleich so verwenden, unter Unix dann "clear" oder besser die Escape-Sequenz. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 30.11.2007, 22:59 Titel: |
|
|
danke für eure Antworten ich glaub das wird mir weiterhelfen
MfG |
|
Nach oben |
|
 |
Bimi
Anmeldungsdatum: 03.12.2007 Beiträge: 66
|
Verfasst am: 04.12.2007, 08:41 Titel: Re: Problem mit Variableneingabe in C++ |
|
|
MisterD hat Folgendes geschrieben: | Code: |
if (spieler1==0) printf ("Computer-leicht");
if (spieler1==1) printf ("Computer-mittel");
if (spieler1==2) printf ("Computer-gozu");
if (spieler1==3) printf(getenv("USERNAME"));
|
urgs
|
...du sprichst mir aus dem Mund...
Was das Zahlen-Crashproblem betrifft...
Von der Tastatur kommen keine Zahlen, sondern stets Zeichenfolgen und also solche sollte man sie auch behandeln. Erst im Proggi selbst wird die Zeichenfolge ausgewertet und geprüft ob der Benutzer eine Zahl eingeben hat oder nicht.
Des weiteren: Entweder gestreamte IO oder nicht, aber bitte nicht mischen. Sprich entweder printf und gets oder cin und cout.
Das Systemkommando cls ist nicht anderes als ein printf("\f"). Ein Systemkommando mit system abzusetzten ist sehr teuer und sollte daher nur gemacht werden wenn es anders nicht geht oder keinen Sinn macht. |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 04.12.2007, 18:02 Titel: |
|
|
Ich will dich nicht kritisieren, aber das wurde bisher schon genannt. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Heizi

Anmeldungsdatum: 19.01.2005 Beiträge: 309
|
Verfasst am: 04.12.2007, 20:24 Titel: |
|
|
oh da fällt mir noch nen Fehler ien : ich hab gosu falsch geschrieben wie peinlich....
das Problem ist im Übrigen jetzt gelöst danke für Eure Hilfe....
hab einfach anstatt ner int Variable nen char array genommen,so
Vergleichswerte sind dann halt in ascii also für 1 49 etc.
MfG |
|
Nach oben |
|
 |
|