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

Halivar

Frischling

  • »Halivar« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Leipzig

  • Private Nachricht senden

1

17.04.2015, 11:07

Listing 5.9 und mein überlaufendes Array

Hallo an alle, :)

ich arbeite mich gerade durch das Buch und brauche Hilfe.
Ich würde mich darüber freuen wenn sich jemand die Zeit nimmt und sich die Mühe macht mir das zu erklären.
Danke im Voraus.


Ich bin bei Listing 5.9 und wollte nun ein ähnliches Programm schreiben um mir den neuen Stoff zu verinnerlichen.
Mein Problem ist das, obowhl ich cin.get (Char Array, Zahl) verwende, mein Array überlaufen kann.
Auf Seite 137 wird aber erklärt, das dass durch diesen Punktoperator verhindert wird,
das der Rest abgeschnitten wird.

Gebe ich einen Namen für Spieler 1 ein der länger ist als 8 Zeichen, führt das zu einem Chaos sobald der Spieler 2 seinen Namen eingeben soll.

Hier mein Quellcode:

Quellcode

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
#include <iostream>

using namespace std;

int main()
{

    struct S_Spieler
    {
        char Name[10];
    };

    S_Spieler Spieler1;
    S_Spieler Spieler2;

    //Namen der Spieler bekommen
    //
    cout << "Spieler1 = ";
    cin.get (Spieler1.Name, 9);
    cin.ignore();

    cout << "\nSpieler2 = ";
    cin.get (Spieler2.Name, 9);
    cin.ignore();

    cout << "Name Spieler1 = " << Spieler1.Name << endl;
    cout << "Name Spieler2 = " << Spieler2.Name << endl;

    return 0;
}

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

17.04.2015, 11:29

Du liest 9 Zeichen von der Konsole ein. Wenn du aber mehr Zeichen eingibst dann müssten die restlichen Zeichen noch im Puffer sein. Das sollte bedeuten dass die bei der nächsten Eingabe mit eingelesen werden. Der Name in deinem Spieler hat jedoch die Länge 10, warum liest du dann nicht auch 10 Zeichen von der Konsole ein?
Aber allgemein, diese Char Arrays sind eigentlich veraltet. In C++ gibt es zum Beispiel std::string womit du strings einfacher handlen kannst. Das wird im Buch auch noch behandelt meine ich.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Halivar

Frischling

  • »Halivar« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Leipzig

  • Private Nachricht senden

3

17.04.2015, 12:14

Du liest 9 Zeichen von der Konsole ein. Wenn du aber mehr Zeichen eingibst dann müssten die restlichen Zeichen noch im Puffer sein. Das sollte bedeuten dass die bei der nächsten Eingabe mit eingelesen werden. Der Name in deinem Spieler hat jedoch die Länge 10, warum liest du dann nicht auch 10 Zeichen von der Konsole ein?
Im Buch steht das 1 Zeichen für die Escapesequenz \0 benötigt wird.

Aber allgemein, diese Char Arrays sind eigentlich veraltet. In C++ gibt es zum Beispiel std::string womit du strings einfacher handlen kannst. Das wird im Buch auch noch behandelt meine ich.
Ich habe tatsächlich ein Kapitel zu Strings im Buch gefunden welches erst auf Seite 299 folgt und etwas über die Probleme die bei char Arrays auftreten können schildert.
Dort wird auch angedeutet das dieser Umgang mit Strings wohl der Vergangenheit angehört,
genau werde ich das aber erst erfahren wenn ich in diesem Kapitel ankomme.

Schorsch, ich danke dir für deine schnelle Hilfe. :)
Ich werde mein Problem jetzt einfach überspringen und weiter arbeiten, vielleicht klärt sich das später mal.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

17.04.2015, 12:45

Ah du hast natürlich recht. Ich bin aus C++ ziemlich raus. Aber teste doch trotzdem einfach mal was passiert wenn du 2 char Arrays einliest wobei du mehr Zeichen eintippst als du mit get holen möchtest. Im Prinzip das was du selbst schon beschrieben hast. Und guck doch einfach mal wie die zu lange Eingabe möglicherweise die Eingabe für das zweite Array beeinflusst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

17.04.2015, 13:12

Eigentlich sollte es das gar nicht beeinflussen, denn dafür hat er ja cin.ignore. Also ich sehe das Problem jedenfalls nicht so auf die Schnelle. Bin aber auch gerade sehr in der Java-Denke ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

6

17.04.2015, 13:34

ignore erwartet als ersten Parameter die Anzahl der zu ignorierenden Zeichen bis zu einem Delimiter (2. Parameter). Der Standardwert ist 1.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

17.04.2015, 14:25

Na dann is doch klar wo das Problem liegt ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Halivar

Frischling

  • »Halivar« ist der Autor dieses Themas

Beiträge: 5

Wohnort: Leipzig

  • Private Nachricht senden

8

17.04.2015, 15:10

Danke für eure Antworten,
allerdings merke ich schnell das ich einfach noch zu unerfahren bin, um die Informationen
die sich hinter dem Link verbergen, zu begreifen.

Ich geh jetzt das Buch einfach weiter durch und werde wohl später erst begreifen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

17.04.2015, 15:49

Nochmal einfacher ausgedrückt: cin.ignore ignoriert nur ein einzelnes Zeichen. Du willst mehr. Folglich solltest Du entsprechende Parameter an cin.ignore übergeben.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige