2010-03-21 17 views
10

Wird empfohlen, cstdio, cstring, cmath in C++ zu verwenden? Ich schrieb ein Programm, das pow, strlen und sprintf brauchte ... dafür war die einzige Möglichkeit, diese 3 Header zu integrieren. Gibt es einen besseren C++ - Weg, dies zu tun?Wird in C++ empfohlen, cstdio, cstring, cmath usw. zu verwenden?

Dank

+1

Klingt für mich wie Sie C schreiben, nur mit einem C++ - Compiler. Wenn Sie C++ verwenden, würde ich argumentieren, dass Sie die IO-Manipulationsfunktionen der Standardbibliothek zusammen mit stringstream anstelle von sprintf verwenden und die C++ - String-Klasse anstelle von C-Style-Strings verwenden sollten. Sie haben "strlen() und sprintf()" benötigt, weil Sie mit C-Strings arbeiten. –

Antwort

5

Das der Weg richtig ist.

+0

Ich bin mir nicht sicher, ob ich dem zustimme :) Es hört sich an, als würde er mit C-Style-Strings arbeiten, nicht mit C++ - Strings. Die Frage, die ich haben würde ist: sollte er nicht std :: basic_string anstelle von NULL terminierten Strings zusammen mit den IO-Manipulationsfunktionen von C++ anstelle von Sprintf verwenden? Prost :) –

10

Sie können std::stringstream statt sprintf und std::string anstelle von C-style Strings verwenden. Aber C++ verwendet nur die C-Bibliothek für mathematische Funktionen.

C++ fügt einige bequeme Überlastungen für mathematische Funktionen (zum Beispiel können Sie exp() für float verwenden.) Sie sind in <math.h> nicht nur in <cmath> though.

+0

Es gibt eine Menge nützlicher Dinge außer sprintf in string.h –

+2

Aber es ist alles für die Verwendung von char * Strings. Wenn Sie in die String-Klasse von C++ wechseln, erhalten Sie alles im String-Header. (O.K., manchmal brauchen Sie vielleicht auch einen Algorithmus) Und es ist vorzuziehen, wenn möglich die Zeichenfolge von C++ als ein Zeichen * zu verwenden. – Shiroko

+0

string.h hat einige nicht-string-Funktionen wie memcpy und memset. – dan04

3

Für mathematische Funktionen ist <cmath> der richtige Weg; Für E/A sollten Sie jedoch <iostream>, <sstream>, <und> und Freunde verwenden. Für die String-Manipulation ist <String> der Weg zu gehen.

+0

iostream ist viel langsamer als scanf/printf (acm Olympiaden Erfahrung) – osgx

+0

@osgx, nicht sicher, dass ich das kaufen. scanf/printf muss mit viel mehr Formatierung umgehen als iostreams. Welche Implementierung hast du benutzt? Jede vernünftige Implementierung von iostream sollte mindestens so schnell sein. –

+0

auf unserem olymp-Problem war mit 'sync_with_stdio'. libstdC++'s iostream von gcc hat dies in Linux aktiviert. Nach dem Ausschalten erhöhte sich die Geschwindigkeit von iostream – osgx

1

cmath wird in C++ nicht wirklich ersetzt, da es wirklich nichts gibt, was sie besser macht. Stringstreams/Iostreams sind jedoch dem cstring- und cstdio-Lot weit überlegen.

Wenn Sie eine C-Zeichenfolge haben, können Sie ganz einfach in eine std :: string konvertieren, und das gleiche für wieder zurück. Wenn Sie Zeichenfolgen verwenden, verwenden Sie IMMER die C++ - Zeichenfolgenbibliotheken über strlen, sprintf und das.

Verwandte Themen