2012-12-20 232 views
5

需要將4個字符串連接到cobol中的目標變量。按字符串連接字符串COBOL

一樣,

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?". 

到結果字符串

"HI HOW ARE YOU?" 

任何人都可以請幫我嗎?

回答

20

這裏是STRING verb的工作示例已經做了你在找什麼:

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 
     . 

輸出是:

>HI HOW ARE YOU?       < 
2

OpenCOBOL具有固有功能的擴展,CONCATENATE。

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

但我喜歡STRING動詞DELIMITED BY答案,因爲它可以適用於大多數(如果不是全部的話)編譯器。

至於對函數參數列表內部分號分隔符的原因,它不是絕對必要的,看個人喜好,因爲它有時可避免潛在問題

SPECIAL-NAMES. 
DECIMAL POINT IS COMMA. 

和COBOL,作爲穩健詞法動物,它是

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

語法也適用。

0

「空間分隔」存在問題。如果ws-s1 ='怎麼樣' - 由空格分隔只會放'如何'。 下面是一些例子:

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-工作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  " 

希望它能幫上忙。

zalek

+0

這並沒有解決實際問題。您使用哪種COBOL編譯器支持您爲'STRING'顯示的最終語法?這是非標準的。 –

0

給這個旋轉。應該是平臺獨立的。

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

將'MOVE SPACES放到結果字符串文本'中,將'MOVE ws-s1 TO new-string-text'改爲'MOVE ws-s1 TO result-string-text'。這會擺脫'5500-'中的'IF'。使用'WITH POINTER'可以擺脫'hold-string-text'。這會將您的段落大小減少約1/3,使其更易於維護。有些人,而不是我,會對整個事情使用引用修改。在具體的例子中,保證沒有嵌入空格,在接受的答案中簡單的'STRING'就足夠了。 –

+0

比爾,你說得很好。當我全心全意地指責,但我不確定每個人都這樣做。不要讓這聽起來像我對LCD編程人員的代碼,但我確實想到是否有人使用有限的COBOL體驗,可能是來自另一種語言並且已經漫遊或被推入COBOL的人,他們如何查看代碼。引用修飾符與SUBSTRING不具有可比較的語法,但看起來更直觀一些。 – Kennah

+0

'WITH POINTER'我同意很少使用,或者會知道如何使用:-)但是,它應該保持那樣嗎?讓我們升起LCD。它的用途可以評論。 STRING優於引用修改的優點在於編譯器關注字段大小,而不是程序員這樣做(或不)。其他方式也可以。請記住,許多人都會發現或製作COMPUTE複雜的:-) –