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

do.c

Frischling

  • »do.c« ist der Autor dieses Themas
  • Private Nachricht senden

1

09.05.2011, 12:40

Problem mit Strukturen und Arrays

Hallo,

Hab jetzt das 5te Kapitel über arrays und Strukturen durch, und wollte, um bisher Gelerntes zu festigen, ein kleines Programm zur "Verwaltung" einer Dvd Sammlung schreiben.

Das Problem ist das wenn ich jetzt die Auswahl tätige "Neue DVD hinzufuegen", das Programm sich in einer Endlosschleife aufhängt.
Teilweise hatte ich sogar das Problem dass das Programm nicht einmal mehr beendet werden konnte, bzw. der Prozess.

Hier einmal der Code:

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

using namespace std;

// Hauptfunktion
int main()
{
    // Strukturen
    struct S_DVD
    {
        char Name[30];
        char Lagerort[50];
        bool bSet;              // legt fest ob die DVD bereits besetzt ist
    };
  
   

    const int Groeße=10;
    S_DVD Sammlung[Groeße];        // Sammlung bietet Platz für 10 DVDs
    int Frei; // Wieviel Dvds können noch hinzugefügt werden?

    // Für die MenueAuswahl
    int Auswahl=0;                     

    // Initialisiere Sammlung
    for(int i=0;i<Groeße;i++)
        Sammlung[i].bSet=false;


    do
    {
        // Ausgabe des Menue
        cout << ". . . DVD - Sammlung v.1.0 . . .\n\n";
        cout << "1 - Neue DVD hinzufuegen" << endl;
        cout << "2 - Sammlung anzeigen" << endl;
        cout << "3 - Programm beenden" << endl;
        cout << "Auswahl: ";
        cin >> Auswahl;
        cout << endl;

        switch(Auswahl)
        {
        // Neue DVD
        case 1:
            {
            
                  
                Frei=0;
                int Pos=0;         // Der Index des letzten freien Elements wird hier abgespeichert
                            // Alle Elemente von Sammlung werden durchlaufen
                // Es wird nach freien Plätzen gesucht
                for(int i=0;i<Groeße;i++)
               {
                                   // Element noch frei?
                   if(!Sammlung[i].bSet)
                  {
                                          // Letzter freier Platz wird genommen
                          Pos=i;
                      Frei++;
                  }
                }
                  
                cout << "\nName der DVD: ";
                cin.get(Sammlung[Pos].Name, 29);
                    
                cout << "Lagerort der DVD: ";
                cin.get(Sammlung[Pos].Lagerort, 49);
                cin.ignore(); 

                cout << "Es sind noch " << Frei << " Plaetze frei" << endl;  
              
            } break;
        
        // Sammlung anzeigen
        case 2:
            {
            } break;

        // Programm beenden
        case 3:
            {
                cout << "Programm wird beendet..." << endl;
            } break;

        default:
            cout << "Falsche Eingabe! \n";
        }
    } while(Auswahl != 3);

    return 0;
}


Ich habe bewusst auf Funktionen verzichtet da es ich es so klein wie möglich halten wollte.
Also zu diesem case-Rumpf:
Es wird innerhalb des Arrays Sammlung nach noch nicht besetzten Feldern gesucht,
Die Anzahl an freien Feldern wird analog dazu mitgezählt und der Indexwert des letzten freien Elements(was in diesem Fall 9 ist, es sind ja alle noch unbesetzt)
wird der Variable Pos zugewiesen.

Ich weiß jetzt einfach nicht was das Problem ist, eigentlich müsste es ja funktionieren? Oder vertragen sich die 2 char Variablen in der Struktur nicht? Hab ich irgendetwas nicht beachtet?

Ich habe mir testweise die Groesse von Sammlung[0].Name ausgeben lassen und die war natürlich 30;
aber als ich den String des char arrays dann ausgab also cout << Sammlung[0].Name; wurden mir viel mehr als 30 Zeichen angezeigt

Auch habe ich das array 30 mal durchlaufen lassen und Leerzeichen zugewiesen also:

C-/C++-Quelltext

1
2
3
4
5
6
for(int i=0;i<30;i++)
{
    Sammlung[0].Name[i]=' ';
}

cout << "String: " << Sammlung[0].Name<<endl;


Als Ausgabe kamen die 30 Leerzeichen und die 50 (kryptische Zeichen) des char arrays Lagerort?
Also er hat mir die nicht initialisierte Sammlung[0].Lagerort mitausgegeben;


Ich weiß jetzt echt nicht genau was ich falsch mache?
Bitte um einen Tipp :)


mfg
Daniel

Phalax

Frischling

Beiträge: 82

Beruf: Student Media Systems

  • Private Nachricht senden

2

09.05.2011, 13:38

Du musst einfach nach jeder Eingabe über die Konsole cin.ignore(); schreiben.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Phalax« (09.05.2011, 13:44)


Des

Frischling

  • Private Nachricht senden

3

09.05.2011, 14:20

versuch mal cin >> Sammlung[Pos].Name; und cin >> Sammlung[Pos].Lagerort;
dann ist bei mir keine Endlosschleife.

do.c

Frischling

  • »do.c« ist der Autor dieses Themas
  • Private Nachricht senden

4

09.05.2011, 22:52

Du musst einfach nach jeder Eingabe über die Konsole cin.ignore(); schreiben.

Warum nach jeder Eingabe?

C-/C++-Quelltext

1
2
3
cin.ignore();
cout << "\nName der DVD: "; //<< Sammlung[0].Name << "\n";
cin.get(Sammlung[i].Name, 29);


Und warum muss ich dass so machen, ich dachte cin.ignore() nur nach der Eingabe von strings? und bis zu diesem case-Block wurde ja nur ein integer-Wert eingegeben?



versuch mal cin >> Sammlung[Pos].Name; und cin >> Sammlung[Pos].Lagerort;
dann ist bei mir keine Endlosschleife.


Ja aber was ist wenn der DVD Name aus 2 Teilen besteht also z.b. "Resident Evil", dann geht es ja nicht mehr.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »do.c« (09.05.2011, 23:03)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

10.05.2011, 05:41

Für solche Fälle gibt es cin.getline und getline.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige