需要將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?"
任何人都可以請幫我嗎?
需要將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?"
任何人都可以請幫我嗎?
這裏是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? <
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)
語法也適用。
「空間分隔」存在問題。如果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
給這個旋轉。應該是平臺獨立的。
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.
將'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'就足夠了。 –
比爾,你說得很好。當我全心全意地指責,但我不確定每個人都這樣做。不要讓這聽起來像我對LCD編程人員的代碼,但我確實想到是否有人使用有限的COBOL體驗,可能是來自另一種語言並且已經漫遊或被推入COBOL的人,他們如何查看代碼。引用修飾符與SUBSTRING不具有可比較的語法,但看起來更直觀一些。 – Kennah
'WITH POINTER'我同意很少使用,或者會知道如何使用:-)但是,它應該保持那樣嗎?讓我們升起LCD。它的用途可以評論。 STRING優於引用修改的優點在於編譯器關注字段大小,而不是程序員這樣做(或不)。其他方式也可以。請記住,許多人都會發現或製作COMPUTE複雜的:-) –
這並沒有解決實際問題。您使用哪種COBOL編譯器支持您爲'STRING'顯示的最終語法?這是非標準的。 –