Zeichenketten in Klassen (keine Strings)



  • Guten Abend.
    Bei folgendem Klassenversuch macht der einfach nicht was ich will:

    #include <iostream.h>
    #include <windows>
    
    class MSGBOX
    {
    	public:
    		char msgOut[500];	
    };
    
    int main ()
    {
    	MSGBOX msg;
    
    	msg.msgOut = "Hallo, wie geht es dir.";
    
    	cout << msg.msgOut;
    	Sleep (2000);
    
    	return 0;
    }
    

    Ich möchte msgOut ausgeben lassen, aber schon beim kompilieren sagt er mir, dass Lvalue benötigt wird. Kann mir jemand helfen?

    Mfg Ominion



  • msgOut ist ein Array, dem kannst du nicht einfach per = Elemente zuweisen.
    Dazu gibt es die Funktion man: strcpy bzw. strncpy, das letztere ist in deinem Fall zu empfehlen.



  • oder verwende string statt char *. du wisrt dir viel zeit und nerven sparen 😉



  • Danke für die hilfreiche Antwort 🙂
    Gibt es vielleicht auch eine Möglichkeit, diese Funktion automatisch aufzurufen? Also so, dass ich das wie im meinem Beispiel einfach hinschreibe:

    msg.msgOut = "Hallo, wie geht es dir.";
    

    und strncpy automatisch aufgerufen wird. Geht das?

    Mfg Ominion

    PS. Ich möchte aber erstmal ohne Strings arbeiten.



  • Ominion schrieb:

    Gibt es vielleicht auch eine Möglichkeit, diese Funktion automatisch aufzurufen? Also so, dass ich das wie im meinem Beispiel einfach hinschreibe:

    msg.msgOut = "Hallo, wie geht es dir.";
    

    und strncpy automatisch aufgerufen wird. Geht das?

    Nein, dann musst du schon eine Klasse erstellen, die den op= definiert...
    oder du verwendest gleich std::string 😉



  • Naja, das kriege ich so schnell wohl noch nicht hin. Aber ich habe jetzt eine Funktion eingebaut, in der als Parameter die Zeichenkette übergeben wird, und dann über strncpy() in msgOut eingetragen wird. Das klappt wunderbar 🙂

    Mfg Ominion



  • #include <iostream.h> 
    #include <windows> 
    
    class MSGBOX 
    { 
        public: 
            char msgOut[500];    
    }; 
    
    int main () 
    { 
        MSGBOX msg; 
    
        msg.msgOut = "Hallo, wie geht es dir."; 
    
        cout << &(msg.msgOut); 
        Sleep (2000); 
    
        return 0; 
    }
    

    sollte so funktionieren..
    Es ist so, dass als eine Zeichenkette wird beim cout nur ein (char*) verstanden, und kein (char[]). Das ist übrigens auch gut so, denn sonst hättest du die restlichen (nicht definierten chars) auch in output - also eine menge müll.



  • Maverick89 schrieb:

    #include <iostream.h> 
    #include <windows> 
    
    class MSGBOX 
    { 
        public: 
            char msgOut[500];    
    }; 
    
    int main () 
    { 
        MSGBOX msg; 
    
        msg.msgOut = "Hallo, wie geht es dir."; 
    
        cout << &(msg.msgOut); 
        Sleep (2000); 
    
        return 0; 
    }
    

    sollte so funktionieren..

    nein. Wird es nicht, du kannst einem c-string nicht mit dem =op eine Zeichenkette zuweisen! Dazu MUSS str[n]cpy verwendet werden.

    Abgesehen davon: Hört auf iostream.h zu schreiben und verwendet folgendes:

    #include <iostream>
    
    using namespace std;
    

    MfG

    GPC



  • hm, da ist die frage in welcher Zeile das war. Also in BCB2006 geht das.



  • Maverick89 schrieb:

    hm, da ist die frage in welcher Zeile das war. Also in BCB2006 geht das.

    Ob er's kompiliert, oder ob's auch korrekt funktioniert ist eine andere Frage. Sollte es doch funktionieren, ist das (a) Zufall oder (b) der gute Wille, der auch zufällig, von deinem Compiler gezeigt wird.

    Auf jeden Fall wird es früher oder später crashen.

    MfG

    GPC



  • Was macht da #include<windows>?????



  • GPC schrieb:

    Abgesehen davon: Hört auf iostream.h zu schreiben und verwendet folgendes:

    Das war und ist auch erstmal nur quick'n dirty. Ich weiß, dass das zwar so nicht den Standards entspricht, aber ich wollte erstmal testen, was mit einer Klasse geht, und was nicht.
    @nerko: Man braucht diesen Header um Sleep() benutzen zu können.

    Mfg Ominion



  • Maverick89 schrieb:

    Es ist so, dass als eine Zeichenkette wird beim cout nur ein (char*) verstanden, und kein (char[]). Das ist übrigens auch gut so, denn sonst hättest du die restlichen (nicht definierten chars) auch in output - also eine menge müll.

    Unfug. Ob char* oder char[] spielt für cout keine Rolle. Das wird _immer_ als C-String interpretiert und damit steht die Vorgehensweise fest: Nullzeichen suchen und fertig.


Anmelden zum Antworten