So löschen Sie die chars aus dem string, bis das erste Zeichen ist ein Buchstabe?
Ich habe ein Programm das mit Zeichenketten (Pascal). Nach der Lektüre ein string, wenn der erste char ist nicht ein Brief, dann brauche ich zum löschen aller ersten Zeichen, bis das erste ist ein Brief. Ich habe versucht zu schreiben, es mehrmals, aber immer es löscht alle string oder nichts.
Wenn das Programm liest, "123%^&abc" dann soll "abc"
In der ASCII-Tabelle Buchstaben sind aus 65..90 und 97..122
Dies ist, wie weit ich bin:
variables a: set of 65..90;
b: set of 97..122;
-------------------
bool:=false;
While (bool=false) do
begin
Writeln(s[1]);
If (Ord(s[1]) in a) or (Ord(s[1]) in b) then
begin
bool:=true;
end else
delete(s,1,1);
end;
Ich verstehe nicht, warum es nicht funktioniert?
Können Sie mir helfen mit diesem kleinen Eingriff? Danke.
Es ist schon eine Weile her, seit ich nicht getan habe, etwas Pascal, aber dein Programm scheint in Ordnung zu mir, können Sie fügen Sie die Ausgabe für einen gegebenen string ? Oder eventuell Fehler
Und, wie immer, füge ich die delphi-Tags, so dass deine Frage bekommen einige echte Aufmerksamkeit!
a und b sind nicht initialisierte Variablen. Nur weil Sie sind definiert als Sätze, die enthalten kann, die die Werte 65 bis 90 oder 97 bis 122, bedeutet nicht, dass alle diese bits sind tatsächlich eingestellt.
In der Tat, man muss schreiben
Danke, @JensG ! Ich dachte darüber nach, dass für fast 3 Jahre. Jetzt macht es Sinn 🙂
Und, wie immer, füge ich die delphi-Tags, so dass deine Frage bekommen einige echte Aufmerksamkeit!
a und b sind nicht initialisierte Variablen. Nur weil Sie sind definiert als Sätze, die enthalten kann, die die Werte 65 bis 90 oder 97 bis 122, bedeutet nicht, dass alle diese bits sind tatsächlich eingestellt.
In der Tat, man muss schreiben
const a = [65..90]; b = [97..122]
. Ich gehe davon aus, dass der OP das getan, aber Sie könnten Recht haben. Vielleicht ist der OP schrieb var a: set of 65..90; b: set of 97..122
, die erklärt a
und b
als Variablen, die durch spätere Zuordnung speichern kann beliebiger setzt der zahlen in den angegebenen Bereichen. Die Lektion, die OP könnte es sein, gehören der genaue code funktioniert nicht in der Frage, und nicht in pseudocode! (65..90
ist eine so genannte "Teilbereich-Typ"; daher set of 65..90
ist wie set of byte
aber mehr wählerisch über die Elemente.)Danke, @JensG ! Ich dachte darüber nach, dass für fast 3 Jahre. Jetzt macht es Sinn 🙂
InformationsquelleAutor va. | 2011-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie tun,
oder, wie ein Verfahren
Weitere ausgefeilte Methoden, die auch für die Arbeit mit Unicode in Delphi, siehe meine Antwort auf eine ähnliche Frage. [Dies entfernt alle nicht-alpha-chars aus dem string.]
Also, warum nicht Sie Ihren Algorithmus aus? Gut, es sollte funktionieren, und es funktioniert für mich. Beachten Sie aber, dass es geschrieben werden kann, in die etwas elegantere form
Ein problem, aber mit den OP ' s original-code ist, dass es scheitern wird, wenn
s
ist der leere string. In der Tat, danns[1]
existiert nicht. Es wird nicht funktionieren, wenns
besteht vollständig aus nicht-alpha-Zeichen (z.B.'!"#¤%
).Viel besseren Stil als die OP, aber genauso wie Sie, sehe ich keine Fehler im original-code.
Beachten Sie, dass ich mich darauf verlassen, boolean short-circuit-evaluation (BSCE) in der
if
- Anweisung in der letzten code-block. Ich bin nicht sicher, ob plain Pascal beschäftigt BSCE.OK, jemand ist downvoting auf jede Antwort, die ich geben... Gott, das ist reif...
Du hast Recht. Es ist nicht die rep-Punkte, obwohl-ich denke, es fühlt sich seltsam, wenn jemand scheinbar downvotes jede Antwort, die ich mache. Ich denke zu viel...
InformationsquelleAutor Andreas Rejbrand
Obwohl die bisherigen Lösungen funktionieren, Sie sind sehr ineffitient. Wegen 2 Gründen:
1. Suche in einem set ist zeitaufwendig
2. Löschen jedes mal, wenn ein Zeichen von einem string ist sogar noch ineffitient, als der string (Objekt) hat, entfernen Sie die Zeichen intern und passen Sie Ihre array, etc.
Idealerweise wandeln Sie Ihre string in PChar und die Arbeit mit, bei der überprüfung der char-Auswahl "manuell". Wir lasse die Suche laufen, bis wir finden, der erste Buchstabe und nur dann nennen wir die DeleteString-Methode. Hier ist eine demo auf meinen Ansatz:
Delete
anrufen (die sind in der Tat sehr ineffizient). Jedenfalls, dein code oben funktioniert nicht...Ich entschuldige mich. Sie rufen Sie nicht Löschen zu oft. Aber warum sagst du, dass mein code nicht funktionieren würde?
Ich habe es versucht. Es produziert
^&abc
, und nicht die erwartetenabc
. UPDATE: Aber ich war in solcher Eile, dann (um den bus zu erwischen)! In der Tat, es funktioniert nicht in Delphi 2009 und später (die Unicode)! Aber es nicht arbeiten mit reinem ANSI-strings! Meine Entschuldigung!InformationsquelleAutor fmotis