Frage zu Übungsaufgabe mit string
-
Oder C++23. https://coliru.stacked-crooked.com/a/9f35f35ba3eefc4b
string str("Tell the truth, Nobody will do Anything."); // sic auto s = views::split(str, ' ') | views::filter([i=0] (auto) mutable {return i++ % 3 == 0;}); ranges::copy(s, ostream_iterator<string_view>{cout, " "});
Geht auch noch prägnanter mit
join_with
. Haben wir aber noch nicht.
-
Wobei mir gerade auffaellt, dass eben die erwaehnte stringstream Methode doch fast sexier ist:
istringstream sentence("Tell the truth, Nobody will do Anything."); copy_if(istream_iterator<string>(sentence), {}, ostream_iterator<string>(cout, " "), [i=0] (auto) mutable {return i++ % 3 == 0;});
(Wobei man eben auch den Input in Form eines Streams haben sollte)
Wenn man lustig ist, kann man auch ein eigenes Facet zum ignorieren von Satzzeichen und Zeilenumbruechen in den Stream einfuegen.
-
@hustbaer sagte in Frage zu Übungsaufgabe mit string:
Hä?
Naja, damit meine ich halt, dass bei meiner Version der Zähler irgendwann einmal überlauft und ob das wieder genau so teilbar ist wenn das Ding wieder bei der Null ankommt ist mir nicht schlüssig.
@Columbo bei deinen Examples sieht mans. Ich bin ein verrosteter alter C++-Programmierer.
EDIT: @hustbaer bei deinem Example seh ich auch wie du irgendwas immer weiter aufaddierst aber den Anker dazu find ich bei dir nicht. Hierzu also ein herzliches Hä zu deinem Hä.
MfG
-
@Großmaul
Naja, das ist ein sehr theoretischer Fall. Nimm nen
std::uint64_t
dann biste um Größenordnungen weiter.
-
@DocShoe Ja, naja, machen wir es halt so, dass es noch auf der Beerdigung läuft ...
EDIT: Dann würde ich @KarlSr noch freundlich fragen ob das Ding noch laufen soll wenn er tot ist
Aber ich glaube wir haben ihm hier schon genug Weisheiten auf den Teller drittes Wort.
-
@Großmaul sagte in Frage zu Übungsaufgabe mit string:
Hä?
Naja, damit meine ich halt, dass bei meiner Version der Zähler irgendwann einmal überlauft und ob das wieder genau so teilbar ist wenn das Ding wieder bei der Null ankommt ist mir nicht schlüssig.
Das ist auch unmoeglich, weil ja die groesste positive repraesentierbare Zahl im two's complement entweder durch drei teilbar ist, in welchem Fall die uebernaechste additive Gegenzahl ebenfalls durch drei teilbar waere, oder nicht, in welchem Fall drei Zahlen in Folge nicht durch drei teilbar sind (weil ja auch ).
Aber trotzdem etwas laecherlich so etwas zu bemaengeln, wenn man beruecksichtigt, dass bei einem String der 2^31 Worte umfasst, wir schon fast die 3.9 Milliarden Worte in der englischen Wikipedia sprengen. An welchem Punkt andere Nuancen wie korrekte Behandlung von Leerraum etc. sowieso zu behandeln waeren.
-
@Columbo sagte in Frage zu Übungsaufgabe mit string:
@Großmaul sagte in Frage zu Übungsaufgabe mit string:
Hä?
Naja, damit meine ich halt, dass bei meiner Version der Zähler irgendwann einmal überlauft und ob das wieder genau so teilbar ist wenn das Ding wieder bei der Null ankommt ist mir nicht schlüssig.
Das ist auch unmoeglich, weil ja die groesste positive repraesentierbare Zahl im two's complement entweder durch drei teilbar ist, in welchem Fall die uebernaechste additive Gegenzahl ebenfalls durch drei teilbar waere, oder nicht, in welchem Fall drei Zahlen in Folge nicht durch drei teilbar sind (weil ja auch ).
Aber trotzdem etwas laecherlich so etwas zu bemaengeln, wenn man beruecksichtigt, dass bei einem String der 2^31 Worte umfasst, wir schon fast die 3.9 Milliarden Worte in der englischen Wikipedia sprengen. An welchem Punkt andere Nuancen wie korrekte Behandlung von Leerraum etc. sowieso zu behandeln waeren.
Nein das meinte ich nicht, ich finde das eine sehr attraktive Information das mit einem
std::size_t
sogar so machen zu können.
-
@Großmaul sagte in Frage zu Übungsaufgabe mit string:
@hustbaer sagte in Frage zu Übungsaufgabe mit string:
Hä?
Naja, damit meine ich halt, dass bei meiner Version der Zähler irgendwann einmal überlauft
Das ist aber kein Pufferüberlauf. Lässt sich auch leicht vermeiden indem man - so wie du das gemacht hast -
size_t
statt wie bei mirint
verwendet. Weilsize_t
immer gross genug ist um jedes mögliche Array vollständig zu indizieren - und damit auch gross genug für jeden möglichenstd::string
.Mit anderen Quellen (Files, generell Streams) sähe die Sache anders aus. Aber auch das liesse sich leicht fixen, man kann ja den Zähler nachdem man bis N gezählt hat einfach wieder auf 0 setzen. Oder man verwendet einfach
long long
als Zähler. Das kann dann zwar theoretisch genau so überlaufen, aber praktisch halt nicht.und ob das wieder genau so teilbar ist wenn das Ding wieder bei der Null ankommt ist mir nicht schlüssig.
Wenn N nicht gerade eine 2er Potenz ist, dann tritt dabei sichr ein Fehler auf. Aber halt kein Pufferüberlauf.
EDIT: @hustbaer bei deinem Example seh ich auch wie du irgendwas immer weiter aufaddierst aber den Anker dazu find ich bei dir nicht. Hierzu also ein herzliches Hä zu deinem Hä.
Ich hab keine Ahnung was du mit Anker meinst.
w
zählt einfach wie viele Leerzeichen bisher (aktuelles Zeichen inklusive) bisher gefunden wurden.
-
Generell würde ich sowas auch mit Streams machen.
-
Ich nicht. Meiner Erfahrung nach ist es in vielen Fällen schwieriger C++ Streams dazu zu überreden genau das zu machen was man haben will, als den Code einfach ohne Streams selbst zu schreiben.
-
@hustbaer sagte in Frage zu Übungsaufgabe mit string:
Ich nicht. Meiner Erfahrung nach ist es in vielen Fällen schwieriger C++ Streams dazu zu überreden genau das zu machen was man haben will, als den Code einfach ohne Streams selbst zu schreiben.
Ach findest du.
Naja, im Sinne eines echten Wortes auszulesen und N Spaces zu skippen finde ich sind Streams wie geschaffen dafür was "jedes dritte Wort" angeht. Man kann sich aber natürlich auch mit Strings den Arm ausrenken, so wie ich es gemacht habe. Und natürlich nachbessern.
-
Ich bins.
-
@Ein-ehemaliger-Benutzer aka Großmaul aka @Maultasche sagte in Frage zu Übungsaufgabe mit string:
@hustbaer sagte in Frage zu Übungsaufgabe mit string:
Ich nicht. Meiner Erfahrung nach ist es in vielen Fällen schwieriger C++ Streams dazu zu überreden genau das zu machen was man haben will, als den Code einfach ohne Streams selbst zu schreiben.
Ach findest du.
Ja, finde ich. Die einfachsten Fälle gehen oft noch ganz OK. Aber was machst du wenn die Anforderung dazukommt dass der Stream nur bis zum nächsten Linebreak bearbeitet werden soll? Oder dass der Zähler beim Zeilenwechsel wieder bei 0 anfangen soll? Oder dass Interpunktionszeichen auch Wörter trennen sollen?
Naja, im Sinne eines echten Wortes auszulesen und N Spaces zu skippen finde ich sind Streams wie geschaffen dafür was "jedes dritte Wort" angeht. Man kann sich aber natürlich auch mit Strings den Arm ausrenken, so wie ich es gemacht habe. Und natürlich nachbessern.
Oder man kann eine recht elegante Stream-freie Lösung ohne Verrenkungen schreiben. Ausser natürlich man kann es nicht
-
Fuer die Nachwelt: Ich habe oben ein paar Beitraege entfernt. Ein ehemaliges Mitglied musste sein Ego reparieren, nachdem ihm widersprochen worden war.
Ich werde auch noch darauf hinweisen, dass nichts in @hustbaer's Beitraegen unfreundlich oder herablassend wirkt. Das @Grossmaul hat einfach sinnarme Beitraege verfasst, und @hustbaer hat widersprochen. Wenn man mit diesem Grad von "Konflikt" nicht klar kommt, hat man hier nix verloren.
Edit: Wir haben den Kasper mal gebannt. Wie geschmacklos, sich hier noch einmal temporaer anzumelden. Da sieht man mal, alter Hase hin oder her, Manieren lernen manche nie...