按字符串长度COBOL连接字符串
需要将4个字符串连接到cobol中的目标变量 像 生成一个结果字符串按字符串长度COBOL连接字符串,cobol,Cobol,需要将4个字符串连接到cobol中的目标变量 像 生成一个结果字符串 "HI HOW ARE YOU?" 有谁能帮我一下吗?这里有一个工作示例,它可以满足您的需求: 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
"HI HOW ARE YOU?"
有谁能帮我一下吗?这里有一个工作示例,它可以满足您的需求:
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
.
识别部门。
程序ID。示例。
数据司。
工作和储存科。
01 WS-S1图X(10)值“高”。
01 WS-S2 PIC X(10)值“如何”。
01 WS-S3 PIC X(10)值“为”。
01 WS-S4图片X(10)值“你?”。
01 WS-CONCAT PIC X(43)值空间。
程序司。
主要段落。
由空格分隔的字符串WS-S1
“”由大小分隔
WS-S2由空格分隔
“”由大小分隔
WS-S3由空格分隔
“”由大小分隔
WS-S4由空格分隔
进入WS-CONCAT
端串
DISPLAY'>'WS-CONCAT'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
但我喜欢用answer分隔的字符串动词,因为它适用于大多数(如果不是全部的话)编译器
至于在函数参数列表中使用分号分隔符的原因,根据个人喜好,这并不是绝对必要的,因为它有时可以避免函数的潜在问题
还有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='how are'-由空格分隔,则只放置'how'。
以下是一些例子:
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工作图x(200)
希望这会有帮助
扎勒克试试这个。应该是平台独立的
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.
这并没有解决实际问题。您使用哪种COBOL编译器来支持为字符串显示的最终语法?这是非标准的。删除将空格移动到结果字符串文本
,更改将ws-s1移动到新字符串文本
到将ws-s1移动到结果字符串文本
。这将清除5500-
中的IF
。将与指针一起使用
可以去除保持字符串文本
。这将使段落的大小减少约1/3,使其更清晰,更易于维护。有些人,而不是我,会对整个事件使用引用修改。在实际的具体示例中,在保证没有嵌入空格的情况下,接受答案中简单的字符串
就足够了。当我用指针摸索的时候,我不确定每个人都会这么做。我不想让这听起来像是我给LCD程序员编写的代码,但我确实在想,是否有人有有限的COBOL经验,也许是来自另一种语言的人,已经漫游或被推入COBOL,他们可能会如何看待代码。引用修饰符的语法与子字符串不同,但它似乎更直观。带指针的我同意很少有人使用,或者知道如何使用:-)但是,它应该保持这样吗?让我们把液晶显示器调高。它的用途可以评论。与引用修改相比,字符串修改的优势在于编译器关注字段大小,而不是程序员关注(或不关注)字段大小。其他方法也可以做到这一点。请记住,许多人也发现或制造了复杂的COMPUTE
COMPUTE:-)
DISPLAY FUNCTION CONCATENATE(WS-S1 WS-S2 WS-S3 WS-S4)
DISPLAY FUNCTION CONCATENATE(WS-S1, WS-S2, WS-S3, WS-S4)
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'.
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 "
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.