Array von Strings in Fortran 77
Ich habe eine Frage zu Fortran-77, und ich habe nicht in der Lage gewesen, eine Lösung zu finden.
Ich versuche zu speichern, ein array von strings wie folgt definiert:
character matname(255)*255
Wich ist ein array von 255 strings der Länge 255.
Später Las ich die Liste von Namen aus einer Datei und ich den Inhalt des array wie dieses:
matname(matcount) = mname
EDIT: Eigentlich mname
Wert ist harcoded als mname = 'AIR'
Typ character*255
es ist ein parameter von einer Funktion matadd()
wich führt der vorherigen Zeile. Aber das ist nur für die Prüfung, in der Zukunft wird es sein, aus einer Datei gelesen.
Später möchte ich es drucken mit:
write(*,*) matname(matidx)
Aber es scheint zu drucken alle 255 Zeichen, es druckt den string, der ich zugewiesen und eine Menge Müll.
- So, dass ist meine Frage, wie kann ich wissen, die Länge des Strings gespeichert?
- Sollte, habe ich ein weiteres array mit allen Längen?
- Und wie kann ich wissen, die Länge der Zeichenfolge Lesen?
Dank.
- +1 - Fortran? sind Sie ernst?
- Warum nicht ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Funktion Timotei geschrieben wird, geben Sie die Länge der Zeichenfolge, so lange als den Teil der Zeichenfolge, die Sie daran interessiert sind nur Leerzeichen enthält, das, wenn Sie bei der Zuordnung der Werte in das Programm sollte richtig sein, da FORTRAN soll zum initialisieren der Variablen, die leer sein, und für Zeichen, die bedeutet einen Platz.
Jedoch, wenn Sie beim Lesen aus einer Datei, Sie nehmen möglicherweise andere control-Zeichen am Ende der Zeilen (besonders carriage return und/oder line feed-Zeichen, \r und/oder \n je nach OS). Sie sollten auch werfen diese in die Funktion, um die richtige Länge der Zeichenfolge. Sonst könnte Euch ein paar lustige print-Anweisungen, wie diese Zeichen werden gedruckt als auch.
Hier ist meine version der Funktion, die prüft Alternative white space-Zeichen am Ende neben Räume.
Wenn es andere Charaktere in den "Müll" Abschnitt dieses immer noch nicht vollständig.
Vorausgesetzt, dass es funktioniert für Ihre Daten, jedoch, Sie können ändern Sie dann Ihre write-Anweisung wie folgt Aussehen:
und druckt es aus, nur den eigentlichen string.
Als zu ob oder nicht Sie sollten ein anderes array zu halten, die Längen der Zeichenfolge, das ist bis zu Ihnen. der strlen () - Funktion ist O(n) in der Erwägung, dass man sich die Länge in eine Tabelle O(1). Wenn Sie sich der Berechnung der Längen dieser statischen strings oft, es verbessert möglicherweise die Leistung zu berechnen, die Länge mal, wenn Sie Lesen, speichern diese in einem array und schaust Sie, wenn Sie Sie benötigen. Allerdings, wenn Sie nicht bemerken, die Verlangsamung, würde ich nicht darum kümmern.
character mname*(*)
. Vor, dem Ende, dass die variable, zufällig war Müll, jetzt wird er mit Leerzeichen aufgefüllt. Danke für die Erklärung, war sehr klärend. Auch ich wusste nicht, über die * - notation.Können Sie diese Funktion verwenden, um die Länge (ohne Schwanz leer)
Habe von hier: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html
PS: Wenn du sagst: matname(matidx) es wird der ganze string(256) chars... also das ist dein string plus-Rohlinge oder Müll
Abhängig vom compiler, dass Sie verwenden, Sie können möglicherweise verwenden Sie die
trim()
intrinsische Funktion entfernen Sie etwaige führende/nachfolgende Leerzeichen aus einer Zeichenfolge, dann verarbeiten Sie es, wie Sie normalerweise tun würde, d.h.drucken
:AIR:
.Bearbeiten:
Besser noch, es sieht aus wie es ist ein
len_trim()
Funktion gibt die Länge einer Zeichenfolge, nachdem es zugeschnitten wurde.intel und Compaq Visual Fortran die intrinsische Funktion LEN_TRIM(STRING) gibt die Länge ohne nachfolgende Leerzeichen oder Leerzeichen.
Wenn Sie möchten, zu unterdrücken, führende Leerzeichen oder Leerzeichen, verwenden Sie "Links Anpassen", d.h. ADJUSTF(STRING)
In dieser FORTRANs ich auch Hinweis eine nützliche Funktion: Wenn Sie eine Zeichenfolge übergeben, in einer Funktion oder Unterprogramm als argument übergeben, und innerhalb des Unterprogramms deklariert wurde als CHARACTER*(*), dann
mit der LEN(STRING) - Funktion im Unterprogramm retruns die tatsächliche Länge der Zeichenfolge übergeben, und nicht die Länge des Strings als deklariert in das aufrufende Programm.
Beispiel:
ZEICHEN*1000 STRING