Einfaches Char-Array Problem



  • Hallo zusammen,

    wie man sehen kann, bin ich totaler C++ Neuling und arbeite mich gerade erst ein. Ich hoffe, ich habe die richtige Forenkategorie erwischt ^^;

    Mein Problem ist, dass ich auf meinen Code folgende Fehlermeldung bekomme und nicht sehe, was ich falsch gemacht habe:

    error C2059: Syntaxfehler: ']'
    

    Hier mein Code:

    #include <iostream>
    
    using namespace std;
    
    	struct Kunde
    	{
    		int astr;
    		char aname[30];
    	};
    
    int main ()
    {
    	Kunde Kunde1;
    
    	Kunde1.aname[] = "Testy";
    	Kunde1.astr = 30;
    
    	cout << "Name: "  << Kunde1.aname << endl;
    
    	return 0;
    }
    

    Vielen herzlichen Dank für alle Hilfestellungen 🙂



  • Seltsam, da sollte schon in Zeile 15 dabeistehen.

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    struct Kunde
    {
        int astr;
        char aname[30];
    };
    
    int main ()
    {
        Kunde Kunde1;
    
        strcpy(Kunde1.aname, "Testy");  // <----- so sollte es gehen
        Kunde1.astr = 30;
    
        cout << "Name: "  << Kunde1.aname << endl;
    
        return 0;
    }
    

    Ich hoffe, ich habe die richtige Forenkategorie erwischt

    Hättest du ruhig nach C++ posten können.



  • Oh, okay, werde ich in Zukunft machen. Danke für den Hinweis 🙂

    Kann ich den Workaround mit #include <cstring> irgendwie umgehen ?

    Ich möchte mit so wenig wie möglich Ressourcen auskommen und mir das direkt angewöhnen.

    In meinem Buch wird die Aufgabe wie folgt beschrieben:

    #include <iostream>
    
    using namespace std;
    
    //Structure
    struct Kunde
    {
    	char Name[30];
    	int Alter;
    }
    
    // Functions
    Userfrage (Kunde *pKunde);
    
    // Main
    int main()
    {
    	Kunde Kunde1;
    
    	Kunde1.Name[0] = '\0';
    	Kunde1.Alter = 30;
    
    	Userfrage (&Kunde1);
    
    	cout << "Kunde: " << Kunde1.Name << endl;
    
    	return 0;
    
    }
    
    // Userfrage
    Userfrage (Kudne *pKunde)
    {
    	cout << "Name des Kunden:\n";
    	cin.get (pKunde->Name,29);
    }
    

    Ich wollte jetzt ausprobieren, wie ich default-Werte für ein Char-Array definieren kann, dass in struct deklariert wurde. Das muss doch irgendwie gehn ohne ne andere lib einzubinden, oder nicht ? 😕



  • Kann ich den Workaround mit #include <cstring> irgendwie umgehen ?

    C++ hat eine eigene String-Klasse, die spielt auch gut mit den iostreams
    zusammen. Damit kann man auch jederzeit sagen ein_string = "Peter".

    wie ich default-Werte für ein Char-Array definieren kann, dass in struct deklariert wurde

    An Arrays darf man keine Werte zuweisen.
    Ausnahme ist die Initialisierung, die sieht wie eine Zuweisung aus:

    struct Kunde
    {
        /* die Kurzfassung für Arrays von char */
        char Name[30] = "Peter";
        /* die ausführliche Schreibweise für alle Arrays - bedeutet genau das gleiche */
        char Name2[30] = {'P', 'e', 't', 'e', 'r', '\0'};
        int Alter;
    }
    


  • Ich möchte mit so wenig wie möglich Ressourcen auskommen

    Die kann man aber nicht so einfach an den Headern messen.
    Da stehen nämlich nur Makros und Funktionsdeklarationen drinnen.

    Tatsächlich sind die "Ressourcen" in den Bibliotheken, das sind die
    Files, die enden auf: .lib oder .a oder .so oder .dll oder ...



  • für zeichenketten nimm wie gesagt, immer std::string und nicht char* bzw. char[], außer du musst unbeindgt (merkst du dann schon, wenns nötig ist).
    Das ginge dann so:

    #include <string>
    
    struct Kunde
    {
      std::string name;
      int xyz;
    }
    
    int main()
    {
      Kunde k;
      k.name = "Peter";
      return 0;
    }
    


  • hum...

    Also ich hab wie du in struct die Variable aname mit "Peter" definiert, wobei ich allerdings glaube gelesen zu haben, dass in struct keine Definitionen vorgenommen werden sollen/können/dürfen, sondern lediglich die Deklaration stattfinden darf.

    Zudem bekomme ich folgenden Fehler:

    error C2864: "kunde::aname": Nur statische konstante integrale Datenmember können innerhalb einer Klasse initialisiert werden.
    

    ... scheint nicht zu funktionieren. Übrigens, mit strcpy gehts, aber ist ja nicht das angepeilte Ziel.

    flamer schrieb:

    An Arrays darf man keine Werte zuweisen.
    Ausnahme ist die Initialisierung, die sieht wie eine Zuweisung aus:

    Das irritiert mich jetzt etwas 😕 Ich muss doch ein Array zu jeder Zeit definieren können oO Warum sollte ich das nicht dürfen ? Oder wie meinst du das ?

    Es ist mir klar, dass ein String quasi ein Char-Array ist. Aber mir gehts explizit um die Definition eines solchen. Wenn ich z.b. ein mehrdimensionales Char-Array habe, in dem ich Buchstaben für z.b. Rot13 speichere, dann muss ich die auch irgendwo definieren.

    Die Workarounds in allen ehren, find ich ja auch super - Aber es bleibt meine offene Frage:

    Wie kann ich ein mittels struct deklariertes Char-Array in der main Funktion definieren ?



  • Also erstmal:
    C und C++ mischen kann verwirren.
    Das ganze in C:

    #include <stdio.h>
    
    typedef struct kunde {
        char buf[30] = "Peter";   // das ist nicht erlaubt -- wieder was gelernt
    } kunde_t;
    
    char buf[30] = "Peter";   // das ist erlaubt
    
    int main(int ac, char **av)
    {
        kunde_t k;
        printf(k.buf);
        printf(buf);
        return 1;
    }
    

    Also ich hab wie du in struct die Variable aname mit "Peter" definiert, wobei ich allerdings glaube gelesen zu haben, dass in struct keine Definitionen vorgenommen werden sollen/können/dürfen, sondern lediglich die Deklaration stattfinden darf.

    Das dürfte also stimmen.
    Es ist aber in C und C++ jedenfalls so, daß man einem Array keinen Wert zuweisen kann.
    Im Slang heißt das: ein Array ist nicht lvalue.

    Es ist mir klar, dass ein String quasi ein Char-Array ist.

    Nicht nur quasi, sondern: exakt.

    Wenn ich z.b. ein mehrdimensionales Char-Array habe, in dem ich Buchstaben für z.b. Rot13 speichere, dann muss ich die auch irgendwo definieren.

    Logisch.
    Aber scheinbar darf man das in Struktur-Vereinbarungen nicht machen.
    Keine Ahnung, warum, aber es wird schon irgendeinen Sinn haben.
    Überall anders kann man deklarieren und definieren in einem Zug.
    (siehe oben Zeile 7)

    Mir fällt leider nichts anderes ein, als strcpy oder memcpy zu verwenden.
    Das ist aber in C ganz normal, für sowas Funktionen zu verwenden;
    man kann zB auch nicht fragen: ein_string == "Peter".
    Die C++ Klassen bauen sowas nach, aber dazu kann ich nicht viel sagen,
    weil ich nicht viel von C++ verstehe.


Anmelden zum Antworten