sprintf in C++



  • volkard schrieb:

    asc schrieb:

    Du kennst die Regel, das man niemals im Vorfeld optimiert?

    anfängerregel.

    Man, muss ich ein Anfänger sein, nach nunmehr 20 Jahren Programmiererfahrung (und die hälfte der Zeit beruflich).

    volkard schrieb:

    da gibt es eine wichtigere regel: erhebe niemals regel zum dogma, denn das führt irgendwann zu mülligem code.

    Erlich gesagt, glaube ich nach den Antworten des heutigen Tages eher, das deine Ansätze Fehlerträchtiger sind als jede C++ Alternative sein könnte. Es gibt Regeln die aus gutem Grund existieren. Und ja, es kann in Einzelfällen sinnvoll sein eine Regel zu brechen, dies sollte aber die Ausnahme nicht die Regel sein.

    Warum schlägst du nicht gleich vor, das alle die C++ lernen lieber von vorne herein auf C umschwenken? Den genau diesen Ansatz hast du am Heutigen Tag zu genüge vertreten.

    cu André



  • sprintf schrieb:

    Ich hab 0 Plan wie ich das mit dem stringstream machen soll -.-

    das da zeigt recht fein, wie man stringstream benutzt. kurz gesagt, wenn du was nach cout ausgeben kannst, dann kannste es auch in einen string stopfen.
    http://cplus.kompf.de/artikel/stream4.html



  • volkard schrieb:

    asc schrieb:

    Du kennst die Regel, das man niemals im Vorfeld optimiert?

    anfängerregel.

    da gibt es eine wichtigere regel: erhebe niemals regel zum dogma, denn das führt irgendwann zu mülligem code.

    natürlich mache ich mir von anfang an gedanken, ob ich einen vector oder eine deque benutze. es wäre fürchterlich schwach, einfach grundsätzlich vector zu benutzen und nur wenn der profiler es fordert, sich zu überlegen, was die beste klasse dort wäre.

    Die Auswahl einer richtigen Datenstruktur fällt nicht unter premature optimization, sprintf vs. stringstream schon.



  • asc schrieb:

    Man, muss ich ein Anfänger sein, nach nunmehr 20 Jahren Programmiererfahrung (und die hälfte der Zeit beruflich).

    nee, nicht anfänger, aber jungspund.
    ich kann nichts dafür, wenn du dir nicht ausreichend gedanken über guten programmierstil machst.

    Warum schlägst du nicht gleich vor, das alle die C++ lernen lieber von vorne herein auf C umschwenken? Den genau diesen Ansatz hast du am Heutigen Tag zu genüge vertreten.

    ich hab heute nur c++ getrieben, denke ich.



  • Ähm eure Unterhaltung ist ja schön ^^

    Aber könnten wir vielleicht wieder zum Thema zurück kommen xD ?

    Hier steht:

    http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/sprintf.html

    sprintf wird verwendet, um Daten zu formatieren und in einer Zeichenkette abzulegen. Im Prinzip handelt es sich um eine Variante von printf und verwendet die gleichen Escape- und Formatierungszeichen.

    Wie kann man denn da nun z.b. auf die Zeichenkette zugreifen, irgendwie sagt mir das alles nichts -.-

    Kennt wer ein Tutorial zu dem Thema oder so ?



  • volkard schrieb:

    dooooomi schrieb:

    Und wenn man schon C-Funktionen benutzt, dann doch bitte snprintf.

    auf das n verzichte ich.
    nein, nicht, weil ich so furchtbar cool bin, sondern weil sprintf typischerweise bei sachen wie

    sprintf(filename,"song%2d.mp3",i);
    

    drankommt.

    das n bräuchte ich, wenn ich benutzereingaben hätte oder sowas, und dann möchte ich nicht, daß der benutzer beschränkt wird und nehme string und stringstream.

    Zugegeben, es gibt Fälle, wo es schlicht egal ist. Oft sind die Sachen aber bei weitem nicht so einfach, wie in deinem Beispiel. Und einige der bösesten Buffer-Overflows wurden von Programmierern geschrieben, die dachten sie wüßten, was sie tun...



  • c-fan 2009 schrieb:

    ...

    Warum verkriechst du dich nicht wieder in die C-Ecke. Das Anhängen der 2009 ändert auch nichts an deinen Äußerungen.

    sprintf mag in Teilen einfacher als stringstream zu verwenden sein, aber über die gründe warum in C++ stringstream eingeführt wurde setzt ihr euch scheinbar gerne hinweg. Und die Fehlersuche nach solchen Problemen hat mich schon mehrere Projekttage (eher Wochen) gekostet, weil irgendein Programmierer lieber die Performance als die Wartbarkeit berücksichtigt hat.

    Ja, ein Programm sollte auch Performant laufen, aber nichts desto trotz erkäuft man mit vorträglicher Optimierung meist mehr Fehler, und selten eine wirklich bessere Performance (Man liegt sehr häufig falsch mit der annahme wo Optimierungen nötig sind). Und Wartbarkeit geht auch flöten.

    cu André



  • sprintf schrieb:

    Ähm eure Unterhaltung ist ja schön ^^

    Aber könnten wir vielleicht wieder zum Thema zurück kommen xD ?

    Hier steht:

    http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/sprintf.html

    sprintf wird verwendet, um Daten zu formatieren und in einer Zeichenkette abzulegen. Im Prinzip handelt es sich um eine Variante von printf und verwendet die gleichen Escape- und Formatierungszeichen.

    Wie kann man denn da nun z.b. auf die Zeichenkette zugreifen, irgendwie sagt mir das alles nichts -.-

    Kennt wer ein Tutorial zu dem Thema oder so ?

    Zu was jetzt?



  • Hab schon was gefunden hatte da noch den Link hab nur net mehr dran gedacht gehabt _

    http://www.c-programmieren.com/C-Lernen.html#sprintf()

    Jetzt weiss ich auch glaub ich wieder wie das in C++ ging ...



  • volkard schrieb:

    nee, nicht anfänger, aber jungspund.
    ich kann nichts dafür, wenn du dir nicht ausreichend gedanken über guten programmierstil machst.

    Merkwürdig nur das viele Programmierer die ich kenne, mir genau das Gegenteil (zuviele Gedanken über guten Programmierstil) vorwerfen. Und ohne dir auf den Schlips treten zu wollen: Ich halte Herb Sutter, Scott Meyers und Co für fähiger als dich.


  • Administrator

    sprintf schrieb:

    Aber könnten wir vielleicht wieder zum Thema zurück kommen xD ?

    Unsere FAQ: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39488.html
    Hoffe das hilft weiter!

    @Volkard,
    Verwende folgende Funktion und übergib einen genügend grossen Puffer:
    http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf.html
    Viele Standardbibliothek Implementationen haben per Default keinen Puffer drin, während sie bei sprintf einen haben.

    Dann vergleiche sprintf und std::stringstream nochmals.

    Grüssli



  • volkard schrieb:

    kannst in C++ gerne sprintf verwenden. das ist oft die beste alternative.
    stringstream ist der andere weg, den man vor allem nimmt, um zu zeigen, daß man c++ kann.

    Und ich dachte immer, ich sei der einzige mit dieser Auffassung 😃

    Sicher, sprintf() ist gefährlich, sogar gleich doppelt. Aber die Stringstreams - wie überhaupt die C++-Streams - sind alles andere als ein tauglicher Ersatz für C-Funktionen: in der Theorie mögen sie effizienter sein, in der Praxis sind sie deutlich langsamer, und sie neigen dazu, eine Menge Code-Bloat zu erzeugen. Außerdem ist es ein gewaltiger PITA, einen mit Stringstreams formatierten String zu internationalisieren.

    Eine sinnvolle und typsichere Alternative zu sprintf() wäre boost::format. Es ist aber durchaus auch möglich, für die printf()- Funktionen mit C++-Mitteln Typsicherheit nachzurüsten.



  • audacia schrieb:

    Außerdem ist es ein gewaltiger PITA

    http://de.wikipedia.org/wiki/Pita 😋





  • Jetzt wo audacia schon den ersten Schritt gemacht hat, brauch ich keine angst mehr haben, dass ich von asc eine auf den Deckel kriege^^

    Ich oute mich hiermit auch mal als gelegentlicher Verwender von C-Funktionen. Aber bin ja erst knapp über ein Jahr aktiver C++ Entwickler... vorher C... *hust*


  • Administrator

    audacia schrieb:

    ... in der Praxis sind sie deutlich langsamer, ...

    Inwiefern langsamer? Testberichte? Puffer gesetzt? Oder meinst du umständlicher zu schreiben?

    audacia schrieb:

    ... und sie neigen dazu, eine Menge Code-Bloat zu erzeugen.

    Ich würde sie als "komplexer gebaut" bezeichnen. Sie bieten dafür viel mehr Möglichkeiten als nur zum Beispiel ein sprintf .
    Es kommt allerdings da auch stark auf den Kompiler drauf an, wie gut er optimieren kann.

    audacia schrieb:

    Außerdem ist es ein gewaltiger PITA, einen mit Stringstreams formatierten String zu internationalisieren.

    Würdest du mir erklären, wie die Internationalisierung mit sprintf leichter geht?
    Ich muss ehrlich gestehen, dass ich in diesen Sachen noch in den Kinderschuhen stecke, da ich oft für meine Programme eine fixe Sprache vorausgeben konnte. Aber mir kam bisher sprintf nicht leichter vor für die Internationalisierung.

    Bei beiden verwendet man Locales. Bei den C++ Locales hat man dann Möglichkeiten über Facets und co Anpassungen vorzunehmen. Keine Ahnung, wie man das in C löst. Und wie man bei sprintf zum Beispiel UTF-16 oder UTF-32 verwendet, ist mir ein Rätsel. Aber da fehlt mir wahrscheinlich auch einfach Wissen, wie gesagt, Kinderschuhen.

    Grüssli



  • Dravere schrieb:

    Würdest du mir erklären, wie die Internationalisierung mit sprintf leichter geht?

    wozu? keiner sagte, man müsse immer und unter allen umständen printf nehmen. für natürliche zahlen als teil von dateinamen verzichte ich sogar gelegentlich auf die internationalisierung.



  • volkard schrieb:

    ...

    sorry, aber dein ständiger sarkasmus und deine arroganz sind echt ätzend.
    sollte ein moderator nicht ein bisschen mehr soziale kompetenz vorweisen können?


  • Administrator

    volkard schrieb:

    Dravere schrieb:

    Würdest du mir erklären, wie die Internationalisierung mit sprintf leichter geht?

    wozu? keiner sagte, man müsse immer und unter allen umständen printf nehmen. für natürliche zahlen als teil von dateinamen verzichte ich sogar gelegentlich auf die internationalisierung.

    1. War die Frage nicht an dich gerichtet!
    2. War die Frage ernst gemeint, da ich selber hingeschrieben habe, dass mir in dem Bereich noch Wissen fehlt. Mich würde das Thema also interessieren, ich habe höflich nach Informationen gebeten.
    3. Ist deine Antwort dadurch echt ein wenig daneben!

    Grüssli



  • It0101 schrieb:

    J
    Ich oute mich hiermit auch mal als gelegentlicher Verwender von C-Funktionen.

    welch harter schlag ins gesicht derer, die jahrelang für den erhalt der guten sitten in der c++ community gekämpft haben.
    🙂


Anmelden zum Antworten