sprintf in C++



  • 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.
    🙂



  • Ist sowieso sinnlos, dass ihr euch zofft. Auch in dem anderen Thread.

    Ihr seid eben unterschiedlicher Meinung... Jeder glaubt die Wahrheit für sich gepachtet zu haben, aber wie immer liegt die wohl irgendwo dazwischen.



  • Dravere schrieb:

    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?

    Mit printf() etc. hast du in den meisten Fällen einen kompletten, zusammenhängenden String, den du als ganzes übersetzen kannst. Bei Streams ist das nicht der Fall, da einzelne Bruchstücke von Strings immer wieder von Variablen und ähnlichem unterbrochen werden.

    Aber das ist natürlich kein Grund, printf() zu benutzen, sondern spricht eher für Boost.Format oder vergleichbare Lösungen, zumal die Internationalisierbarkeit auch mit printf() o.ä. leicht an ihre Grenzen stoßen kann.



  • dooooomi schrieb:

    Aber das ist natürlich kein Grund, printf() zu benutzen, sondern spricht eher für Boost.Format oder vergleichbare Lösungen, zumal die Internationalisierbarkeit auch mit printf() o.ä. leicht an ihre Grenzen stoßen kann.

    Platzhalter für I18N sind ohnehin recht schnell am Ende ihrer Grenzen, womit sowohl alle C-Funktionen, boost::format sowie streams Probleme haben. Kleines Beispiel: Internationale Adressen.

    Je nach Anwendungsfall kann es sinnvoll sein Einzelbestandteile der Adresse für die Eingabe und Auswertung zu trennen. Und je nach Adressaufbau gehören die Einzelbestandteile in grundsätzlich anderer Reihenfolge wieder zusammengesetzt.

    Hier spricht ein Teil sogar für eine partielle Verwendung von Streams. So könnte man für eine Adresse die Streamoperation definieren, um diese abhängig von dem Aufbau intern zusammenzusetzen (Intern kann dann boost::format etc. teilweise sinnvoll sein, insgesamt ist dann der Stream aber eine benutzerfreundliche Möglichkeit für den Anwender die Ausgabe des Adress-Objektes zu realisieren).

    Auch einfache Texte lassen sich teilweise nicht mittels einfachen Platzhalter internationalisieren. Weil je nach Sprache manche Sachen in der einen Sprache ein Wort, in der nächsten mehrere (die noch dazu an anderen Positionen stehen können) sind.

    cu André


  • Administrator

    dooooomi schrieb:

    Mit printf() etc. hast du in den meisten Fällen einen kompletten, zusammenhängenden String, den du als ganzes übersetzen kannst. Bei Streams ist das nicht der Fall, da einzelne Bruchstücke von Strings immer wieder von Variablen und ähnlichem unterbrochen werden.

    Achso, danke. Daran hatte ich gar nicht gedacht.
    Allerdings war es auch nicht gerade das, was mir bei Internationnalisierung als erstes in den Sinn kommt. Wahrscheinlich habe ich mich darüber noch zu wenig geärgert 🙂
    Da erscheint mir aber Boost.Format doch eher das richtigere zu sein. Werd ich mir merken.

    @It0101,
    Klappe! Du bist noch von C besessen, hast hier nichts zu sagen. ... 🤡 😃
    (Ich möchte zur Sicherheit anmerken, dass der Satz wirklich als Witz gemeint war und auf keinen Fall ernst zu nehmen ist ;))

    Ich sehe das nicht als Zoff an, ich sehe das eher als eine interessante Diskussion. Mag sein, dass ich hitzig werde, zittrige Hände bekomme und meine Atmung sich beschleunigt oder flacher wird, aber das empfinde ich als ganz normal bei einer guten Diskussion, wo es zur Sache geht 🙂

    Das einzige was mich zum Beispiel bei volkard bisher gestört hat, ist sein Sarkasmus. Das mag ich nicht unbedingt in Diskussionen, da dies schnell mal beleidigend wirken kann.
    Ansonsten habe ich bisher einfach gemerkt, dass wir ein wenig verschieden denken, aber das ist ja normal unter den Menschen.

    Grüssli



  • Dravere schrieb:

    audacia schrieb:

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

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

    Bezogen auf die Stringstreams kann ich das nicht sagen, da ich sie nicht benutze (Volkard scheint das getestet zu haben). Mit C++-Dateistreams hatte ich allerdings schon erschreckende Erfahrungen; an einem guten Teil davon war zwar das Zusammenspiel der Dinkumware-Standard-Library (die sich auf massive Optimierungen verläßt) und BCC (der nicht allzuviele beherrscht) schuld, aber auch bei MSVC hatte ich noch einen spürbaren Unterschied zu Dateioperationen mit C- oder Win32-Dateistreams.

    Dravere schrieb:

    Ich würde sie als "komplexer gebaut" bezeichnen. Sie bieten dafür viel mehr Möglichkeiten als nur zum Beispiel ein sprintf .

    Freilich. Die Frage ist, ob man die ganze Erweiterbarkeit braucht, oder ob es nicht doch sinnvoller ist, einer Klasse eine toString()-Methode zu verpassen, anstelle die Streamoperatoren dafür zu überladen. In der Praxis erweist sich das meiner Erfahrung nach als lesbarer und intuitiver.

    dooooomi schrieb:

    Aber das ist natürlich kein Grund, printf() zu benutzen

    Doch. Natürlich ist boost::format vorzuziehen - aber ein guter Grund für die Verwendung von sprintf() ist das trotzdem.



  • audacia schrieb:

    Bezogen auf die Stringstreams kann ich das nicht sagen, da ich sie nicht benutze (Volkard scheint das getestet zu haben). Mit C++-Dateistreams hatte ich allerdings schon erschreckende Erfahrungen; an einem guten Teil davon war zwar das Zusammenspiel der Dinkumware-Standard-Library (die sich auf massive Optimierungen verläßt) und BCC (der nicht allzuviele beherrscht) schuld, aber auch bei MSVC hatte ich noch einen spürbaren Unterschied zu Dateioperationen mit C- oder Win32-Dateistreams.

    Ich kann dir nur sagen das, wenn man a) Buffer setzt (die ja leider bei den Streams meist nicht gesetzt sind, bei den C-Funktionen schon) und b) irgendwelche Zusatzprüfungen des Compilers deaktiviert (z.B. in MSVC SCL_SECURE oder wie der wieder heißt), die Performance nahezu identisch ist (zumindestens unter den Compilern die ich getestet habe).

    cu André



  • audacia schrieb:

    Freilich. Die Frage ist, ob man die ganze Erweiterbarkeit braucht, oder ob es nicht doch sinnvoller ist, einer Klasse eine toString()-Methode zu verpassen, anstelle die Streamoperatoren dafür zu überladen. In der Praxis erweist sich das meiner Erfahrung nach als lesbarer und intuitiver.

    Das würde ja garnicht mehr C++-stylisch-pro-mäsig aussehen und jeder anfänger könnte das.


Anmelden zum Antworten