nachziehende spaces entfernen
-
void truncspace(std::string & str) { dword len = str.length(); while(len && str[len] == ' ') str[len--] = 0; }
wieso entfernt diese funktion nicht alle leerzeichen am ende von str?
-
string kann nullen enthalten. nicht wie c-strings, die nullterminiert sind, sondern eher wie pascal-strings, die ne längenangabe haben. was du hier machst, ist wohl lauter nullen reinfüllen.
und auf str[len] darfste wohl nicht zugreifen, weils eins zu weit hinten ist.
[ Dieser Beitrag wurde am 07.05.2003 um 00:33 Uhr von volkard editiert. ]
-
danke...
mach es jetzt so
void truncspace(std::string & str) { dword len = str.length() - 1; while(len && str[len] == ' ') len--; str = str.substr(0, len+1); }
-
habt ihr noch Verbesserungsvorschläge?
-
Original erstellt von <esskar>:
habt ihr noch Verbesserungsvorschläge?zuerst schauen, wie viel leerzeichen am ende sind und dann auf einen schlag mit .erase weghauen.
es riecht irgendwie nach str.erase(str.find_first_not_of(' '));, aber bei sowas irre ich mich dauernd. guck mal in handbuch, ob sowas klappen würde.
-
Wie wärs damit
void truncspace(std::string & str) { string::reverse_iterator RIter=str.rbegin() ; if ((*RIter)==' ') { for (;RIter!=str.rend();++RIter) { if (*RIter!=c) break; } if (RIter==str.rbegin()) str.erase(RIter.base()) ; else str.erase(RIter.base(),str.rbegin().base()) ; } }
-
Aus meiner str.h:
void trimright(std::string& t) { size_t p = t.find_last_not_of(" \t"); p = (p == string::npos) ? 0 : p+1; t.erase( t.begin() + p, t.end() ); }
-
void trimright(std::string& t)
{
size_t p = t.find_last_not_of(" \t");
p = (p == string::npos) ? 0 : p+1;
t.erase( t.begin() + p, t.end() );
}chön
Nur eins:
t.erase( t.begin() + p, t.end() );
Ein
t.erase(p);
tut's auch.
-
p = (p == string::npos) ? 0 : p+1;
diese Zeile ist ganz und garnicht schön. könnt ihr nicht vernünftigen code schreiben?
-
Was gibbet daran auszusetzen
?
-
Original erstellt von <chön>:
**p = (p == string::npos) ? 0 : p+1;
diese Zeile ist ganz und garnicht schön. könnt ihr nicht vernünftigen code schreiben?**
Wieso? Für solche simplen abhängigen Zuweisungen hat man doch den ?-Ausdruck.
@HumeSikkins
Ah, jo. Danke für den Hinweis.[ Dieser Beitrag wurde am 07.05.2003 um 15:21 Uhr von DrGreenthumb editiert. ]
-
Original erstellt von DrGreenthumb:
**Wieso? Für solche simplen abhängigen Zuweisungen hat man doch den ?-Ausdruck.
**schlimm.
sobald was mal einfach zu lesen wäre kommen hier die stil-mörder und machens kompliziert, "weils sonst zu einfach wäre".
-
Original erstellt von volkard:
schlimm.
sobald was mal einfach zu lesen wäre kommen hier die stil-mörder und machens kompliziert, "weils sonst zu einfach wäre".hm. Meinst du mit stil-mörder jetzt mich oder <chön>?
Bin zwar auch kein Fan von übermäßigen ?:-Konstrukten aber hier fand ich's ok.
-
Original erstellt von DrGreenthumb:
**hm. Meinst du mit stil-mörder jetzt mich oder <chön>?
**dich. also mich gruselt's, wenn ich da ein ?: sehe.
-
dich. also mich gruselt's, wenn ich da ein ?: sehe.
Mich gruselts wenn ich "gruselt's" sehe.
Aber um mal auf den Code zurückzukommen:
es riecht irgendwie nach str.erase(str.find_first_not_of(' '));,
Das sieht natürlich hübsch aus. Hat aber den Nachteil, dass es vorne abschneidet, nicht hinten.
str.erase(str.find_last_not_of(' ')
sieht auch toll aus, ist aber leider semantisch falsch.
str.erase(str.find_last_not_of(' ')+1
Hübsch. Nur doof in Randfällen.
Bleiben noch explizite Schleifen. Warum die aber schöner sein sollen als die Anwendung des ternären Operators ist mir nicht klar.
Oder ist das mal wieder einer nach dem Motto:
a) STL ist scheiße, also ist auch dies hier scheiße (obwohl die zugegeben sehr häßliche string-Klasse strenggenommen nicht zur STL gehört)
oder
b) Ich verstehe den ternären Operator nicht, also müssen alle Menschen auf den Einsatz des selbigen verzichten und immer schön if-else benutzen."weils sonst zu einfach wäre".
Was wäre denn dein konkreter Vorschlag?
PS: Jetzt wo ich drüber nachdenke halte ich den Code für unnötig kompliziert.
Es reicht ein if, ein else ist unnötig.void trimright(std::string& t) { size_t p = t.find_last_not_of(" \t"); if (p < t.length()) t.erase(++p); }
-
Ist das mit "gruselts" neue Rechtschreibung oder einfach Unsinn?
-
[ Dieser Beitrag wurde am 07.05.2003 um 17:28 Uhr von volkard editiert. ]
-
Ist das mit "gruselts" neue Rechtschreibung oder einfach Unsinn?
Letzteres. Ich bin mittlerweile derart betriebsblind, dass ich nicht mal mehr raffe, dass "mich gruselt's" von mich "gruselt es" kommt und das Apostroph damit völlig zurecht dort steht.
-
Original erstellt von HumeSikkins:
Oder ist das mal wieder einer nach dem Motto:
a) STL ist scheiße, also ist auch dies hier scheiße (obwohl die zugegeben sehr häßliche string-Klasse strenggenommen nicht zur STL gehört)Hab den ?: angemeckert, aber selber find_first_of oder sowas vorgeschlagen.
b) Ich verstehe den ternären Operator nicht, also müssen alle Menschen auf den Einsatz des selbigen verzichten und immer schön if-else benutzen.
Das hat nix mit verstehen zu tun. Bist du jetzt auch auf dem level, daß du gerne komplizierten code baust und jedem, der ihn anmeckert sagtst "tja, wer kein c++ kann, der soll meinen code nicht lesen".
"weils sonst zu einfach wäre".
Was wäre denn dein konkreter Vorschlag?
Na, auf jeden Fall if/else. Und mit ein wenig glück knn man dann, nachdem der code durch if/else leichter lesbar und veränderbar wurde, sogar noch ne signifikante vereinfachung finden. aber das haste ja schon.
-
Bist du jetzt auch auf dem level, daß du gerne komplizierten code baust und jedem, der ihn anmeckert sagtst "tja, wer kein c++ kann, der soll meinen code nicht lesen".
Mein Level hat sich nicht verändert. Und ich freue mich nach wie vor über jede ernsthafte Kritik. Besonders da ich noch nie mit meinem Code zufrieden war, aber selten weiß, wie ich es besser machen könnte.
Einen Satz wie "tja, wer kein c++ kann, der soll meinen code nicht lesen" würde ich nie sagen. Einen Satz wie "tja, wer den ternären Operator nicht versteht, der sollte schleunigst ein gutes Buch zur Hand nehmen und an seinem Verständnis arbeiten" aber dafür ganz bestimmt.
Und ich sehr wirklich nicht, warum ein
if (p == string::npos) return Elefant; else return Huhn;
in irgendeiner Form besser zu lesen sein soll, als ein:
return p == string::npos ? Elefant : Huhn;
Ganz im Gegenteil.
Der ternäre Operator hat IMO einen Sinn.
Ist für mich wie mit dem i = i+1 vs. ++i (bzw. i++)[ Dieser Beitrag wurde am 07.05.2003 um 18:33 Uhr von HumeSikkins editiert. ]