2016-08-05 11 views
-2

Angenommen, ich habe eine Variable PIC X(20).Ermitteln Sie die Länge eines Strings

Die Variable enthält einen Wert, z. ABC WXYZ.

Wie kann man die Länge des Strings ohne den Zwischenraum herausfinden?

+0

Was haben Sie versucht, so weit Wenn nichts, man sollte dies zumindest suchen Website als String-Verarbeitung ist ein paar Mal gekommen, und es gibt Ideen, um Sie st zu bekommen artisiert. Wenn Sie dann stecken bleiben, können Sie eine bessere, spezifischere Frage stellen. – lurker

+0

@ Maxcc0 Funktioniert die angegebene Antwort für Sie? Wenn ja: Bitte als Antwort markieren, falls nein: Bitte kommentieren Sie die Antwort, die Sie vermissen. –

Antwort

1

Wenn Sie wirklich sicher sind, dass Sie in nicht den Raum wollen zwischen Ihnen Test-val definieren und verwenden diese in PERFORM:

77 some-len PIC 9(02). *> make sure to use appropriate length, if "big" use COMP-5 
    77 string-ptr PIC 9(02). *> make sure to use appropriate length 
    77 some-var PIC X(20) VALUE ' ABC WXYZ'. 
    77 var-len PIC 9(02) VALUE LENGTH OF some-var. 
    01 test-char PIC X. 
     88 no-spaces values 'A' THROUGH 'Z' 
          'a' THROUGH 'z' 
          '0' THROUGH '9' 
          '-', '.'. 

    PROCEDURE DIVISION. 

     MOVE 0 TO some-len 
     PERFORM VARYING string-ptr FROM 1 BY 1 
       UNTIL string-ptr > var-len 
      MOVE some-var (string-ptr) TO test-char 
      IF no-spaces ADD 1 TO some-len END-IF 
     END-PERFORM 

Wie Bill wies darauf hin, wenn Sie wissen wollen, die „keine Leerzeichen“ Zeichen gibt es eine schnellere Möglichkeit, die weniger vars muss (stellen Sie sicher, dass Sie diese im Stich gelassen kommentieren Sie und andere wissen, was das bedeutet:

*> set numbers of all non-spaces in some-len 
     MOVE 0 TO some-len 
     INSPECT some-var TALLYING some-len FOR ALL SPACES 
    *> add more counts here if you want to remove more chars like x'0D'/x'0A'/x'00', ... 
    *> INSPECT some-var TALLYING some-len FOR ALL x'00' 
    *> INSPECT some-var TALLYING some-len FOR ALL x'0D' 
    *> INSPECT some-var TALLYING some-len FOR ALL x'0A' 
    *> and finally subtract it from the fields length 
     SUBTRACT some-len FROM LENGTH OF some-var GIVING some-len 
    *> 
+0

Zur Information, der Benutzername Maxcc0 Tipps und Mainframe, und in der Tat einen kurzen Blick auf ihr Profil enthüllt ein Mainframe-Tag. Und natürlich erinnere ich mich an ihre vorherige Frage. Also 78 wird nicht funktionieren. COMP-5 wäre schlecht, wenn es nicht gebraucht würde (es ist nicht hier). Warum nicht einfach die Räume zählen? INSPEKT ... TALLING zum Beispiel. –

+0

@BillWoodger: Die Informationen des Maxcc0-Benutzerprofils sind nicht Teil der Frage :-) Ich habe die Quelle geändert, um das 'LENGTH OF'-Sonderregister anstelle der Erweiterung der Stufe 78 zu verwenden und die Option INSPECT hinzugefügt. –

+0

Danke für die Vorschläge. INSPECT wird gut funktionieren :). – Maxcc0