char-array einer variablen zuweisen



  • Hi Leute
    Ich komme aus der C#-Ecke und muss zugeben, dass ich das Prinzip von char-Arrays und Pointern noch nicht ganz verstanden habe. Da Google und die Board-Suche mir noch nicht weitergeholfen hat, versuch ich mal, mein Problem direkt zu posten:

    Ich habe eine Klasse geschrieben, die mir alle wichtigen Systeminformationen ausgibt. Dafür werden im Konstruktor die Standardfunktionen wie uname oder getpwent ausgeführt und die Ergebnisse in öffentlichen Variablen gespeichert, über die ich dann in der Instanz der Klasse zugreifen kann.
    Die uname-Funktion z.b. gibt das Ergebnis allerdings als char-Array zurück.
    Nun kriege ich es partout nicht hin, eine Variable zu deklarieren, die den Rückgabewert der Funktion aufnehmen kann. Folgendes habe ich schon versucht:

    char* hostname;

    System::System()
    {
    utsname u;
    uname(&u);
    hostname=u.sysname;
    }
    Da kam nur Binärsalat heraus.

    char hostname[65];

    System::System()
    {
    utsname u;
    uname(&u);
    hostname=u.sysname;
    }
    Da sagte mir der Compiler: invalid array assignment

    char *hostname;

    System::System()
    {
    utsname u;
    uname(&u);
    hostname=&u.sysname;
    }
    Auch das fand ich gar nicht so unlogisch. Gcc belehrte mich aber eines besseren:
    cannot convert ‘char ()[65]’ to ‘char’ in assignment

    Ich hoffe doch, dass in diesem Board nicht nur solche .NET-Weichlinge wie ich rumlaufen, und jemand eine Lösung hat.



  • In C# würdest du doch auch die String-Klasse benutzen, also nimm in C++ std::string (#include <string>).



  • Ehm was ist denn utsname für die Klasse/Struct/Datentyp und was ist uname für eine Funktion? Kommt darauf an was die dir zurück gibt ... Sicherheitshalber immer kopieren:

    #if !defined(SYSTEM_H__INCLUDED) // Include-Guard #01
    #define SYSTEM_H__INCLUDED
    
    #if (_MSC_VER >= 1300) // Include-Guard #02
    #pragma once
    #endif // (_MSC_VER >= 1300)
    
    class System
    {
        char* m_hostname; // private!
    
    public:
        System(); // { c-tor }
        System(System const&); // { copy-c-tor }
        System& operator=(System const&); // Zuweisungsoperator
        virtual ~System(); // { d-tor }
    };
    
    #endif // SYSTEM_H__INCLUDED // End of Include-Guard #01
    
    #include <cstring>
    #include "System.h"
    
    System::System()
    {
        utsname u;
        uname(&u); 
        m_hostname = new char[std::strlen(u.sysname) + 1];
        std::strcpy(m_hostname, u.sysname);
    }
    
    System::System(System const& rhs)
    {
        m_hostname = new char[std::strlen(rhs.m_hostname) + 1];
        std::strcpy(m_hostname, rhs.m_hostname);
    }
    
    System& System::operator=(System const& rhs)
    {
        delete [] m_hostname;
        m_hostname = new char[std::strlen(rhs.m_hostname) + 1];
        std::strcpy(m_hostname, rhs.m_hostname);
    }
    
    System::~System()
    {
        delete [] m_hostname;
    }
    

    ...



  • Na (D)Evil, seit wann gibst du dich denn mit C-Strings ab? 😉

    Und man sollte vielleicht den Kopierkonstruktor überschreiben, sonst wird der char*-Zeiger ja einfach übernommen, delete[] dürfte dann in die Hose gehen, das gleiche mit dem Zuweisungs-Operator..



  • Na (D)Evil, seit wann gibst du dich denn mit C-Strings ab? 😉

    Ich schon immer 😛 Das war (mir ist der Nick-Name entfallen) so nen anderer 😛

    Und man sollte vielleicht den Kopierkonstruktor überschreiben, sonst wird der char*-Zeiger ja einfach übernommen, delete[] dürfte dann in die Hose gehen, das gleiche mit dem Zuweisungs-Operator ...

    Werde es kurz reinpacken ... wait 😛



  • Ja, das hatte ich schon versucht, aber aus Deinem Beitrag habe ich auch schon meinen Fehler gesehen.
    Meine Headerdatei sah folgendermaßen aus:
    #ifndef SYSTEM_H_
    #define SYSTEM_H_

    #include <string>

    class System
    {
    public:
    System();
    virtual ~System();
    int uid;
    int guid;
    void getlocaluser();
    string hostname;
    };

    #endif /*SYSTEM_H_*/

    Da sagte mir der Compiler, String does not name a Type.

    Ich hatte vergessen, den STD-Namespace einzubinden.
    Jetzt gehts, danke



  • Ehm auch da:

    #if !defined(SYSTEM_H__INCLUDED)
    #define SYSTEM_H__INCLUDED
    
    #if (_MSC_VER >= 1300)
    #pragma once
    #endif // (_MSC_VER >= 1300)
    
    #include <string>
    
    class System
    {
    public:
        System();
        virtual ~System();
    
    public:
        void getlocaluser();
    
    private:
        int m_uid;
        int m_guid;
        std::string m_hostname;
    };
    
    #endif // SYSTEM_H__INCLUDED
    

    ... nen bissel Ordnung usw ;P


Anmelden zum Antworten