C-Strings vergleichen



  • Damit du in andere Quellen schaust, musst du aber erst mal merken, dass etwas falsch ist. Das ist aber nur bei einfachen Fehlern wie Syntaxfehlern zu schaffen. Wenn ich an sowas denke wie "goto ist verpönt, weil es der Performance schadet: Der Programmablauf wird an der Stelle unterbrochen -> lahm", dann denke ich nur WTF und du glaubst es ihm, wenn du es nicht besser weißt.

    Ich verstehe einfach nicht, warum du etwas Falsches lernen willst? Nur weil du da ein paar Euro reingesteckt hast? Verkauf das Buch.



  • Hmm das stimmt. Ich meinte nicht direkt Syntaxfehler, sondern wenn du ein Programm schreibst und du merkst, dass es nicht so läuft wie du dir das Vorgestellt hast, obwohl du alles beachtet hast. Aber das kostet unnötige Mühe, das stimmt wiederum auch.

    Btw: Wieso ist goto schlecht ? Soweit ich weiß, weil es Spagetthi-Code erzeugt und somit dem Code extrem unübersichtlich macht. Schließlich schreibt man Codes nicht für sich selber ( meistens nicht) sondern für andere, die evtl. später das Ganze verbessern müssen.

    Das Buch verkaufe ich nicht. Mir die Mühe nicht wert .
    Hatte es damals wie gesagt gekauft, wegen 1.) Guter Ruf des Verlages
    2.) Guten Kundenrezesionen bei Amazon

    Anderseits wird mir immer wieder gesagt, dass Bücher eh nichts taugen, sondern man soll lieber sich irgendein Programm vornehmen und das mit Hilfe von MSDN bzw. Google umsetzen. Wer weiß ...



  • Felixxx schrieb:

    Hmm das stimmt. Ich meinte nicht direkt Syntaxfehler, sondern wenn du ein Programm schreibst und du merkst, dass es nicht so läuft wie du dir das Vorgestellt hast, obwohl du alles beachtet hast. Aber das kostet unnötige Mühe, das stimmt wiederum auch.

    Selbst wenn etwas bei dir läuft, kann der Code immer noch undefiniertes Verhalten haben (das haben Quellcodes aus dem Buch übrigens auch) und irgendwann oder vielleicht mit nem anderen Compiler oder vielleicht auch nur bei Vollmond kackt dir alles ab.

    Aber ich seh schon, dass du dich von deinem Vorhaben nicht abbringen lässt. Dann viel Spaß.



  • Das siehst du falsch. Ich hatte so und so wohl nicht vor, das Buch weiter zu lesen. Das liegt daran, dass ich einfach keine Lust mehr habe, weiter an der Konsolo zu proggen um am Ende etwas zu erhalten, womit ich _nichts_ anfangen kann.
    Die übermäßige Kritik an dem Buch verrstärkt den Entschluss nurnoch.

    Dennoch muss ich wohl mind. darüber disktuieren, dass das Buch wirklich _so_ scheisse sein soll. Denn schlecht fand ich es nicht.

    Fändest du es besser wenn hier jeder bedingungslos akzeptieren würde, was ihm gesagt wird ? Ich nicht und ich bin auch nicht der Typ Mensch, der so reagiert ( was Euch sicher schon aufgefallen ist).



  • Felixxx schrieb:

    Dennoch muss ich wohl mind. darüber disktuieren, dass das Buch wirklich _so_ scheisse sein soll. Denn schlecht fand ich es nicht.
    Fändest du es besser wenn hier jeder bedingungslos akzeptieren würde, was ihm gesagt wird?

    Paßt gut zusammen. Wenn Du eh bei jeder Seite zweifelst, kann ein Buch auch drei Fehler pro Seite haben, ohne daß es Dir schaden würde.



  • Joa ^^ Dass deine Meinung Fakt ist bzw. sein muss habe ich auch schon bemerkt 😉



  • Felixxx schrieb:

    Dennoch muss ich wohl mind. darüber disktuieren, dass das Buch wirklich _so_ scheisse sein soll. Denn schlecht fand ich es nicht.

    als ob du das beurteilen könntest...
    du kanntest C++ davor gar nicht und willst es mit diesem buch lernen. das, was du jetzt gelernt hast, ist ein C/C++ Mischmasch - was man aber als Anfänger einfach nicht merken wird.
    Allein schon, wenn in einem C++ Buch bevor auf std::string eingegangen wird, char[willkrüliche_zahl] für strings genutzt wird, hat es 2 Zeichen zu viel im Titel. Da hilft auch ein printf-ersetzen durch cout nicht...
    Klar wirst du jetzt sagen, "ich sollte doch aber wissen, wie xyz intern funktioniert, wenn ich es verwende" - ist aber kein argument bei programmier(-hoch)-sprachen. dann müsstest du wohl zu allererst asm lernen. oder bei der cpu-architektur anfangen - oder noch weiter unten...

    bb



  • Löl.
    Ich kann und will das einfach nicht als Argument gegen ein Buch akzeptieren. Egal welches Buch.
    Wenn du ein Haus baust, fängst du dann mit dem Dach an ? Wohl kaum.

    C-String gehören genauso zu C wie zu C++, also kann man schlecht von einem Mischmasch aus beiden Sprachen reden. Natürlich stammen C-String aus C, aber man benutzt sie trotzdem sehr häufig in C++. Also macht es Sinn, darauf einzugehen.
    Außerdem geht er beim Erwähnen der String-Klasse direkt ganz darauf ein. Sollte er das etwa gleich bei den Basisdatentypen int, char, etc. machen ? Wohl kaum ...

    Und nun erklär mir bitte noch, wie das das Vertändnis eines Programmieranfängers durcheinander bringt ? Die Tatsache, dass der Autor vor Strings auf C-String eingeht ?


  • Administrator

    Felixxx schrieb:

    Und nun erklär mir bitte noch, wie das das Vertändnis eines Programmieranfängers durcheinander bringt ? Die Tatsache, dass der Autor vor Strings auf C-String eingeht ?

    Ich zeige es dir an deinem eigenen Beitrag auf.

    Felixxx schrieb:

    C-String gehören genauso zu C wie zu C++, also kann man schlecht von einem Mischmasch aus beiden Sprachen reden. Natürlich stammen C-String aus C, aber man benutzt sie trotzdem sehr häufig in C++. Also macht es Sinn, darauf einzugehen.

    Das stimmt nicht. Ich benutze grundsätzlich gar nie mehr C Strings, schon nur deshalb weil sie nicht RAII Konform sind. Die Funktionen aus dem <cstring> Header benutze ich überhaupt nie.

    In C++ wirst du in erster Linie std::string oder std::vector verwenden. Du wirst nur in seltenen Ausnahmen auf C-Strings oder C-Arrays ausweichen.
    Wie ein std::string intern funktioniert gehört daher ans Ende des Buches. Es sollte erst dann erwähnt werden, wenn der Anfänger normalerweise für eine Aufgabe zuerst std::string nimmt.

    Grüssli


  • Mod

    Felixxx schrieb:

    Löl.

    Hör lieber auf unskilled, er weiß wovon er spricht.

    Wenn du ein Haus baust, fängst du dann mit dem Dach an ? Wohl kaum.

    Unpassender Vergleich. Besser wäre: Wenn du ein Haus baust, fängst du dann auch damit an, zuerst eine Strohhütte zu bauen?

    C-String gehören genauso zu C wie zu C++,

    Unsinn. Es gibt sie, aber sie gehören nicht wirklich dazu. Wenn J.W. bei dir einen anderen Eindruck erweckt hat, dann ist dies genau eine der Sachen auf die sich diese Kritik bezieht.

    warum dies Unsinn ist, erkläre ich unten.

    also kann man schlecht von einem Mischmasch aus beiden Sprachen reden.

    Doch. C-Strings benutzt man in C sehr oft, in C++ nie (zumindest nie so, dass man es merkt), daher ist es Sprachmischmasch sie in C++ zu benutzen.

    Natürlich stammen C-String aus C, aber man benutzt sie trotzdem sehr häufig in C++.

    Dies ist ganz einfach ein falscher Fakt. In C++ benutzt man C-Strings für 3 Sachen: Im Sinne von Stringliteralen um damit std::strings zu initialisieren. Im diesem Falle merkt man nichts von der C-String Natur. Zweitens bei der Übergabe von Kommandozeilenargumenten an main. Dies ist ein nerviges Überbleibsel aus alten Zeiten, dass nicht geändert werden kann. Üblicherweise wird daher sofort ein String mit diesen Werten initialisiert. Drittens um bestimmte Funktionen damit aufzurufen, die C-Strings haben müssen. Hier reicht ein c_str(), von dem man wissen muss, dass man es braucht, aber nicht was es macht. In allen Fällen muss man nicht wissen, was ein C-String ist, man bekommt idealerweise nicht einmal mit, was da passiert.

    Also macht es Sinn, darauf einzugehen.

    Ja, als kleiner Exkurs im Anhang für Interessierte.

    Und nun erklär mir bitte noch, wie das das Vertändnis eines Programmieranfängers durcheinander bringt ? Die Tatsache, dass der Autor vor Strings auf C-String eingeht ?

    Du selbst, und auch die vielen anderen Opfer hier im Forum, lieferst genügend Stoff für Argumente. Alleine schon die Tatsache, dass du C-Strings als normalen Teil von C++ ansiehst ist für einen C++-Programmierer eher amüsant. Aber du siehst dies natürlich gar nicht ein, weil dies in deinem Buch anders steht und dies ist alles was du kennst.

    Die einzige Wahl die du hast, ist dich zu entscheiden wem du glaubst: Jemandem der am laufenden Band Anfängerbücher zu verschiedensten Themen raushaut (wie gut wird er wohl recherchiert haben?) und dabei sogar Fehler macht die für Anfänger offensichtlich sind (die Syntaxfehler) oder der geballten Meinung aller regelmäßigen Teilnehmer im größten deutschen C++-Forum.

    Ich möchte dich jedoch auch noch darauf aufmerksam machen, dass Menschen bekanntermaßen ihre vergangenen Fehlentscheidungen gutreden und neue Fehlentscheidungen damit rechtfertigen: Ich habe jetzt schon tausende von Euros in die Reperatur meines Wagens gesteckt, weil ich mir damals eine Schrottmühle gekauft habe, jetzt kann ich auch nochmal 1000€ reinstecken, um durch den TÜV zu kommen. Ich habe jetzt schon 40 Euro für ein Buch ausgegeben welches mir schaden soll, jetzt kann ich es wenigstens durchlesen.



  • Ja, ich weiß dass ihr wisst, wovon Ihr sprecht.

    Aber ich denke es ist doch mal Geschmackssache, ob man std::string oder char array[50] verwendet.

    Außerdem übersiehst du eine Sache für die es gut sein könnte, es zu wissen :

    Deine C-Strings liegen immernoch im speicher und werden sogar verdopelt wenn du nen std::string damit initialiesiert. Das sollte man zumindest wissen um Schpeicherlecks zu vermindern. Oder sehe ich das falsch ?

    Btw: Die Sache mit dem Geld : Es geht mir nicht ums Geld. Wie schon öfter erwähnt habe ich garnicht vor das Buch weiterzulesen. Aber aus anderen Gründen. Die geballte Kritik verstärkt den Entschluss nurnoch.
    Aber ich fand das Buch bis dato not bad.



  • Felixxx schrieb:

    Aber ich denke es ist doch mal Geschmackssache, ob man std::string oder char array[50] verwendet.

    Ist es denn auch Geschmackssache, ob man ein sicheres oder unsicheres Rennauto fährt?

    Wenn man schon auf std::string verzichtet, dann kann man auch gleich in C programmieren. Denn das was std::string bietet macht C++ aus; wer sich dagegen wehrt, der wehrt sich gegen die Sprache an sich.


  • Mod

    Felixxx schrieb:

    Aber ich denke es ist doch mal Geschmackssache, ob man std::string oder char array[50] verwendet.

    Eben nicht. Das eine ist narrensicher, das andere ist fehleranfällig. Das eine ist kurz und elegant, das andere ist umständlich (es gibt ein paar Situationen in denen C-Strings kürzer und elganter sein können, aber dies ist eher die Ausnahme). Das eine ist vom Stil her konsistent zum Rest der Sprache, das andere nicht. Das eine ist etwas mit denen andere C++ Programmierer sich bestens auskennen, das andere nicht. Das eine hat eine intuitive Semantik (überladene Operatoren), das andere nicht. Beim einen wird alles automatisch für einen gemacht, beim anderen muss man selber auf alles aufpassen (und wehe man macht etwas falsch!). Beim einen hat man ohne Kosten die Flexibilität etwas ganz anderes zu machen (wusstest du zum Beispiel, dass man Strings mit int als Basis (anstatt char) haben kann? Das geht sogar mit eigenen Datentypen. Und man kann trotzdem alles so benutzen wie einen normalen std::string), beim anderen nicht.

    Deine C-Strings liegen immernoch im speicher und werden sogar verdopelt wenn du nen std::string damit initialiesiert. Das sollte man zumindest wissen um Schpeicherlecks zu vermindern. Oder sehe ich das falsch ?

    Das siehst du falsch. Wo du das her hast, kann man sich ja denken 😃



  • Hmm true.

    Aber :

    Für mich macht es immernoch Sinn bzw. ist es nicht schlimm, auf C-Strings in einem Buch vor std::string einzugehen. Ich möchte nicht nomal wiederholen warum ich denke, dass er das so macht ( auf string äher eingehen ... ) und es so auch durchaus Sinn macht.
    Außerdem :
    C ist Basis von C++.
    Es ist also nicht grausam und programmier-schadend C-Strings als eine Alternative zu std::string zu halten.



  • Das sehe ich falsch ? Was sehe ich falsch ?

    Und du hast recht, was die Verwendung von string in komplexen Programmen betrifft, in dem man sehr viel damit rumhantiert.
    Aber in Programmen, wo sie eher eine kleine Rolle spielen, kann man ruhig C-String nehmen, da schneller.



  • Felixxx schrieb:

    Oder sehe ich das falsch ?

    Ja und nein.

    Felixxx schrieb:

    Deine C-Strings liegen immernoch im speicher und werden sogar verdopelt wenn du nen std::string damit initialiesiert.

    Ja. Deswegen mache ich sowas nicht grundsätzlich. Bei mir leben C-Strings und std::string harmonisch nebeneinander. Das sind keine Gegner. Es sind auch nicht Vorgänger und Nachfolger. Manchmal sind C-Strings auch in C++ angemessen. Aber sauselten. Vielleicht so selten, daß es gescheit wäre, sie weit nach std::string zu bringen. Dazu müßte man auch die Beispielprogramme umsortieren und das erste, das argv[] benutzt, nach hinten schieben. So Sachen halt und es wird rund.

    Felixxx schrieb:

    Das sollte man zumindest wissen um Schpeicherlecks zu vermindern.

    Keine Speicherlöcher sichtbar. Welches meinst Du? Ich sehe keins.



  • Es ist in einigen Situationen sogar erforderlich mit C Strings zu arbeiten.
    Das betrifft insbesondere in C geschriebene Schnittstellen, wie der WinAPI.

    Du hast also insofern recht, dass man sich auch mit den C Strings auseinandergesetzt haben sollte. Aber ob es pädagogisch sinnvoll ist zunächst auf diese einzugehen, halte ich für sehr fraglich. Bieten sie doch viel mehr Fallstricke, als std::string es tut. Versuch doch mal zwei C Strings mit == zu vergleichen. Das ist für einen Anfänger alles andere als intuitiv, sondern einfach nur frustrierend! So macht programmieren keinen Spaß.

    Im übrigen versucht man von C Arrays (wenn es anders nicht geht) schnell wieder zu std::string zu kommen. Man schreibt sich einfach Wrapper, die diese hässlichen und unsicheren Dinge wegkapseln.

    Und ob C Basis von C++ ist. Wenn das mal kein Flamewar auslöst.

    Und das Argument mit der Geschwindigkeit ist lächerlich. Eine solch zeitkritische Anwendung musst du erst mal programmieren müssen. Sehr unwahrscheinlich.



  • Naja,
    der speicher für das char array wird zB nicht automatisch freigegeben das heißt man muss das selbst erldigen.
    Aber viele wissen nicht einmal, dass jedesmal wenn du iwo "bla" schreibst eig nen char array erstellt wird.



  • Ja das Argument mit der Zeit ist natürlich etwas schwach 😛 Aber ich meinte, dass man C-Strings in eben solchen Programmen verwendet.

    Und das mit == geht natürlich auch nicht. Aber wozu gibts strcmp. Wobei das natürlich wieder umständlicher ist, als bei std::string, wo der Operator schon schön überladen wurde 🙂 Trotzdem ...



  • Versuch doch einfach mal mit C Strings ein Programm zu realisieren, welches zwei C Strings einliest und anschließend miteinander verknüpft. Der neu entstandene C String soll dann rückwärts ausgegeben werden.

    Damit du weißt, worum es geht. Hier eine mögliche Lösung mit std::string :

    #include <iostream>
    #include <algorithm>
    #include <string>
    #include <iterator>
    
    int main()
    {
    	std::cout << "S1: ";
    	std::string s1;
    	std::getline(std::cin, s1);
    
    	std::cout << "S2: ";
    	std::string s2;
    	std::getline(std::cin, s2);
    
    	std::cout << "S3: ";
    	std::string s3 = s1 + s2;
    	std::copy(s3.rbegin(), s3.rend(), std::ostream_iterator<char>(std::cout, ""));
    
    	return 0;
    }
    

    Die Frage die du dir danach stellen solltest: Sind C Strings den Aufwand wert?


Anmelden zum Antworten