Anzahl der Zeichen einer Zeichenkette, ohne die enthaltenen Leerzeichen mitzuzählen
-
Hi,
ich habe folgendes Problem:
1.) Length() zählt lehrzeichen
ich möchte alle Zeichen, ausgenommen der
Leerzeichen zählen. z.B.:
"a s ddd" => Length() zählt 7 Zeichen
ich will aber, das er nur die realen Zeichen zählt
=> 5 ZeichenP.S.: "Trim" bringt michnicht weiter.
Freue mich über eure Lösungsvorschläge
Mfg
-
Weiss zwar nicht ob es noch anders geht, aber bisher hab ich es immer so gemacht.
int spc; while(spc=text.Pos(" ")) text.Delete(spc,1);
-
Hallo guten Morgen,
auf diese Weise muß den String nicht verändern:void __fastcall TForm1::Button1Click(TObject *Sender) { char* cstr = "1 2 3 4 5 6 7 8 9 0"; int i; int iCount; AnsiString astr = "1 2 3 4 5 6 7 8 9 0"; iCount = 0; for (i = 0; i < strlen(cstr); i++) if(cstr[i] != ' ') iCount++; iCount = 0; for (i = 1; i <= astr.Length(); i++) if(astr[i] != ' ') iCount++; }
Viel Erfolg
Evi48
-
Ihr sollte Euch dringend
1. mal näher mit C/C++ beschäftigen
und
2. mit den Methoden von AnsiStringHier 2 Lösungsbeispiele:
// Lösung rein mit AnsiString Methoden int x, strlen, count; AnsiString str("a b cde"); strlen=str.Length(); count=0; for(x=1; x<=strlen; x++) { if(str[x]!=' ') count++; } ShowMessage("Anzahl Zeichen in '"+str+"' = "+IntToStr(count));
// Lösung mit Pointer int count; char c, *p; AnsiString str("a b cde"); count=0; for(p=str.c_str(); (c=*p)!=0; p++) { if(c!=' ') count++; } ShowMessage("Anzahl Zeichen in '"+str+"' = "+IntToStr(count));
-
Ihr sollte Euch dringend
1. mal näher mit C/C++ beschäftigen
und
2. mit den Methoden von AnsiStringa. Da er schon mit Trim rumexperimentiert hat, bin ich (vielleicht etwas voreilig)davon ausgegangen, das er die Leerzeichen aus seinem String löschen wollte.
b. Erstmal solltest du dich selber erstmal Standard C++ (vor allem die STL) anschauen.Zum zählen das einfachste Lösungsbeispiel:
[code]
#include <algorithm.h>AnsiString str="a b c d e f"; ShowMessage("Anzahl Zeichen in '"+str+"' = "+IntToStr(count(&str[1],&str[str.Length()],' ')));
-
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 ...
-
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.