Eine Interpunktionszeichenfolge in C ++ wird gelöscht

8

Ok, bevor ich meine Frage stelle, möchte ich eines klarstellen. Ich bin zur Zeit Student an der NIU für Informatik und dies bezieht sich auf eine meiner Aufgaben für eine Klasse dort. Wenn jemand ein Problem hat, lesen Sie nicht weiter und machen Sie einfach weiter.

Nun für jeden, der bereit ist zu helfen, gibt es die Situation. Für meine aktuelle Aufgabe müssen wir eine Datei lesen, die nur ein Textblock ist. Für jedes Wort in der Datei müssen wir jede Interpunktion des Wortes löschen (zB: "can not" würde enden als "can" und "that - to" würde als "das" offensichtlich ohne die Anführungszeichen enden, Zitate wurden nur verwendet, um zu spezifizieren, was das Beispiel war).

Das Problem, das mir begegnet ist, ist, dass ich die Zeichenfolge sauber löschen und dann in die Map einfügen kann, die wir verwenden, aber aus irgendeinem Grund mit dem Code, den ich geschrieben habe, erlaubt sie das Einfügen einer leeren Zeichenfolge in die Karte. Jetzt habe ich alles versucht, was ich tun kann, um dies zu verhindern, und das Einzige, was mir einfällt, ist die Löschmethode innerhalb der Map-Struktur selbst.

Was ich also suche, sind zwei Dinge, irgendwelche Vorschläge, wie ich a) das beheben könnte, indem ich es einfach lösche und b) alle Verbesserungen, die ich an dem Code machen könnte, den ich bereits geschrieben habe.

Hier sind die Funktionen, die ich geschrieben habe, um aus der Datei zu lesen und dann die, die sie löscht.

Hinweis: Die Funktion, die aus der Datei einliest, ruft die Funktion clean_entry auf, um die Interpunktion zu löschen, bevor etwas in die Karte eingefügt wird.

Bearbeiten: Danke Chris. Zahlen sind erlaubt :). Wenn jemand Verbesserungen an dem Code, den ich geschrieben habe, oder irgendwelche Kritikpunkte an etwas, das ich getan habe, höre ich zu. In der Schule bekommen wir keine Rückmeldung über die richtige, richtige oder effizienteste Art Dinge zu tun.

%Vor%     
Brandon Haugen 22.09.2008, 18:07
quelle

4 Antworten

7

Das Problem mit leeren Einträgen ist in Ihrer while-Schleife. Wenn Sie eine leere Zeichenfolge erhalten, bereinigen Sie die nächste und fügen sie ohne Überprüfung hinzu. Versuchen Sie es zu ändern:

%Vor%

bis

%Vor%

BEARBEITEN: Ich stelle fest, dass Sie prüfen, ob die Zeichen alphanumerisch sind. Wenn Zahlen nicht zulässig sind, müssen Sie möglicherweise auch diesen Bereich erneut besuchen.

    
Chris Marasti-Georg 22.09.2008, 18:12
quelle
2

Weitere Verbesserungen wären

  • Deklarieren Sie Variablen nur, wenn Sie sie verwenden, und im innersten Bereich
  • Verwenden Sie C ++ - Style-Casts anstelle der C-Style (Int) -Casts
  • benutze leer () anstelle von length () == 0 Vergleiche
  • Verwenden Sie den Präfixinkrementoperator für die Iteratoren (d. h. ++mapzIter )
MP24 22.09.2008 18:27
quelle
1

Eine leere Zeichenfolge ist eine gültige Instanz der String-Klasse. Es ist also nichts Besonderes, sie in die Map einzufügen. Was Sie tun könnten, ist zuerst zu prüfen, ob es leer ist, und nur in diesem Fall zu erhöhen:

%Vor%

Stilweise gibt es ein paar Dinge, die ich ändern würde. Eine wäre es, sauber von clean_entry zurückzukommen, anstatt sie zu ändern:

%Vor%

Dies macht es klarer, was die Funktion macht (eine Zeichenkette nehmen und etwas basierend auf dieser Zeichenkette zurückgeben).

    
Eclipse 22.09.2008 18:17
quelle
1

Die Funktion 'getWords' macht viele verschiedene Aktionen, die in andere Funktionen aufgeteilt werden können. Es besteht eine gute Chance, dass Sie den Fehler selbst gefunden hätten, wenn Sie ihn in einzelne Teile aufgeteilt hätten.

Aus der Grundstruktur, denke ich, könntest du den Code in (mindestens) teilen:

  • getNextWord: Gibt das nächste (nicht leere) Wort aus dem Stream zurück (gibt false zurück, wenn keins übrig ist)
  • clean_entry: Was hast du jetzt?
  • getNextCleanWord: Ruft getNextWord auf und wenn 'true' ruft CleanWord auf. Gibt 'false' zurück, wenn keine Wörter mehr übrig sind.

Die Signaturen von 'getNextWord' und 'getNextCleanWord' könnten etwa wie folgt aussehen:

%Vor%

Die Idee ist, dass jede Funktion einen kleineren, deutlicheren Teil des Problems macht. Beispiel: 'getNextWord' führt nur das nächste nicht leere Wort aus (falls vorhanden). Dieses kleinere Stück wird daher ein einfacher Teil des Problems zu lösen und zu debuggen, wenn nötig.

Die Hauptkomponente von 'getWords' kann dann folgendermaßen vereinfacht werden:

%Vor%

Ein wichtiger Aspekt für die Entwicklung, IMHO, ist zu versuchen, das Problem zu teilen und zu überwinden. Teilen Sie es in die einzelnen Aufgaben auf, die stattfinden sollen. Diese Teilaufgaben sind einfacher zu erledigen und sollten auch einfacher zu warten sein.

    
Richard Corden 22.09.2008 19:08
quelle

Tags und Links