按字符串长度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

需要将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 '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.