2012-12-20 5 views
5

Sie müssen 4 Zeichenfolgen an eine Zielvariable in Cobol verketten.Zeichenfolge durch ihre Länge verketten COBOL

Wie,

01 WS-S1 X(10) VALUE "HI ". 
01 WS-S2 X(10) VALUE "HOW ". 
01 WS-S3 X(10) VALUE "ARE ". 
01 WS-S4 X(10) VALUE "YOU?". 

zu einem resultierenden String

"HI HOW ARE YOU?" 

Kann mir jemand bitte helfen?

Antwort

20

Hier ist ein funktionierendes Beispiel für die STRING verb das tut, was Sie suchen:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. EXAMPLE. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 WS-S1 PIC X(10) VALUE 'HI '. 
    01 WS-S2 PIC X(10) VALUE 'HOW '. 
    01 WS-S3 PIC X(10) VALUE 'ARE '. 
    01 WS-S4 PIC X(10) VALUE 'YOU?'. 
    01 WS-CONCAT PIC X(43) VALUE SPACES. 
    PROCEDURE DIVISION. 
    MAIN-PARAGRAPH. 
     STRING WS-S1 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S2 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S3 DELIMITED BY SPACE 
       ' ' DELIMITED BY SIZE 
       WS-S4 DELIMITED BY SPACE 
      INTO WS-CONCAT 
     END-STRING 
     DISPLAY '>' WS-CONCAT '<' 
     GOBACK 
     . 

Ausgang ist:

>HI HOW ARE YOU?       < 
2

OpenCOBOL eine eigene Funktion Erweiterung hat, verketten.

DISPLAY FUNCTION CONCATENATE(
    FUNCTION TRIM(WS-S1); SPACE; 
    FUNCTION TRIM(WS-S2); SPACE; 
    FUNCTION TRIM(WS-S3); SPACE; 
    FUNCTION TRIM(WS-S4)) 
END-DISPLAY 

aber ich mag die STRING Verb DELIMITED BY Antwort, wie es mit den meisten, wenn nicht alle, Compiler funktioniert.

Was den Grund für Semikolon Trennzeichen innerhalb FUNCTION Parameterlisten, ist es nicht unbedingt erforderlich, persönliche Vorlieben, wie es manchmal potenzielle Probleme mit

SPECIAL-NAMES. 
DECIMAL POINT IS COMMA. 

und COBOL vermeidet, die robust sein lexikalisches Tier, das es ist

DISPLAY FUNCTION CONCATENATE(WS-S1 WS-S2 WS-S3 WS-S4) 
DISPLAY FUNCTION CONCATENATE(WS-S1, WS-S2, WS-S3, WS-S4) 

Syntax funktioniert auch.

0

Es gibt ein Problem mit "durch Leerzeichen begrenzt". Wenn ws-s1 = 'wie ist' - durch den Raum begrenzt, wird nur 'wie' gesetzt. Hier sind einige Beispiele:

01 ws-string-test. 
03 y1    pic x(10) value 'y1 a'. 
03 y2    pic x(10) value 'y2 b'. 
03 y3    pic x(10) value 'y3 c'. 

01 ws-Arbeit pic x (200).

 move spaces to ws-work 
     string y1 delimited by size 
       y2 delimited by space 
       y3 delimited by size 
       into ws-work. 
     ws-work = "y1 a  y2y3 c    " 

     move spaces to ws-work 
     string y1 
       y2 
       y3 
       delimited by size into ws-work 
     ws-work = "y1 a  y2 b   y3 c   " 


     string y1 
       y2 
       y3 
       delimited by spaces into ws-work. 
     ws-work = "y1y2y3 

     string y1 y2 y3 into ws-work by csv-format. 
     ws-work = "y1 a,y2 b,y3 c  " 

Ich hoffe, es wird helfen.

zalek

+0

Dies betrifft nicht die eigentliche Frage. Welchen COBOL-Compiler benutzen Sie für die Unterstützung der endgültigen Syntax, die Sie für 'STRING' anzeigen? Es ist nicht Standard. –

0

Geben Sie diesem einen Wirbel. Sollte plattformunabhängig sein.

DATA DIVISION. 

    WORKING-STORAGE SECTION. 

    01 result-string-text   X(100). 
    01 result-string-length   9(03). 
    01 result-string-datalength  9(03). 

    01 new-string-text    X(20). 
    01 new-string-length   9(03). 
    01 new-string-datalength  9(03). 

    01 hold-string-text    X(100). 

    01 trailing-space-count   9(03). 

    PROCEDURE DIVISION. 

     MOVE SPACES TO result-string-text. 
     MOVE FUNCTION LENGTH(result-string-text) TO result-string-length. 
     MOVE FUNCTION LENGTH(new-string-text) TO new-string-length. 

     MOVE ws-s1 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s2 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s3 TO new-string-text. 
     PERFORM 5500-concatenate. 

     MOVE ws-s4 TO new-string-text. 
     PERFORM 5500-concatenate. 

    5500-concatenate. 
     MOVE ZERO TO trailing-space-count 
     INSPECT FUNCTION REVERSE(result-string-text) TALLYING trailing-space-count FOR LEADING ' ' 
     COMPUTE result-string-datalength = result-string-length - trailing-space-count 

     IF (result-string-datalength > ZERO) 
      MOVE ZERO TO trailing-space-count 
      INSPECT FUNCTION REVERSE(new-string-text) TALLYING trailing-space-count FOR LEADING ' ' 
      COMPUTE new-string-datalength = new-string-length - trailing-space-count 

      MOVE SPACES TO hold-string-text 
      STRING 
       result-string-text(1:result-string-datalength) 
       ' ' 
       new-string-text(1:new-string-datalength) 
        DELIMITED BY SIZE 
      INTO 
       hold-string-text 
      END-STRING 

      MOVE hold-string-text to result-string-text 
     ELSE 
      MOVE new-string-text TO result-string-text 
     END-IF. 
+0

Löschen Sie die 'MOVE SPACES TO Ergebnis-String-Text', ändern Sie' MOVE ws-s1 zu neuen String-Text' in 'MOVE ws-s1 TO Ergebnis-String-Text'. Dies wird dein 'IF' in der' 5500-'verschwinden lassen. Mit 'MIT POINTER' wird 'hold-string-text' entfernt. Dadurch wird die Größe Ihres Absatzes um etwa 1/3 reduziert, wodurch er klarer und einfacher zu pflegen ist. Einige, nicht ich, würden für die ganze Sache Referenzmodifikationen verwenden. Im konkreten konkreten Beispiel, mit der Garantie, dass keine eingebetteten Leerzeichen vorhanden sind, genügt das einfache "STRING" in der akzeptierten Antwort. –

+0

Sie machen ausgezeichnete Punkte, Bill. Während ich mit POINTER in vollem Umfang herumkomme, bin ich mir nicht sicher, ob es jeder tut. Ich möchte nicht, dass es so klingt, als würde ich den LCD-Programmierer programmieren, aber ich denke darüber nach, ob jemand mit eingeschränkter COBOL-Erfahrung, vielleicht jemand, der aus einer anderen Sprache kam und in COBOL gedrängt wurde, den Code sieht.Ein Referenzmodifikator ist nicht mit SUBSTRING vergleichbar, aber er scheint etwas intuitiver zu sein. – Kennah

+0

Die 'MIT POINTER' stimme ich zu, dass nur wenige verwenden, oder würde wissen, wie man verwendet :-) Aber sollte es so bleiben? Lassen Sie uns das LCD anheben. Seine Verwendung kann kommentiert werden. Der Vorteil von STRING gegenüber der Referenzmodifikation besteht darin, dass der Compiler die Feldgrößen verwaltet und nicht der Programmierer (oder nicht). Andere Möglichkeiten, es auch zu tun. Denken Sie daran, dass viele "COMPUTE" -Komplexe ebenfalls finden oder machen :-) –