Anzahl der Zeichen einer Zeichenkette, ohne die enthaltenen Leerzeichen mitzuzählen



  • Sorry.

    include <algorithm.h>
    
    AnsiString str="a b c d e f";
    ShowMessage("Anzahl Zeichen in '"+str+"' = "+IntToStr(count(&str[1],&str[str.Length()]+1,' ')));
    

    Hatte ich etwas schnell geschrieben ... 😉



  • streamer schrieb:

    Hatte ich etwas schnell geschrieben ...

    Beim zweiten Versuch scheinst du dir auch nicht mehr Zeit genommen zu haben, zumindest nicht die Zeit für einen ordentlichen Test ...



  • @Jansen

    Kanns sein, das du nicht über C++ Builder 6 (Pro) verfügst ?
    Code funktioniert einwandfrei .... :p



  • Ziel war das Ermitteln der Anzahl der Nicht-Leerzeichen eines Strings, also fehlt ja mindestens ein Schritt.



  • Kennst du nicht AnsiString Methode Length() ?

    Length()-count(&str[1],&str[str.Length()]+1,' ')
    


  • bzw kennst du den Begriff "invertieren" nicht ??? 😉



  • Der Punkt ist, dass deine Lösung nicht nennenswert "einfacher" ist als z.B. die von Peter, auch wenn du versuchst, es durch das Zusammenquetschen in eine Zeile und das Auslassen von vermeintlich selbstverständlichen Schritten einfacher aussehen zu lassen.
    Noch dazu ist Peters Zeiger-Variante ungefähr doppelt so schnell wie dein count.

    Also bitte etwas zurückhaltender beim Empfehlen bestimmter Beschäftigungen! 😉



  • Der Punkt hier ist nicht schnelligkeit, was hierbei wohl eine stark untergeordnete Rolle spielt.
    Du scheinst dich selber auch nicht so mit der STL und damit dem was C++ eigentlich ausmacht auszukennen.
    Ist echt der Brüller (Ein Moderator der von der Verwendung der STL abrät) 👎



  • Also bitte etwas zurückhaltender beim Empfehlen bestimmter Beschäftigungen!

    Also bitte etwas zurückhaltender bei Äusserungen bezüglich C++.



  • streamer schrieb:

    Der Punkt hier ist nicht schnelligkeit, was hierbei wohl eine stark untergeordnete Rolle spielt.

    Eben deshalb habe ich das auch nur nebenbei erwähnt und statt dessen hauptsächlich die von dir behauptete "Einfachheit" der count-Variante in Frage gestellt.
    Und was ein Glück, dass ich die Geschwindigkeit nicht zu meinem Hauptargument gemacht hatte, denn bei längeren Strings (>30 Zeichen) fällt Peters Lösung wieder zurück.

    Davon abgesehen wirkt deine Lobpreisung der STL wenig überzeugend, wenn du gleichzeitig z.B. die Verwendung von AnsiString::Length() empfiehlst.



  • Deine Ausflüchte sind echt erbärmlich. 👎

    Hier für dich eine "verständlichere Version":

    AnsiString str="a b c d e f";
    int co=count(&str[1],&str[str.Length()]+1,' ');//Für Jansen: int für enthaltene Leerzeichen(Achtung verwendet STL)
    int len=str.Length();//Für Jansen: int für Gesamtlänge des Strings
    int inv=len-co;//Für Jansen: Ausrechnen Zeichen ohne Leerzeichen
    ShowMessage("Anzahl Zeichen in '"+str+"' = "+IntToStr(inv));
    

    Die count Variante dürfte wesentlich "einfacher" und C++ typischer sein als eine Schleifen-Variante. 😉

    Davon abgesehen wirkt deine Lobpreisung der STL wenig überzeugend, wenn du gleichzeitig z.B. die Verwendung von AnsiString::Length() empfiehlst.

    Length() ist eine Methode der Klasse AnsiString. Das solltest du eigentlich wissen. Wenn man AnsiString verwendet, kann man diese der einfachheit halber auch verwenden.
    AnsiString verfügt aber über keine count Methode. 😉
    Warum sollte man dann also nicht einfach auf count zurückgreifen ?



  • streamer schrieb:

    Deine Ausflüchte sind echt erbärmlich.

    Erbärmlich sind deine Versuche, die Diskussion subjektiv zu führen.

    Selbstverständlich kann man auf count zurückgreifen, es ist halt nicht "einfacher" als eine Schleife.



  • Erbärmlich sind deine Versuche, die Diskussion subjektiv zu führen.

    Du hast doch keine vernünftigen Gründe gegen eine Verwendung von count vorzubringen.
    Es ist halt kürzer,einfacher und C++ typischer.

    punkt...aus...schluss.

    Ps.:

    Du hast doch mit stänkern angefangen.



  • Kürzer? Wieso? Intern macht ja count nichts anderes als das was hier erwähnt wurde. Einfacher muss es auch nicht wirklich sein, nur bequemer ist es sicher. Und mit "C++ typischer" hat die Verwendung der STL gar nicht szu tun. Im Gegenteil. Die Verwendung der STL kann unter Umständen - bei Anwendung ohne gewisse Regeln zu beachten - grauenhafte Einschnitte bei der Ressourcen-Performance verursachen.

    Und mit diesem kindischen "er hat angefangen" brauchst du eigentlich gar nicht erst einen Versuch zu starten.
    Wer nichts sinnvolles mehr zum Titelthema beizutragen hat schweigt ab sofort.

    Punkt schluss. -> Volltreffer. Schluss jetzt mit der OT Diskussion.

    -junix



  • Nun hatte ich mir gerade ein unschlagbares Schlussplädoyer zurechtgelegt ... aber na gut. 😉



  • @Hilfsverteidiger Junix

    Und mit "C++ typischer" hat die Verwendung der STL gar nicht szu tun.

    Was währe C++ ohne die STL ?

    Die Verwendung der STL kann unter Umständen - bei Anwendung ohne gewisse Regeln zu beachten - grauenhafte Einschnitte bei der Ressourcen-Performance verursachen.

    Da kann ich dir nur zustimmen ...



  • @Jansen

    unschlagbar ?
    Wohl kaum ..... 🙄

    Aber lassen wir das.



  • Hallo,

    hier noch eine Möglichkeit ohne Schleife/STL

    AnsiString str="xshghkdgf dshfg dfhgd fdhg df g";
    int izc = StringReplace(str, " ", "",  TReplaceFlags() << rfReplaceAll).Length();
    ShowMessage("Anzahl Zeichen in '"+str+"' = "+IntToStr(izc));
    


  • Viel zu kompliziert. 🤡

    Jansen bevorzugt eindeutig Schleifen ......



  • Von den drei bzw. vier Varianten hier würde ich selbst mit einiger Wahrscheinlichkeit StringReplace verwenden, ich bin ein grosser Fan dieser Funktion.

    Trotz dieser Vorliebe würde ich aber weder explizit noch implizit behaupten, dass StringReplace "einfacher" als andere Lösungen ist. 😉


Anmelden zum Antworten