arrays komplett ausgeben



  • Hallo.
    Ich bastel gerade mit Arrays.

    z.B.

    int iNr[5];
    
    	for(int i=0; i < 5; i++)
    	{
    		cout << "Das Alter der Person Nr." <<i<<endl;
    		cin  >> iNr[i];		
    	}
    

    So klappt auch alles wunderbar.
    Der fragt mich nach und nach jede einzelne Person ab.

    Aber was ist nun wenn ich die komplette Array ausgeben will?
    Also ich dachte ich muss nur

    cout << iNr;
    

    benutzen und dann spuckt er mir alle "Array-Variabeln" aus.
    Funktioniert aber nicht. Denn gibt er mir nur irgendeinkomischen Codezahl aus: 0120023 oder so

    Hab noch ne Frage 🙂
    Gehen Arrays auch mit Zeichenketten?
    Denn wenn ich z.B.

    char spieler[5];

    benutze, erkennt er das ja nicht als array sondern erwartet einfach nur eine Zeichenkette mit 5 Buchstaben.

    Danke schonmal im Vorraus



  • So z.B.:

    std::copy( iNr, iNr+5, std::ostream_iterator<int>( std::cout, "\n" ) );
    

    Gehen Arrays auch mit Zeichenketten?
    Denn wenn ich z.B.

    char spieler[5];

    benutze, erkennt er das ja nicht als array sondern erwartet einfach nur eine Zeichenkette mit 5 Buchstaben.

    Doch das wird als Array aus chars erkannt, was ja wiederum eine Zeichenkette sein kann.



  • klaus-dieter hansen schrieb:

    Denn wenn ich z.B.

    char spieler[5];

    benutze, erkennt er das ja nicht als array sondern erwartet einfach nur eine Zeichenkette mit 5 Buchstaben.

    Danke schonmal im v******

    Vorsicht! In dieses char-Array passen nur 4 deiner Buchstaben. Das letzte Element muss eine 0 ('\0') enthalten, wenn du es als String interpretieren können willst. Die meisten Funktionen, die C-Strings/char-Arrays verarbeiten, verlassen sich auf diese terminierende Null. Ist sie nicht da, geht mit Sicherheit einiges schief...



  • klaus-dieter hansen schrieb:

    Also ich dachte ich muss nur

    cout << iNr;
    

    benutzen und dann spuckt er mir alle "Array-Variabeln" aus.
    Funktioniert aber nicht. Denn gibt er mir nur irgendeinkomischen Codezahl aus: 0120023 oder so

    Was er hier ausgibt, ist die Adresse des ersten Elements des Arrays (denn das repräsentiert der Name des Arrays ohne Index-Angabe). char-Arrays sind da ein Sonderfall, da sie als String interpretiert werden. Die gibt std::cout dann bis zur terminierenden Null aus.

    Übrigens: vorraus wird voraus geschrieben! 😉



  • Also ich habe es mal mit einer Namenarray probiert:

    char spieler[5];
    
    		for(int i=0; i < 5; i++)
    	{
    		cout << "Name der Person Nr." <<i;
    		cin.getline(spieler, i);		
    	}
    

    Hat aber nicht wirklich geklappt.

    david dein Code verwirrt mich aufm ersten Blick^^

    std::copy( iNr, iNr+5, std::ostream_iterator<int>( std::cout, "\n" ) );
    

    Also std:: kann ich weglassen, da ich "using namespace std;" benutze.
    Und was genau bedeutet std::ostream_iterator<int>?
    Würde mich freuen wenn du mir es bisschen erläutern würdest.
    Will es ja gerne nachvollziehen.

    Gibt es sonst auch noch andere Mögllichkeiten die kompletten array auszulesen?



  • klaus-dieter hansen schrieb:

    Also ich habe es mal mit einer Namenarray probiert:

    char spieler[5];
    
    		for(int i=0; i < 5; i++)
    	{
    		cout << "Name der Person Nr." <<i;
    		cin.getline(spieler, i);		
    	}
    

    Hat aber nicht wirklich geklappt.
    [/cpp]

    Du legst hier ein char-Array mit 5 Elementen an, da passt ein Name mit 4 Zeichen 'rein. Probier doch mal so:

    char spieler[5][30]; //in der Schleife an getline dann spieler[i] übergeben
    

    klaus-dieter hansen schrieb:

    Gibt es sonst auch noch andere Mögllichkeiten die kompletten array auszulesen?

    Ja, mach einfach noch eine Schleife, in der du dann nicht einliest, sondern ausgibst.

    for(int i=0; i < 5; i++)
        {
            cout << iNr[i] << endl;       
        }
    

    David_pb's Beispiel halte ich für dich erst mal für ein wenig overdosed. Dazu müsstest du dich eingehend mit der STL, den enthaltenen Algorithmen, Iteratoren usw. beschäftigen. Wenn es dich interessiert:

    http://magazin.c-plusplus.net/artikel/Aufbau der STL - Teil 1%3A Container
    http://magazin.c-plusplus.net/artikel/Aufbau der STL - Teil 2%3A Iteratoren und Algorithmen
    http://magazin.c-plusplus.net/artikel/Aufbau der STL - Teil 3%3A Hilfsklassen und Erweiterungen

    Was für dich aber auch jetzt schon sehr interessant sein könnte, ohne gleich allzu sehr in die Tiefe gehen zu müssen, ist die Klasse std::string (und vielleicht std::vector, wenn du mehrere Strings in einer Liste halten willst).

    http://magazin.c-plusplus.net/artikel/Stringverarbeitung in CPlusPlus

    Damit gestaltet sich der Umgang mit Strings um einiges einfacher als mit char-Arrays, bei denen ja doch vieles schief gehen kann, wenn man nicht aufpasst.



  • Jap funktioniert wunderbar mit der "Schleifen-Ausgabe".
    Den String Link werde ich mir auch mal anluschern.

    Eine Verständnisfrage:

    spieler[5][30]

    Bedeutet 5 Array-Variabeln mit jeweils 29 Zeichen oder?



  • 30. In C++ ist die Gesamtanzahl. Der Bereich geht dann aber von 0 - 29. (respektive wenn du n angibst geht es bis n-1 ).


  • Mod

    klaus-dieter hansen schrieb:

    spieler[5][30]

    Das sind 5 Arrays mit jeweils 30 Einträgen. Willst du die 30 Einträge als cstring benutzen (du willst keine cstrings benutzen, glaub uns das) dann kannst du davon effektiv nur 29 für Zeichen nutzen, der letzte Eintrag muss \0 sein.

    Ich würde dir auch von mehrdimensionalen Arrays abraten, das gibt mehr Kopfschmerzen als es Wert ist. Wenn schon überhaupt Arrays, dann hast du mit spieler[5*30] weniger Probleme.



  • spieler[5*30]

    Und wo ist da der Unterschied?



  • klaus-dieter hansen schrieb:

    spieler[5*30]

    Und wo ist da der Unterschied?

    Das ist halt ein eindimensionales Array, das in einem Stück im Speicher liegt (bei mehrdimensionalen Arrays ist das glaube ich nicht garantiert). Wenn du es so machen willst, musst du mit spieler[y*breite+x] darauf zugreifen. Deine Länge ist 30, wenn du also an das dritte Zeichen des zweiten Strings 'ran willst, notierst du spieler[2*30+3].

    Aber wie schon erwähnt wurde, mach dich mal in Richtung std::string schlau. Damit ersparst du dir einiges Gehampel.

    Ganz interessant zum Thema mehrdimensionale Arrays:
    http://www.developia.de/developia/viewarticle.php?cid=19547&page=1


  • Mod

    _matze schrieb:

    klaus-dieter hansen schrieb:

    spieler[5*30]

    Und wo ist da der Unterschied?

    Das ist halt ein eindimensionales Array, das in einem Stück im Speicher liegt (bei mehrdimensionalen Arrays ist das glaube ich nicht garantiert). 1

    Die beiden sind absolut äquivalent von dem, was da im Speicher liegt (mehrdimensionale arrays sind garantiert nicht verteilt). Der wesentliche Unterschied ist, dass es kompliziert genug ist, eindimensionale Arrays im Programm herumzureichen, bei mehrdimensionalen Arrays wird es noch schlimmer.


Anmelden zum Antworten