int nach char*



  • Hallo alle zusammen.

    Ich versuche eine Variable vom Typ int nach char* umzuwandeln. Ich habe ein paar Lösungen gefunden, würde aber gern eure Meinung hören.

    Wie würdet ihr das machen.

    Leider kann ich Strings aus std::string nicht benutzen da ich ausschließlich mit char* arbeiten muss. Alle funktionen etc. erwarten ein char*. Ständiges umwandeln von einem Typ in den anderen will ich aber vermeiden.

    Hier die erwähnten Lösungen:

    #include <sstream>
    #include <string>
    
    int main()
    {
    int some_int = 3028;
    std:stringstream sout;
    sout << some_int;
    
    std::string converted_string(sout.str());
    }
    

    The less recommended way (type safe, copying into a dynamically sized
    array):

    #include <sstream>
    #include <cstring>
    
    int main()
    {
    int some_int = 3028;
    std:stringstream sout;
    sout << some_int;
    
    char *buff = new char[sout.str().length() + 1];
    std::strcpy(buff, sout.str().c_str());
    // ... (use buff here)
    delete [] buff;
    }
    

    Also ich habe da erst an

    char *cp = reinterpret_cast<char *>(some_int);
    

    gedacht. Jedoch ist dies nicht gerade die sicherste Methode. (kann mir einererklären wieso?? )

    Wie würdet ihr ein int nach char* umwandeln??



  • Hallo,

    in der FAQ wird das ausführlich beschrieben.

    EDIT: Verflixte Rechtschreibung...

    MfG

    GPC



  • sprintf_s hilft dir.



  • Wenn du nicht auf eine C funktion zurueckgreifen willst aber
    auch keine sstreams brauchen wills (sind nicht gerade schnell),
    dann kannst du auf boost zurueckgreifen.

    Nachteil an boost ist, dass es nicht auf jedem system ist.
    Zumal musst du die Lizenz beachten.

    Gg



  • Du kannst trotzdem std::string verwenden, da std::string garantiert, dass man ganz normal mit einem char* darauf arbeiten kann.
    Ob du folgendes schreibst

    void func(char* p);
    
    int main()
    {
      char* buf = new char[ 256 ];
      func( buf );
      delete[] buf;
    };
    

    oder

    void func(char* p);
    
    int main()
    {
       std::string buf( 256, '\0' );
       func( &buf[ 0 ] );
    }
    

    ist egal, abgesehen davon, dass letzteres exception sicher ist.



  • Du kannst trotzdem std::string verwenden, da std::string garantiert, dass man ganz normal mit einem char* darauf arbeiten kann.

    Falsch!



  • xGhost schrieb:

    Wenn du nicht auf eine C funktion zurueckgreifen willst aber
    auch keine sstreams brauchen wills (sind nicht gerade schnell),
    dann kannst du auf boost zurueckgreifen.

    Nachteil an boost ist, dass es nicht auf jedem system ist.
    Zumal musst du die Lizenz beachten.

    Gg

    Falls du da an lexical_cast denkst, der wird imho intern auch mit Stringstreams implementiert.

    MfG SideWinder



  • Danke für eure Antworten.

    Ich habe es per sprintf gemacht. Ein Pufferüberlauf kann "nicht" zustandekommen da ich selbst nicht damit arbeite, oder etwas zuweise. Ich erstelle nur ein unsigned int (wo die maximale Länge bekannt ist) und wandle es in ein char* um.

    Fertig.
    Ausserdem ist alles in einem Try-Catch Block.

    Irgendwie hab ich was falsches in der Suche eingegeben.

    Mir war eure Meinung wichtig 😉



  • Croatiancow schrieb:

    Ich habe es per sprintf gemacht.
    Ausserdem ist alles in einem Try-Catch Block.

    Try-Catch haben nur mit C++ kontainer funktionen verwendung
    und nicht mit C funktionen. Somit ist das meiner
    meinung nach sinnlos. Ich lasse mich aber gerne
    eines besseren...

    Gg



  • Ist sprintf() keine C++ Funktion?

    Ich arbeite nicht mit C. Habe aber recht viele Probleme mit Strings. Daher nehm ich die char*.
    Damit hat alles funktioniert (mit Überprüfung). Ansonsten muss ich sehr viel casten / umwandeln.

    Bahala Na



  • Nö, sprintf ist eine ANSI-C Funktion. Sie steht auch im C++ Standard zur Verfügung, ist aber eher verpönt.

    Davon abgesehen dass sprintf keine Exceptions wirft, helfen Dir Exceptions nur wenn die Funktion überhaupt Exceptions werfen kann. Da sprintf einen Zeiger übergeben bekommt, dessen Länge es nicht kennt, wirst Du auch bei übelsten Bereichsüberschreitungen niemals in Deinem catch-Block landen. Das gleiche gilt für die Übereinstimmung der Formatmaske mit den übergebenen Argumenten. Es kann garnicht feststellen, ob Du genug Argumente übergibst, und ob die den richtigen Typ haben. Demnach erhälst Du auch hier keine Exceptions.

    (Deshalb ist es auch verpönt)



  • roflz schrieb:

    Du kannst trotzdem std::string verwenden, da std::string garantiert, dass man ganz normal mit einem char* darauf arbeiten kann.

    Falsch!

    stfu n4p



  • OK. 😃

    Ich hab jetzt den TryCatch Block gelöscht 🙂

    Eine Überprüfung habe ich trotzdem eingebaut. Per if-else.
    Danke für eure Hilfe.

    Grüßle


Anmelden zum Antworten