char to char[20], char to char *



  • Hallo!
    Also, ich als Neuling in der C++ Welt komme da noch nicht wirklich ganz klar:
    Ich habe mir eine Klasse geschrieben, will einer Variable dieser Klasse per Konstruktor einen Wert zuweisen, im Konstruktor noch den Wert ausgeben.
    Dann möchte ich noch dass die Klasse eine Methode mit der man an einen String die Zeichenfolge "HeHe" anhängt.
    Ansich kein Problem, nur verstehe ich das mit den char´s noch nicht.

    Deswegen eine grundlegene Frage: Gibt es Strings? Oder werden die durch Charakter-Arrays ersetzt? Wenn ja wie arbeite ich mit diesen Arrays?

    Hier mal meine Klasse:

    class TestKlasse
    {
         public:
         TestKlasse (char KonstEingabe)
         {
              this->Variable KonstEingabe;
              this->Ausgabe2();
         }
    
         char Ausgabe (char Eingabe)
         {
              return sprintf(Eingabe, "HeHe\n");
         }
    
         char Ausgabe2 ()
         {
              return this->Variable;
         }
         private:
         char Variable;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
         TestKlasse Schurl("Erster Text");
         Schurl.Ausgabe("Ich bin der Schurl!");
         return 0;
    }
    

    So, ansich nicht allzuschwer das Programm, aber ich bekomme eben folgende Fehler:

    cannot convert parameter 1 from 'char' to 'char *' (In der Zeile mit sprintf)
    cannot conver parameter 1 from 'const char [25]' to 'char' (In der Zeile mit ("Ich bin ein Konstruktor"))

    Eine kleine Erklärung würde mir reichen, vielen Dank!

    Schöne Grüße, Steve! 🤡



  • ich würd das so machen:

    char* Ausgabe (char* Eingabe)
         {
              Eingabe=strcat(Eingabe,"HeHe\n");  //hängt string an string (char)
              return Eingabe;
         }
    

    wo bei es wirklich strings gibt!Die ich auch verwenden würde

    dann einmal paaar allgemeine sachen:

    Sollte die FUnktion Ausgabe() nicht den Text aus der Membervariblen ausgeben?
    Das This kannst eigentlich lassen!



  • Aha, es gibt also Strings. Weil unser Lehrer sagte immer
    "Nein, gibt es nicht, du muss Charakter-Arrays nehmen!"
    Und da komme ich immer durcheinander, irgendwas mit Pointern oder so.
    Aber gut, muss ich für Strings was importieren? Und kann ich die dann ganz normal benutzen?

    Danke jedenfalls! Steve! 🤡



  • #include <string>
    
    using namespace std;
    

    und die funktion mal schnell in string umgeschrieben:

    string Ausgabe (string Eingabe)
         {
              Eingabe+="HeHe\n";  //so hängt man hier an
              return Eingabe;
         }
    


  • moin.
    also dein Fehler im 1. Beispiel kommt, weil dein Argument 'Eingabe' ein char ist. Das heißt ein _einzelner_ buchstabe. und sprintf erwartet einen zeiger auf ein char, bzw. zeichenkette (also liest soviele buchstaben bis zum 0-byte ein).
    Ok vielleicht jetzt ein bischen verwirrend, aber mit einem * dahinter müsste es mehr oder weniger funktionieren.

    Für die stringklasse musst du die string.h includieren und kannst dann ganz bequem strings per "string" deklarieren und benutzen (wer hätte das gedacht ;))

    Das ist aber c++ und kein c, nicht dass ihr c lernt, dann hätte dein lehrer afaik recht.

    mfg

    -> uhhh ... war serial wohl schneller als ich 😉



  • Ui, super!
    So bin ich das eher gewöhnt, vielen Dank!
    Und in der Hilfe habe ich schon schöne Methoden dazu gefunden!
    ABER: Es geht leider noch nicht, ich habe es genau so geschrieben wie du es hast nur bekomme ich den Fehler

    error C2061: syntax error : identifier 'string'

    Wirkt so wie wenn er es nicht erkennt. Noch einen Tipp? Wäre super!

    Grüße, Steve 🤡



  • Oh, okay, habe den Fehler, ich habe über "stdafx.h" importiert und das geht nicht. Gut, jetzt geht.
    Ausser dass er mir immer abstürtzt 😞
    Und zwar dann wenn ich das neue Objekt Schurl machen will, ist da noch ein Fehler?

    Steve 🤡



  • Sir_Steve schrieb:

    Oh, okay, habe den Fehler, ich habe über "stdafx.h" importiert und das geht nicht. Gut, jetzt geht.
    Ausser dass er mir immer abstürtzt 😞
    Und zwar dann wenn ich das neue Objekt Schurl machen will, ist da noch ein Fehler?

    Steve 🤡

    zeig nochmal deine veränderte/angepasste klasse!



  • class TestKlasse
    {
         public:
         TestKlasse (string KonstEingabe)
         {
              this->Variable KonstEingabe;
              this->Ausgabe2();
         }
    
         string Ausgabe (string Eingabe)
         {
              return (Eingabe += "HeHe\n");
         }
    
         string Ausgabe2 ()
         {
              return this->Variable;
         }
         private:
         string Variable;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
         TestKlasse Schurl("Erster Text"); ''hier stürtzt er ab
         Schurl.Ausgabe("Ich bin der Schurl!");
         return 0;
    }
    


  • Das sollte nicht mal kompilieren, das kann also gar nicht abstürzen:

    this->Variable KonstEingabe;
    
    this->Variable = KonstEingabe;
    


  • schrengtoi schrieb:

    Für die stringklasse musst du die string.h includieren und kannst dann ganz bequem strings per "string" deklarieren und benutzen (wer hätte das gedacht ;))

    hmm ich denke nicht das man dafür string.h inkludieren sollte, afaik ist das eine C-Header bzw seine "c-inkludierungssyntax".. sie sollte hier cstring heissen , was aber nichts daran ändert dass es nicht der header füt den std::string ist, der heisst einfach string. cstring ist für "string(oder besser char*) "-bearbeitungsfunktionen wie strcat,strncat,strcpy..

    mfg



  • das was evilissimo geschrieben hat, wird wohl auch dein abstürzproblem sein!



  • Hehe, das Problem ist dass ich nicht auf dem Computer programmiere auf dem ich hier im forum bin, das heißt ich habe mich nur vertippt, im Programm steht es richtig.

    Sorry 4 that! 🤡



  • also bei mir gehtz so:

    class TestKlasse
    {
         public:
         TestKlasse (const string KonstEingabe)
         {
              Variable=KonstEingabe;
              Ausgabe2();
         }
    
         string Ausgabe (string Eingabe)
         {
              return (Eingabe += "HeHe\n");
         }
    
         string Ausgabe2 ()
         {
              return Variable;
         }
         private:
         string Variable;
    };
    int main(int argc, char* argv[])
    {
     TestKlasse Schurl("Erster Text"); //hier stürtzt er ab
         cout<<Schurl.Ausgabe("Ich bin der Schurl!");  //du musst den returnwert naturlich auch veratbeiten
         getch();
            return 0;
    }
    


  • Mein Programm sieht so aus, es geht immer noch nicht, es stürzt immer ab und zwar bei/nach printf("%s", Ausgabe2()).

    class TestKlasse
    {
         public:
         TestKlasse (const string KonstEingabe)
         {
              Variable = KonstEingabe;
              printf("%s", Ausgabe2()); //das hier geht nicht
         }
    
         string Ausgabe (string Eingabe)
         {
              return (Eingabe += "HeHe\n");
         }
    
         string Ausgabe2 ()
         {
              return Variable;
         }
         private:
         string Variable;
    };
    int main(int argc, char* argv[])
    {
        TestKlasse Schurl("Erster Text");
        printf("%s", Schurl.Ausgabe("Ich bin der Schurl!");    
        getch();
        return 0;
    }
    

    Aber wieso?

    Schöne Grüße, Steve 🤡



  • weiß jetzt nicht, aber bei mir gehtz ohne probleme!

    Auch das hier:

    TestKlasse (const string KonstEingabe)
         {
              Variable = KonstEingabe;
              printf("%s", Ausgabe2()); //das hier geht nicht
         }
    

    funktioniert!

    Nur du hast eine schließende Klammer vergessen hier:

    printf("%s", Schurl.Ausgabe("Ich bin der Schurl!");
    


  • Ja, die Klammer ist eh da, wie gesagt, ich bin ned auf dem PC auf dem ich programmiere. Vielleicht hilft das hier, die Fehlermeldung lautet:

    Unhandeld exception at 0x0041bb9c in Uebung1.exe: 0xC0000005: Access violation reading location 0xccccccc.

    Schöne Grüße, Stefan!



  • Sir_Steve schrieb:

    Mein Programm sieht so aus, es geht immer noch nicht, es stürzt immer ab und zwar bei/nach printf("%s", Ausgabe2()).

    public:
         TestKlasse (const string KonstEingabe)
         {
              Variable = KonstEingabe;
              printf("%s", Ausgabe2()); //das hier geht nicht
         }
    

    Ich kann mir nicht vorstellen dass das geht. Habs aber auch nicht probiert.
    printf() erwartet doch in diesem fall ein const char * in der varargs.

    printf("%s",Ausgabe2().c_str());
    

    Obwohl ich mich frage warum ihr überhaupt printf() benutzt.



  • Gut, dann eben kein printf (habe ich von meinem lehrer, und ich mag das mim formatierungsstring so sehr)

    Und mit cout geht es jetzt, vielen dank!

    Damit ist mein Problem gelöst und ich kann mich wieder meinem Programm widmen das irgendwann einmal das Microsoft Monopol zerschlagen wird, hoho!

    Schöne Grüße. Steve! 🤡



  • prolog schrieb:

    Sir_Steve schrieb:

    Mein Programm sieht so aus, es geht immer noch nicht, es stürzt immer ab und zwar bei/nach printf("%s", Ausgabe2()).

    public:
         TestKlasse (const string KonstEingabe)
         {
              Variable = KonstEingabe;
              printf("%s", Ausgabe2()); //das hier geht nicht
         }
    

    Ich kann mir nicht vorstellen dass das geht. Habs aber auch nicht probiert.
    printf() erwartet doch in diesem fall ein const char * in der varargs.

    doch geht!


Anmelden zum Antworten