C++ Alternative zu sprintf



  • Wie bekomme ich die folgende Zeile in C++ hin:

    sprintf(date, "%02d.%02d", T->tm_mday, T->tm_mon);
    

    Geht das irgendwie mit stringstreams???



  • #include <sstream>
    // ...
    
    std::ostringstream os;
    os << T->tm_mday << '.' << T->tm_mon;
    std::string date_string (os.str ());
    


  • Ja, ostringstream (+ <iomanip>) oder boost::format .



  • Öhm, was hast du mit <iomanip> vor?!



  • Nur mal aus Interesse: Warum suchst du denn eine andere Funktion dafür? Wenn es dir auf die Performance ankommt, machs so:

    char date[] = { (T->tm_mday/10)%10, T->tm_mday%10, '.', (T->tm_mon/10)%10, T->tm_mon%10, '\0' };
    


  • Wenn du schon so rumfrickelst, dann mach wenigstens aus den Zahlen dann auch noch Buchstaben (also +48 noch glaub ich). Vielleicht musst du dann auch noch nach char casten, aber das müsste auch so gehen.



  • .filmor schrieb:

    Öhm, was hast du mit <iomanip> vor?!

    std::setw ? std::setfill ?



  • .filmor schrieb:

    Wenn du schon so rumfrickelst, dann mach wenigstens aus den Zahlen dann auch noch Buchstaben (also +48 noch glaub ich). Vielleicht musst du dann auch noch nach char casten, aber das müsste auch so gehen.

    er hat wenigstens die führenden nullen dabei, was ja bei deinem vorschlag nicht der fall ist, oder?
    🙂



  • oss << std::setfill('0') << std::setw(2) << T->tm_mday << '.' << std::setw(2) << T->tm_mon;
    


  • BlaBlubb schrieb:

    Nur mal aus Interesse: Warum suchst du denn eine andere Funktion dafür? Wenn es dir auf die Performance ankommt, machs so:

    char date[] = { (T->tm_mday/10)%10, T->tm_mday%10, '.', (T->tm_mon/10)%10, T->tm_mon%10, '\0' };
    

    Macht doch nicht solchen Code. Das ist unlesbar. Code sollte leicht verständlich sein. Nur im aller grössten Notfall darf man solchen Schwachsinn verwenden. Vorher sollte man sich noch nicht einmal Gedanken darüber machen, wie es schneller ginge. Der beste Beweis ist, daß Deine Lösung bereits falsch ist, wie andere hier schon festgestellt haben.



  • BlaBlubb schrieb:

    Nur mal aus Interesse: Warum suchst du denn eine andere Funktion dafür? Wenn es dir auf die Performance ankommt, machs so:

    char date[] = { (T->tm_mday/10)%10, T->tm_mday%10, '.', (T->tm_mon/10)%10, T->tm_mon%10, '\0' };
    

    äh .... was soll denn das ?
    tm_mday elem (1, 31)
    => tm_mday/10 elem (0, 3) (da braucht's auch kein %10 mehr)
    => erstes Zeichen hat den ASCII-Wert zwischen 0x00 und 0x03 (kein printable dabei)

    => tm_mday%10 elem (0, 9)
    => Zweites Zeichen hat den ASCII-Wert zwischen 0x00 und 0x09 (kein printable dabei)

    tm_mday elem (1, 31)
    => tm_mday/10 elem (0, 3) (da braucht's auch kein %10 mehr)
    => erstes Zeichen hat den ASCII-Wert zwischen 0x00 und 0x03 (kein printable dabei)

    tm_mon elem (0, 11)
    => auch hier liefern die Formeln nur nonprintables ...

    Ist das wirklich das, was der OP erwartet ?
    Ist auf jeden Fall NICHT das Pendant zur sprintf()-Variante.

    EDIT: OK, habe gesehen, dass das wohl das ist, was .filmor schon erwähnte ...

    Gruß,

    Simon2.



  • BlaBlubb schrieb:

    Nur mal aus Interesse: Warum suchst du denn eine andere Funktion dafür? Wenn es dir auf die Performance ankommt, machs so:

    char date[] = { (T->tm_mday/10)%10, T->tm_mday%10, '.', (T->tm_mon/10)%10, T->tm_mon%10, '\0' };
    

    Ich kanns nicht lassen: WAS IST DAS??? 😮 HORROR!!! 👎



  • Artchi schrieb:

    Ich kanns nicht lassen: WAS IST DAS??? 😮 HORROR!!! 👎

    so musses aussehen:

    char date[] = {'0'+T->tm_day/10, '0'+T->tm_day%10, '.', '0'+T->tm_mon/10, '0'+T->tm_mon%10, 0};
    

    😉
    aber mal ehrlich, das 'sprintf' war wohl doch nicht so schlecht.



  • Alternativ: boost::format



  • Hallo,

    auf der Seite von Andrei Alexandrescu gibt es unter
    Code-> SafeFormat eine interessante Alternative

    Gruß


Anmelden zum Antworten