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
Du kannst keine globalen Objekte erstellen, das muss in main oder einer anderen Funktion geschehen.
lg chaia
C-/C++-Quelltext |
|
1 |
cin >> cin.get (Gebiet[20].Gebietsname, 19); |
C-/C++-Quelltext |
|
1 |
cin.get (Gebiet[20].Gebietsname, 19); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
struct S_Gebiet //Struktur global { bool Besetzt; char Gebietsname[20]; }; S_Gebiet Gebiet[21]; //Struktur |
C-/C++-Quelltext |
|
1 |
cin.get (Gebiet[20].Gebietsname, 19); |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ombalat« (30.01.2011, 19:12)
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 |
int Feldbesetzen () { cout << "x-Position (1-5): \n"; cout << "y-Position (1-5): \n"; cin.get ( Gebiet.Gebietsname, 19 ); cout << "Name : "; return 0; } |
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 |
#include <iostream> using namespace std; int Spielfeld (); int Feldbesetzen (); int Felddaten (); int Löschen (); struct S_Gebiet //Struktur global { bool Besetzt; char Gebietsname[20]; }; S_Gebiet Gebiet; //Struktur int main () // Hauptprogramm { int Menü; cout << " 1 - Spielfeld anzeigen " << endl; //Menü <---- cout << " 2 - Feld besetzen " << endl; cout << " 3 - Felddaten anzeigen " << endl; cout << " 4 - Spielfeld loeschen " << endl; cout << " 5 - Programm beenden " << endl; //----> cin >> Menü; switch (Menü) //Ausgabe der Funktionen { case (1): { Spielfeld (); }break; case (2): { Feldbesetzen (); }break; case (3): { Felddaten (); }break; case (4): { Löschen (); }break; case (5): { cout << " F "; }break; default: { cout << "Falsche Eingabe\n\n"; } }while ( Menü != 'b' && Menü != 'B' ); //Beenden return 0; } int Spielfeld () { cout << "L"; return 0; } int Feldbesetzen () { cout << "x-Position (1-5): \n"; cout << "y-Position (1-5): \n"; cin.get ( Gebiet.Gebietsname, 19 ); cout << "Name : "; return 0; } int Felddaten () { cout << "L"; return 0; } int Löschen () { cout << "L"; return 0; } |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 |
int Feldbesetzen () { cout << "x-Position (1-5): \n"; cout << "y-Position (1-5): \n"; cout << "Name : "; cin.ignore(); cin.get ( Gebiet.Gebietsname, 19 ); return 0; } |
Versuchs mal mit nem cin.ignore() vor dem cin.get()
C-/C++-Quelltext
1
2
3
4
5
6
7
8
9
10
int Feldbesetzen ()
{
cout << "x-Position (1-5): \n";
cout << "y-Position (1-5): \n";
cout << "Name : ";
cin.ignore();
cin.get ( Gebiet.Gebietsname, 19 );
return 0;
}
Liebe Grüße,
Ombalat
C-/C++-Quelltext |
|
1 |
cin.ignore(); |
C-/C++-Quelltext |
|
1 |
cin.get(); |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Obstsalat« (12.06.2012, 11:48)
S4My
unregistriert
Warum das verschieden ist, ist eigentlich simpel: es sind andere Methoden .
Die einfache Verwendung von cin im Zusammenhang mit dem ">>" Operator fängt an bei einem Zeichen ungleich dem Leerzeichen zu lesen und liest bis zu einem dieser Zeichen weiter, soweit ich das in Erinnerung habe, Werte ein.
cin.get() seinerseits liest Werte bis zum folgenden ein, also dem einfachen Enter-Tastendruck.
Nun habe ich mich ein wenig schlau gemacht, fängt gut an was, wie bei den Profis , und gelesen, dass eingelesene Newline-Character( == '\n' ) im String drinbleiben.
OK, viel kam bisher noch nicht rüber, jetzt stelle man sich jedoch vor was passieren würde, wenn ich einen String habe, welcher nur aus "\n" besteht, aber Funktionen wie cin.get() eben bei diesem Zeichen den Lesevorgang beenden. Der Sinn cin.ignore()´s ist es nun eben diesen Charakter zu, naja, ignorieren, wie der Name schon vermuten lässt. Etwa so wie Pointer immer nach dem delete sicherheitshalber auf NULL gesetzt werden, damit keine Fehler auftreten.
Auf deinen Quelltext bezogen hat man dann folgende Begebenheit: Zeile 28 wird mit cin ein Wert eingelesen, der wie ich annehme durch einen Enterdruck bestätigt wird. Nun hat man also den Salat. Das Newline-Zeichen wurde gelesen und wird auch nicht gelöscht.
Was noch die Sache angeht mit der Verwendung: prinzipiell ist es so, man müsste es auch machen, also die Funktion nach bzw. zur Sicherheit vor dem "gewöhnlichen" Einlesen anwenden. Bei der Methode welche mit ">>" angesprochen wird, wird allerdings nichts gelesen ehe der String nicht komplett ist, also kann hier nicht abgebrochen werden. Wobei ich ergänzend sagen muss, letzere Aussage hat sich mein Gehirn aus dem vorhergehenden Text und meiner gefürchteten Erfahrung selbst zusammen gesponnen, also eine Vermutung .
Ich hoffe es war hilfreich!
Mlg
S4My
B) Mit der cin.get()-Funktion werden auch Leerzeichen eingelesen. Das heißtZitat
Text
Eingabe: AB CD EFGHI
Ausgabe: AB
Zahl
Eingabe: 1234 56789
Ausgabe: 1234
Soweit so schön.Zitat
Text
Eingabe: AB CD EFGHI
Ausgabe: AB CD EFGHI
Zahl
Eingabe: 1234 56789
Ausgabe: 1234 56789
S4My
unregistriert
C-/C++-Quelltext |
|
1 2 |
unsigned int blablubb = 2 ; blablubb << 2 ; |
Werbeanzeige