Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

1

26.02.2011, 22:43

cin und cin.get wird übersprungen

hallo, mir isses ja schon fast peinlich bei so einfachen codes nicht weiterzuwissen, aber ich komm einfach nicht drauf.
es sollte eig nur ne kleine übung sein zum thema switch, if, else if, cin und cout. ist also nichts was etwas bestimmtes darstellen soll.

soweit sogut. compiler gibt keine fehler aus. der switch und die if-bedingungen funktionieren einwandfrei ABER, wenn der code zum punkt "//training" kommt wird auf keine eingabe beim namen und der dauer gewartet. es wird alles angezeigt aber so weiterverfahren wenn die eigaben " " wären.
kA wieso. wenn ich das ganze ab "//training" vor den switch setzte funktionierts einwandfrei, nur sobald der block erst nach dem ganzen if-gedöns kommt überspringt er die eingaben einfach :(

bitte im code keinen sinn oder besonderen background suchen, wie gesagt, nur ne simple übung

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>

using namespace std;

int main ()
{
    
    unsigned int x_Position, y_Position, z_Position; //unsigned=ohne vorzeichen
    int ausdauer = 100;
    float gegner_dps = 2.5;  
    float dauer; 
    const int anzahl_level = 10; 
    char name[9];
    int spieleranzahl;
    char modus;
    char start; 

    x_Position = 50;
    y_Position = 50;
    z_Position = 50;

startwahl:
    cout << "(I)ntro, (S)pielen, (O)ptionen, (B)eenden: ";
    cin >> start;

    switch (start)
    {
        case ('i'):
        case ('I'):
        {
            cout << "Intro wird abgespielt" << endl;
        } break;

        case ('s'):
        case ('S'):
        {
            cout << "Spiel wird gestartet" << endl;
        } break;
        
        case ('o'):
        case ('O'):
        {
            cout << "Optionen werden angezeigt" << endl;
        } break;

        case ('b'):
        case ('B'):
        {
            cout << "Spiel wird beendet" << endl;
        } break;

        default:
        {
            cout << "Eingabefehler!";
            goto startwahl;
        }
    }

spielerwahl:
    cout << "Spieleranzahl:" << endl;
    cin >> spieleranzahl;

    if ( spieleranzahl == 0 )
    {
        cout << "Eingabe falsch" << endl;
        goto spielerwahl;
    }

    else if ( spieleranzahl == 1 )
    {
        cout << "Willkommen im Einzelspielermodus" << endl;
    }

    else
moduswahl:
    {
        cout << "Willkommen im Multiplayermodus" << endl;
        cout << "(J)Jeder gegen Jeden oder (T)Teamspiel?" << endl;
        cin >> modus;

        if ( (modus == 'j') || (modus == 'J') )
        {
            cout << "\"Jeder gegen Jeden\" gewählt" << endl;
        }

        else if ( (modus == 't') || (modus == 'T') )
        {
            cout << "\"Teamspiel\" gewählt" << endl;
        }

        else
        {
            cout << "Fehler in der Eingabe!" << endl;
            goto moduswahl;
        }
    }


    //training
    cout << "Du befindest dich derzeit hier: x" << x_Position << "|y" << y_Position << "|z" << z_Position << "\n \n";
    cout << "Wie heist dein Charakter? (Maximal 8 Zeichen)" << endl;
    cin.get (name, 8);

trainingsdauer:
    cout << name << " hat zu Beginn des Trainings " << ausdauer << " Ausdauer." << endl;
    cout << "Pro Minute verlierst du 2 Ausdauer. Wie lange willst du trainieren? \n";
    cin >> dauer;

    //Berechnung
    if ( (ausdauer - dauer * 2) < 0)
    {
        cout << "So lange kannst du nicht trainieren! Wähle eine kürzere Dauer!" << endl;
        goto trainingsdauer;
    }
    else
    {
        ausdauer = static_cast<int> (ausdauer - dauer * 2); //anstatt ausdauer = ausdauer - dauer * 2  um float-int konflikte zu vermeiden
    }


    //Endbericht
    cout << "Am Ende des Trainings, nach " << dauer << " Minuten, hast du noch " << ausdauer << " Ausdauer. \n \n";
    
    //Erholung
    ausdauer += 20;

    cout << "Nach einer kurzen Pause hast du wieder " << ausdauer << " Ausdauer. \n \n";

    return 0;
}


ich hoffe ich konnte den fehler gut genug beschreiben und wie gesagt, ist eigentlich was ganz einfaches, und trotzdem klappts iwie nicht so wies is

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Wirago« (26.02.2011, 22:54)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

26.02.2011, 23:18

Kanns sein dass du irgendwo etwas eingibst was nicht dem mit cin >> eingelesenen Typ entspricht (z.B. asdf wo eigentlich ein int erwartet würde)? In dem Fall würde nämlich das failbit von cin gesetzt was dazu führt dass alle darauf folgenden Operationen leise fehlschlagen. Check also mal ob an der Stelle wo was "übersprungen" wird cin.fail() true liefert ;)

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

3

26.02.2011, 23:28

also die zuordnung int<->char stimmt eigentlich. wenn ich "cin.get (name, 8);" liefert er bei "cout << name" ein kryptisches iwas, lässt mich aber beim nächsten "cin >> dauer" etwas eingeben. also scheints iwie am "cin.get (name, 8)" zu scheitern :|

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

26.02.2011, 23:32

Wie siehts mit cin.fail() aus?

5

26.02.2011, 23:35

Hallo!

So weit ich mich da erinner kann, brauchst du vor dem cin.get() noch ein cin.ignore().

C-/C++-Quelltext

1
2
cin.ignore();
cin.get(...);

Sollte dein problem lösen ;)

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

6

26.02.2011, 23:39

Hallo!

So weit ich mich da erinner kann, brauchst du vor dem cin.get() noch ein cin.ignore().

C-/C++-Quelltext

1
2
cin.ignore();
cin.get(...);

Sollte dein problem lösen ;)
hey... 100 punkte. klappt jetzt wunderbar, danke :D

so, und jetzt rein zum verständnins, wieso brauch ich da jetzt ein cin.ignore() ? :wacko:

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

7

27.02.2011, 00:16

Weil aus irgendwelchen Gründen oft schon Zeichen im Eingabepuffer liegen, die von cin.get() als eine Eingabe behandelt werden. Also cin.get() liest die Zeichen, die sich im Eingabepuffer befinden und denkt, dass du sie eingegeben hast. cin.ignore() löscht den Eingabepuffer.

Wirago

Alter Hase

  • »Wirago« ist der Autor dieses Themas

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

8

27.02.2011, 00:23

hm...eig einleuchtend ^^
danke für die hilfe :)

Werbeanzeige