Unterschied zwischen <cstring> und <string>?



  • Hallo,

    ich möchte ein kleines programm schreiben, welches arithmetische ausdrücke auf korrekte klammerung überprüft. da wir das in c++ machen müssen, ich aber bisher nur mit java gearbeitet hab, kenn ich mich mit den bibliotheken nicht so gut aus.

    was ist denn der unterschied zwischen den include-dateien <cstring> und <string>???

    Ich hab son Taschenbuch "C++ - OOP von Anfang an". Dort wird <cstring> benutzt. Aber ich hab in vielen anderen Tutorials auch <string> gesehen. Worin liegen die Unterschiede? bzw. Gemeinsamkeiten?

    lg


  • Administrator

    <cstring> ist der C++ Header für string.h aus C
    <string> ist der C++ Header für std::string .

    Eine Übersicht findest du hier:
    http://www.cplusplus.com/reference/

    Grüssli



  • aha...
    warum wurden denn C-Bibliotheken in C++-Bibliotheken eingeführt? Wenn die C++-Bibo schon alles, warum noch die aus C verwenden? Und ergeben sich Nachteile, wenn ich cstring benutze, anstatt string? In diesem Buch benutzen sie nämlich immer cstring, was ich komisch finde, denn wenn es schon ein C++ Buch ist, sollten die doch auch alle Bibliotheken aus C++ benutzen und nicht Teilbibliotheken aus C...oder nicht?


  • Administrator

    ausnahme schrieb:

    warum wurden denn C-Bibliotheken in C++-Bibliotheken eingeführt?

    Weil C89 Code fast bis zu 100% Kompatibel zu C++ ist. Du kannst also C89 Code schreiben und ihn mit einem C++ Kompiler übersetzen. Das Standardkomittee hat sich für diese Kompatibilität entschieden, was Vorteile und Nachteile mit sich brachte.

    ausnahme schrieb:

    Wenn die C++-Bibo schon alles, warum noch die aus C verwenden?

    Die beiden Header unterscheiden sich komplett.
    Beim C++ Header hat man eine objektorientierte Lösung, welche auch eine vereinfachte Speicherverwaltung enthält, halt alles über Klassen gelöst ist und RAII gerecht wird.
    Beim C Header bekommt man halt die C Lösung, prozedural, eigene Speicherverwaltung. Dafür wohl auch etwas schneller und für einfache Aufgaben vielleicht sogar besser geeignet. Ein Anfänger sollte aber eher auf die C++ Lösung setzen und später dann anfangen zu lernen abzuschätzen, was besser für sein Problem geeignet ist.

    ausnahme schrieb:

    Und ergeben sich Nachteile, wenn ich cstring benutze, anstatt string?

    Jein. Die Arbeit mit C-Strings ist einfach deutlich schwerer und unangenehmer. Kann unter Umständen aber trotzdem leichter sein. Stöbere mal ein wenig durch die angegebene Referenz.

    ausnahme schrieb:

    In diesem Buch benutzen sie nämlich immer cstring, was ich komisch finde, denn wenn es schon ein C++ Buch ist, sollten die doch auch alle Bibliotheken aus C++ benutzen und nicht Teilbibliotheken aus C...oder nicht?

    Dann ist es wahrscheinlich ein typisches schlechtes C++ Buch, wovon es sehr viele auf dem Markt gibt. Viele C++ Bücher lernen nämlich mehr ein C mit Klassen, was C++ aber überhaupt nicht ist. Meistens haben die Autoren zuerst C gelernt und sind später mehr schlecht als recht auf C++ umgestiegen.

    Im Forum werden meistens die folgenden zwei Bücher für C++ Anfänger empfohlen:
    - C++ Primer
    - Thinking in C++ 1&2 (Auch gratis als PDF erhältlich, aber nur Englisch)

    Grüssli



  • ausnahme schrieb:

    aha...
    warum wurden denn C-Bibliotheken in C++-Bibliotheken eingeführt? Wenn die C++-Bibo schon alles, warum noch die aus C verwenden? Und ergeben sich Nachteile, wenn ich cstring benutze, anstatt string? In diesem Buch benutzen sie nämlich immer cstring, was ich komisch finde, denn wenn es schon ein C++ Buch ist, sollten die doch auch alle Bibliotheken aus C++ benutzen und nicht Teilbibliotheken aus C...oder nicht?

    Mit string.h/cstring bekommst du Funktionen, um C-Strings, also char-Arrays zu verarbeiten (sowas wie strcpy, strstr usw.). Das hat nichts mit der Klasse std::string zu tun, die völlig anders funktioniert und mehr den String-Typen aus anderen Sprachen ähnelt. (Mindestens) aus Kompatibilitätsgründen wurde daher der Header für C-Strings beibehalten. Es ist also nicht doppelt gemoppelt, wie du wohl vermutet hast. 😉



  • <cstring> ist C-Funktionen, eher low-level. Benutzt man als C++-Coder sehr selten. Ist aber aus Kompatibilität zu C vorhanden.

    <string> hat eine String-Klasse, also das was du von Java eher gewohnt bist. Ist auch viel komfortabler, und sollte man auch nutzen.



  • Hallo, Dravere.

    Vielen Dank für die sehr ausführliche Antwort! Ich hab auch schon die Schwierigkeiten festgestellt. Ich wollt ne printf-Anweisung machen, hab dann cstdio inkludiert und dann aber für den Platzhalter %s in der printf einen String benutzt, den ich durch die C++-string-Klasse erstellt hatte. Aber C kennt ja solche Strings nicht, hab deshalb ne fette Fehlermeldung bekommen (Just-In-Runtime Debugging nochwas). Musste dann den String in das C-übliche String umwandeln. Puh...Ich find es scheiße, dass die in meinem Buch nicht darauf eingehen. Der Verlag meines Buches hat eins für C veröffentlicht, und in vielen Foren wurde es empfohlen. Da dachte ich...wenn die so gut sind, dann ist die C++-Variante bestimmt auch gut... Aber Danke nochmal für die Aufklärung. Ich werde jetzt vorsichtiger sein und ein bisschen in der C++Reference stöbern.

    THX!



  • Ich hab son Taschenbuch "C++ - OOP von Anfang an". Dort wird <cstring> benutzt.

    Ich finde der Buchtitel steht irgendwie in Konflikt mit diesem Header.

    Ich hab auch schon die Schwierigkeiten festgestellt. Ich wollt ne printf-Anweisung machen, hab dann cstdio inkludiert und dann aber für den Platzhalter %s in der printf einen String benutzt, den ich durch die C++-string-Klasse erstellt hatte. Aber C kennt ja solche Strings nicht, hab deshalb ne fette Fehlermeldung bekommen (Just-In-Runtime Debugging nochwas). Musste dann den String in das C-übliche String umwandeln.

    Wieso nicht die C++ Ausgabe anstelle der C Ausgabe verwenden? cout kommt wunderbar mit der stringklasse zurecht.
    Solltest du dennoch C Bibliotheken verwenden wollen kannst du trotzdem mit der Stringklasse arbeiten, du kannst nämlich mit dem Aufruf der Methode c_str() des strings an den zugrunde liegenden char const* kommen


  • Administrator

    JustAnotherNoob schrieb:

    Ich hab son Taschenbuch "C++ - OOP von Anfang an". Dort wird <cstring> benutzt.

    Ich finde der Buchtitel steht irgendwie in Konflikt mit diesem Header.

    😃
    Sogar sehr irgendwie. Ich frage mich wie sie das im Buch erklären. Auf der ersten Seite vielleicht so?
    "Aber bevor wir mit OOP anfangen, lernen wir zuerst prozedurale C Programmierung."

    Hey, im ersten Satz steht OOP, also von Anfang an! 🤡

    Grüssli


Anmelden zum Antworten