Diskussion aus FAQ getrennt
-
Sebastian848 schrieb:
...Für Anfänger ist es oftmals leichter zu verstehen wenn man mit C-Strings und Char* arrays anfängt. ...
Klar !
Wenn jemand einen Text an den anderen hängen möchte, ist es viel einfacher, ihm zu sagen:
- rufe eine Funktion auf, die Dir die Länge der Texte (mittels Schleife über alle Zeichen) ausrechnet
- alloziere ausreichend Speicher
- kopiere alle Zeichen des ersten Textes mit einer Funktion in den neuen Buffer,
- dann nochmal alle Zeichen des 2. dahinter (also "Offset" merken)
- lösche den Speicher, den der erste Text belegt hat
- "Biege" den Zeiger Deines ersten Textes so um, dass er auf den neuen zeigt
- ... und denke daran dass Du möglichst nirgends noch einen Zeiger im Programm hast, der auf die alte Speicherstelle verweist.
Nicht zu vergessen: Wenn Du einen Fehler hast: Arbeite Dich mit einem Debugger zeichenweise durch 3 Arbeitsspeicherbereiche, beachte Speicheradresse, Bufferlängen und 0-Terminierungen..Dagegen ist "text1 += text2;" wirklich kryptisch !

[/Ironie]
Niemand hier verbietet Anfängern mit C-Strings zu arbeiten, wenn sie lernen wollen, wie sie funktionieren - aber welchen Anfänger interessiert das wirklich ?
Üblicherweise wollen die erstmal lernen, mit Funktionsaufrufen, Kontrollstrukturen, Variablen, .... umzugehen. Deine AussageSebastian848 schrieb:
......man soll die sache ja verstehen wie es funktioniert und nicht schlicht und einfach mit Std::String arbeiten. Jeder möchte das verstehen was da passiert und da ist C-String sehr wohl in ordnung...
ist vollkommen unrealistisch.
Außerdem ist das vollkommen willkütlich: Hast Du Dir schonmal angesehen, wie pow() funktioniert ? Oder malloc() ? Oder printf() ? ....Warum sollte man die benutzen dürften aber std::string nicht, wenn sie zur Lösung einer Aufgabe geeignet sind ?
"Cer" argumentieren gegenüber "C++ern" oftmals mit dieser "überflüssigen Abstraktionsebene" und vergessen dabei, dass sie es sich ganz selbstverständlich selbst hinter so einer gemütlich gemacht haben.Gruß,
Simon2.
-
Ich finde auch, bevor man C lernt, sollte man erstmal alle Assembler-Befehle kennen...
-
Schlagt mich, aber ich stimme mit Sebastians Meinung (zumindest teilweise) überein. JEDER C++ Programmierer kommt früher oder später mit einer reinen C-API in Kontakt und muss sich mit char-Arrays herumärgern und sollte dann auch wissen, wie man richtig mit ihnen umgeht. Also sollte jedes C++-Kurs/Buch/Tutorial eine Einführung in C-Strings geben um anschließend zu verdeutlichen, dass die C++-String Klasse nur ein Wrapper um die NTBFs ist, um den Umgang mit ihnen komfortabler zu machen...
Außerdem setzt eine Maschinennahe Sprache wie C, und damit auch C++,nun mal eine gewisse Auseinandersetzung mit den Grundlagen voraus, um wirklich effizienten Code zu schreiben.Grüße,
Martin
-
JimmydaMage schrieb:
Schlagt mich, aber ich stimme mit Sebastians Meinung (zumindest teilweise) überein. JEDER C++ Programmierer kommt früher oder später mit einer reinen C-API in Kontakt und muss sich mit char-Arrays herumärgern und sollte dann auch wissen, wie man richtig mit ihnen umgeht. Also sollte jedes C++-Kurs/Buch/Tutorial eine Einführung in C-Strings geben um anschließend zu verdeutlichen, dass die C++-String Klasse nur ein Wrapper um die NTBFs ist, um den Umgang mit ihnen komfortabler zu machen...
Ja, sicher sollte man lernen, daß es auch C-Strings gibt und wie sie arbeiten - aber bitte nicht gleich als Einstieg in C++. Auf diese Weise entstehen nur kiloweise halbausgegorene std::string Alternativen, weil die Anfänger versuchen, ausgehend von nullterminierten char-Array eine eigene Verarbeitung zu basteln (und die ist idR schwächer/langsamer/unhandlicher als das Original).
JiimydaMage schrieb:
Grüße,
Martin
Ja, wie heißt er denn nun? *scnr*
-
Irgendwie ist es schon auffallend, dass die C-String-Verfechter in Diskussionen wie dieser hier meistens eher unerfahrene Entwickler, Forenneulinge oä. sind.
JimmydaMage: Niemand sagt, dass man nicht irgendwann lernen soll, mit C-Strings umzugehen. Das soll nur nicht das erste sein, was ein C++-Neuling macht.
Nicht vergessen: Abstraktion ist Euer Freund, tut selten weh.
-
nman schrieb:
Irgendwie ist es schon auffallend, dass die C-String-Verfechter in Diskussionen wie dieser hier meistens eher unerfahrene Entwickler, Forenneulinge oä. sind.
Bleibt nur die Frage, ob die erfahreneren evtl nicht mehr wissen, wie's am Anfang war

-
Badestrand schrieb:
nman schrieb:
Irgendwie ist es schon auffallend, dass die C-String-Verfechter in Diskussionen wie dieser hier meistens eher unerfahrene Entwickler, Forenneulinge oä. sind.
Bleibt nur die Frage, ob die erfahreneren evtl nicht mehr wissen, wie's am Anfang war

Doch, die wissen noch genau, dass ihnen am Anfang auch unsinnigerweise irgendjemand C-Strings eingeredet hat und behauptet hat, std::vector soll man nicht verwenden, weil Zeigerarithmetik immer viel schneller ist usw. und wollen die Folgen derartiger Kommentare anderen Neulingen ersparen.
-
nman schrieb:
Doch, die wissen noch genau, dass ihnen am Anfang auch unsinnigerweise irgendjemand C-Strings eingeredet hat und behauptet hat, std::vector soll man nicht verwenden, weil Zeigerarithmetik immer viel schneller ist usw. und wollen die Folgen derartiger Kommentare anderen Neulingen ersparen.
Kann auch sein, weiß ich nich
Im übrigen ist die Diskussion doch schon dutzende male geführt worden und hat nie was "gebracht". So wie's zur Zeit ist, ist es doch gut, ein paar Leute zeigen den Anfängern den Umgang mit C-Strings und ein paar zeigen den Umgang mit string - heraus kommt ein allwissender Anfänger 
-
Tja, was man nicht alles wissen sollte!? Ich benutze in meinen Programmen NIE C-Funktionen. Selbst wenn ich fremde C-Bibliotheken (die ich versuche zu vermeiden, wenn eine C++-Alternative verfügbar) verwende, benutze ich keine C-Funktionen. Bekomme ich einen const char* knall ich den gleich in einen std::string. Und wenn eine Funktionen einen const char* erwartet, habe ich eh schon die ganze Zeit mit einem std::string gearbeitet und übergebe c_str().
Es ist also eine Lüge zu behaupten, das man als C++ler irgendwann C-Funktionen benutzen muß. Es stimmt höchstens, das man mit einer C-Schnittstelle in Berührung kommt... aber alle C++-Typen (std::string, std::vector usw.) liefern C-kompatible Typen, so das man eben gerade nicht mit C-Funktionen benutzen muß.
Und dann noch eine Frage: wozu brauche ich C++, wenn ich eh C-Funktionen benutzen soll? Macht doch irgendwie keinen Sinn. Ich benutze doch gerade C++ um von C weg zu kommen.
malloc und realloc kenne ich nur vom hören sagen. Ich benutze immer std::vector - fertig.
Dann noch was (ich bin gerade in Fahrt ;)): alle wollen immer eine größere C++-Stdlib und beklagen, das die Entwicklung des C++-Std so lange braucht. Aber im gleichen Atemzug gibts viele, die wollen nicht das man die C++-Std-Klassen wie std::string und std::vector benutzt. Ist doch irgendwie ein Widerspruch!

-
Badestrand schrieb:
heraus kommt ein allwissender Anfänger

Oder ein total verwirrter

-
CStoll schrieb:
(wer sich etwas besser auskennt, kann sich ja gerne mit den Interna beschäftigen - und mit den "Altlasten", die C++ von C geerbt hat)
die gehören aber (leider) dazu und unkenntnis dieser altlasten führt früher oder später zu problemen.
Simon2 schrieb:
"Cer" argumentieren gegenüber "C++ern" oftmals mit dieser "überflüssigen Abstraktionsebene" und vergessen dabei, dass sie es sich ganz selbstverständlich selbst hinter so einer gemütlich gemacht haben.
abstraktion ist oft hilfreich, aber sie ist nur sinnvoll, wenn man damit etwas vereinfachen kann. wenn abstraktion zu einem hindernis wird, ist sie sinnlos. es kommt immer auf den jeweiligen fall an. C++ an sich zwingt niemanden zu übertriebener abstraktion - aber - aus irgendeinem unerfindlichen grund neigen eine menge C++ -user dazu, vieles unnötig zu abstrahieren. man braucht nur durch dieses forum zu bowsen und dann kann man die mega-rolleyes kriegen, wie oft zusätzlich komplexität hinzugefügt wird, die eigentlich gar nicht sein muss.

-
Bouncer schrieb:
man braucht nur durch dieses forum zu bowsen und dann kann man die mega-rolleyes kriegen, wie oft zusätzlich komplexität hinzugefügt wird, die eigentlich gar nicht sein muss.

Naja, ist ja auch nicht so, dass Programmieren immer nur einfach ist

-
Bouncer schrieb:
CStoll schrieb:
(wer sich etwas besser auskennt, kann sich ja gerne mit den Interna beschäftigen - und mit den "Altlasten", die C++ von C geerbt hat)
die gehören aber (leider) dazu und unkenntnis dieser altlasten führt früher oder später zu problemen.
Das kann gut sein - aber einen Neuling gleich damit zu erschlagen führt zu nichts. Dazu ist später noch Zeit, wenn er sich mit den C++ Grundlagen auskennt.
Simon2 schrieb:
"Cer" argumentieren gegenüber "C++ern" oftmals mit dieser "überflüssigen Abstraktionsebene" und vergessen dabei, dass sie es sich ganz selbstverständlich selbst hinter so einer gemütlich gemacht haben.
abstraktion ist oft hilfreich, aber sie ist nur sinnvoll, wenn man damit etwas vereinfachen kann. wenn abstraktion zu einem hindernis wird, ist sie sinnlos. es kommt immer auf den jeweiligen fall an.
Aber in diesem Fall ist die Abstraktion von char* auf std::string bestimmt kein Hindernis

man braucht nur durch dieses forum zu bowsen und dann kann man die mega-rolleyes kriegen, wie oft zusätzlich komplexität hinzugefügt wird, die eigentlich gar nicht sein muss.
Ja, zum Beispiel indem ständig krampfhaft versucht wird, die Funktionsweise von C++ Standardklassen auf Basis der C-Funktionen nachzubilden.
(aber ich kenne ja deine Meinung zu C++, vista :D)
-
Zuerst einmal: ja, ich gehoere auch zu den Leuten, die sagen "trennt C so weit wie moeglich von C++"
Das "so weit wie moeglich" steht da extra drin, denn dank der Erblasten ist eine absolute Trennung nicht moeglich, wenn man ueber die ersten Hello-World Anwendungen hinaus ist.
ABER: Wenn ich eine API hab die mir einen Stapel C-Funktionen liefert, und ich diese Funktionen haeufig benutze, dann baue ich mir Wrapper darum, die das C-Style Gewerkel mit const char*s & Co auf einen moeglichst kleinen Quelltextabschnitt beschraenken.
Was das Verstaendnis der Hintergruende angeht: klar wird jeder sich irgendwann mit den char-arrays hinter den std::strings auseinandersetzen muessen, aber nicht am Anfang (ich denke das Beispiel mit pow(), sprintf etc. war da schon ganz gut gewaehlt). Man muss nicht sofort alle HJintergruende kennen, sonst koennen wir C++ und auch C an den Nagel haengen und uns erstmal mit Assembler auseinandersetzen. Die Hintergruenden werden erst wichtig, wenns ans Optimieren geht oder man anderweitig in den Eingeweiden der Sprache rumwuehlen muss.Dann wurde noch angeprangert, dass hier oft C-Style Code bemaengelt wird und die Leute doch eh frueher oder spaeter ordentlichen Stil lernen. Aber den lernen sie doch nur dadurch dass man ihnen sagt was sie besser machen koennen. Schliesslich sind bestimmt 70% oder mehr der Leute hier Hobbyprogrammierer, die mit ihrem "C/C++"-Buch vor dem Rechner zu Hause sitzen und ausser diesen oftmals grauenhaft sprachvergewaltigenden Buechern nur dieses Forum als Lernmittel und Stilvorlage haben. Aus demselben Grund ist es auch entgegen einigen Behauptungen oft besser, den Leuten Hinweise zu geben, wo sie Loesungsansaetze zu ihren Problemen finden koennen, als ihnen jedesmal stumpf fertigen Quellcode vor die Nase zu setzen. Denn nur durch abtippen lernt man nicht so wirklich viel.
-
Hi pumuckl,
ich kann dir nur voll zustimmen!!!
Ich fände es sogar gut, wenn die C++ Compiler eine Option hätten, welcher die C-Altlasten (printf, scanf, malloc, free, ...) als Mißbilligung ("deprecated") wenn nicht sogar als Fehler anprangert (damit die NewBees gleich darauf hingewiesen werden).
-
Bouncer schrieb:
...
abstraktion ist oft hilfreich, aber sie ist nur sinnvoll, wenn man damit etwas vereinfachen kann. wenn abstraktion zu einem hindernis wird, ist sie sinnlos. es kommt immer auf den jeweiligen fall an. ...2 mal 2 ist 4.
Du schreibst hier eine Menge Allgemeinplätze ohne sie plausibel in Zusammenhang mit dem aktuellen Thema zu bringen.
Aus schon ausreichend dargelegten Gründen hat std::string immense Vorteile und so gut wie keine Nachteile.@Abstraktion: Man kann sogar sagen: std::string sind eigentlich keine "Abstraktion" von Strings, sondern eine exakte Abbildung. C-Strings dagegen sind eine sehr komkrete "Maschinisierung" dieses Konzepts.
@Komplexität: Lege einfach mal die Zahl der Threads, in denen Leute Probleme mit C-Strings haben, gegen die, in denen Leute Probleme mit std::string haben, gegeneinander.
Wenn Du dann noch einberechnest:
- Wo die C-String-Probleme durch den Einsatz von std::string gelöst wurden und
- wo die std::string-Probleme durch den Einsatz von C-Strings nicht gelöst oder sogar noch vergrößert worden wären,
wird allerspätestens klar, wo die größere Komplexität liegt.Gruß,
Simon2.
-
Simon2 schrieb:
Bouncer schrieb:
...
abstraktion ist oft hilfreich, aber sie ist nur sinnvoll, wenn man damit etwas vereinfachen kann. wenn abstraktion zu einem hindernis wird, ist sie sinnlos. es kommt immer auf den jeweiligen fall an. ...2 mal 2 ist 4.
Du schreibst hier eine Menge Allgemeinplätze ohne sie plausibel in Zusammenhang mit dem aktuellen Thema zu bringen.
Aus schon ausreichend dargelegten Gründen hat std::string immense Vorteile und so gut wie keine Nachteile.ich hab' ja nicht direkt über std::strings abgelästert. mir ist nur aufgefallen, dass sich's viele frager im C++ forum (für meine begriffe) zu schwer machen.

-
Bouncer schrieb:
ich hab' ja nicht direkt über std::strings abgelästert. mir ist nur aufgefallen, dass sich's viele frager im C++ forum (für meine begriffe) zu schwer machen.

Unsinn.
std::stringmag nicht perfekt sein, ist aber wesentlich besser und einfacher zu handhaben gegenüber C-Strings.Wenn du dir den OP ansiehst:
Sebastian848 schrieb:
Ich finde es etwas schlecht das Ihr sagt man solle nicht C mit Cpp mischen. Für Anfänger ist es oftmals leichter zu verstehen wenn man mit C-Strings und Char* arrays anfängt. man soll die sache ja verstehen wie es funktioniert und nicht schlicht und einfach mit Std::String arbeiten. Jeder möchte das verstehen was da passiert und da ist C-String sehr wohl in ordnung.
, wirst (oder solltest zumindest) du erkennen dass das Problem nicht ist dass in diesem Fall "[A]bstraktion zu einem [H]indernis" wird, sondern die Abstraktion an sich nicht verstanden wurde.
p.s. was mir grad so völlig offtopic und belanglos in den Sinn kommt: gab's eigentlich noch eine Inkarnation vor net?
-
finix schrieb:
Bouncer schrieb:
ich hab' ja nicht direkt über std::strings abgelästert. mir ist nur aufgefallen, dass sich's viele frager im C++ forum (für meine begriffe) zu schwer machen.

Unsinn.
std::stringmag nicht perfekt sein, ist aber wesentlich besser und einfacher zu handhaben gegenüber C-Strings.dass das oft stimmt, will ich gar nicht bezweifeln. ich hab' ja nix gegen std::strings gesagt.
finix schrieb:
Wenn du dir den OP ansiehst:
Sebastian848 schrieb:
Ich finde es etwas schlecht das Ihr sagt man solle nicht C mit Cpp mischen. Für Anfänger ist es oftmals leichter zu verstehen wenn man mit C-Strings und Char* arrays anfängt. man soll die sache ja verstehen wie es funktioniert und nicht schlicht und einfach mit Std::String arbeiten. Jeder möchte das verstehen was da passiert und da ist C-String sehr wohl in ordnung.
, wirst (oder solltest zumindest) du erkennen dass das Problem nicht ist dass in diesem Fall "[A]bstraktion zu einem [H]indernis" wird, sondern die Abstraktion an sich nicht verstanden wurde.
wo siehst du da unverständnis? der OP plädiert einfach für ein 'hinter die kulissen schauen' und was das angeht, bin ich mit ihm sogar einer meinung.
finix schrieb:
p.s. was mir grad so völlig offtopic und belanglos in den Sinn kommt: gab's eigentlich noch eine Inkarnation vor net?
nein, wieso? gab's hier schon mal so'nen schlimmen troll? (kann ich mir gar nicht vorstellen).

-
Bouncer schrieb:
wo siehst du da unverständnis?
Er versteht den Sinn der Abstraktion nicht.
Bouncer schrieb:
der OP plädiert einfach für ein 'hinter die kulissen schauen' und was das angeht, bin ich mit ihm sogar einer meinung.
1. "Hinter die Kulissen schauen" ist durchaus legitim, und im Grunde sogar empfehlenswert.
2. Nach diesem Muster zu programmieren ist definitiv nicht angebracht (nicht mal in C!).Bouncer schrieb:
nein, wieso? gab's hier schon mal so'nen schlimmen troll? (kann ich mir gar nicht vorstellen).

Wollte mich nur vergewissern, weil dich manche schon vista und so nennen
