int nach char[] konvertieren und ausgeben, dynamisch



  • Hallo,

    ich möchte eine Integer Zahl ausgeben, und muß sie deshalb nach in ein char Array konvertieren, es funktioniert auch, jedoch leider nicht dynamisch.

    der Code schaut so aus:

    int zahl = 1234;
    int laenge = static_cast<int>(log10(zahl)) + 1;
    char str[laenge];
    itoa(zahl, str, 10);
    
    TextOut(hDC, iXPos, iYPos, str, laenge);
    

    das Problem ist, dass der Compiler eine feste Länge des Arrays erwartet,
    gibt es irgendeine Möglichkeit die Variable char str[] dynamisch zu erstellen?



  • "new"
    dann aber aufräumen mit "delete" nicht vergessen ⚠

    char* pString; //zeiger auf den c_style_string-dings
    size_t laenge=123; //typ !!!size_t!!! oder zumindest irgendetwas "unsigned"
    pString=new char[laenge]; //alloziert dynamisch speicher aufm heap
    
    //irgendwas mitm string tun...
    
    delete[] pString;//aufräumen
    

    oder wenn wir schon im c++ forum sind: "string" nehmen, gibt es schon fertiggebacken in der STL, musst nur in der mikrowelle aufwärmen 😉



  • ok danke,
    jetzt hab ich nur das Problem, dass die Länge um 1 größer sein muß als die Zahl,
    ansonsten wird das Programm zwar kompiliert, aber beim Ausführen kommt eine Fehlermeldung, DAMAGAE: after normal Block (#47)

    also bspw. bei:

    int zahl = 1234
    size_t laenge = 4; //mit 5 klappt's
    


  • das ist kein "problem" das ist einfach so. Denn c-style-strings werden mit einem '\0' terminiert, was soviel wie "ende der zeichenfolge" bedeutet. Nur wenn du deine zeichenkette einfach so hinschreibst, siehst du das zeichen nicht, es muss aber da sein. => immer ein zeichen mehr reservieren. Oder gleich platz für 16 zeichen reservieren, über die vier-milliarden wirst du eh nicht kommen, soviel kann dein rechner gar nicht rechnen. Und das bissl speicherplatz interessiert eh keinen. Die log() funktion dagegen ist der absolute performance-killer. Voll übertrieben und unnötig.



  • Jimmy23 schrieb:

    Hallo,

    ich möchte eine Integer Zahl ausgeben, und muß sie deshalb nach in ein char Array konvertieren, es funktioniert auch, jedoch leider nicht dynamisch.

    der Code schaut so aus:

    int zahl = 1234;
    int laenge = static_cast<int>(log10(zahl)) + 1;
    char str[laenge];
    itoa(zahl, str, 10);
    
    TextOut(hDC, iXPos, iYPos, str, laenge);
    

    das Problem ist, dass der Compiler eine feste Länge des Arrays erwartet,
    gibt es irgendeine Möglichkeit die Variable char str[] dynamisch zu erstellen?

    Nimm doch C++:

    #include <sstream>
    ...
       int zahl = 1234;
       std::ostringstream ost;
       ost << zahl;
       // falls TextOut ein char const* reicht:
       TextOut(hDC, iXPos, iYPos, ost.str().c_str(), ost.str().length());
    

    Kein Gefummel mehr mit \0 oder new o.ä. und außerdem hat ostringstream noch viele nette "Formatierer" und kann mindestens soviel wie printf() ..

    Falls TextOut() einen "echte char*" braucht (also in den auch schreiben will), musst Du halt ein geeignete char-Array anlegen und kopieren:

    std::ostringstream ost;
       ost << zahl;
       char* c_copy = new char [ost.str().length()+1];
       std::copy(ost.str().begin(), ost.str().end(), c_copy);
    
       // falls TextOut auch schreiben will :
       TextOut(hDC, iXPos, iYPos, c_copy, ost.str().length());
       // hier must Du das verändert Ergebnis noch irgendwie übernehmen
    
       // ... und nach Gebrauch wieder löschen
       delete[] c_copy;
    

    Ist nicht so schön, liegt aber halt am Entwurf von TextOut().... (wie gesagt: falls ein char const * nicht reicht).

    Gruß,

    Simon2.



  • werd ich gleich mal ausprobiern,
    danke für die Antworten...



  • copy liegt auch im std namespace @Simon2 und c(das ich nicht finden konnte) zu löschen ist ja nett ... aber c_copy muss auch weg ^^



  • Danke für's debugging !

    Gruß,

    Simon2.


Anmelden zum Antworten