在COBOL中连接字符串,而没有前导或尾随空格

时间:2018-08-28 07:22:53

标签: string concatenation trim cobol

我在执行此任务时遇到问题;我们的任务是连接两个字符串,两个字符串之间不要有空格,例如:

输入Alphanum。 。 1:此字符串为
输入Alphanum。 。 2:级联。
输入Alphanum。 。 3:

Alphanum。输出1:此字符串是串联的。
Alphanum。输出2:

我可以将这两个字符串放到输出中,但是它们之间不会留有空格,不会相互连接。

2 个答案:

答案 0 :(得分:2)

因此,假设您不知道两个字符串的长度,则需要执行以下操作:

01 WS-INPUT-STRINGS.
   05 WS-STRING1 PIC X(100) VALUE "THIS STRING IS".
   05 WS-STRING2 PIC X(100) VALUE "CONCATENATED".
   05 WS-STRING3 PIC X(100) VALUE SPACES.
01 WS-OUTPUT-STRINGS.
   05 WS-CONCATENATED-OUTPUT PIC X(300) VALUE SPACES.
01 WS-COUNTERS.
   05 WS-LEN-IN PIC 9(4) COMP VALUE 1.
   05 WS-POS    PIC 9(4) COMP VALUE 1.

IF WS-STRING1 NOT EQUAL SPACES OR LOW-VALUES
   PERFORM VARYING WS-LEN-IN
              FROM 100 BY -1
             UNTIL WS-STRING1(WS-LEN-IN:1) 
                   NOT EQUAL (SPACES OR LOW-VALUES) OR
                   WS-LEN-IN = 1
    END-PERFORM
    MOVE WS-STRING1(1:WS-LEN-IN)
      TO WS-CONCATENATED-OUTPUT(WS-POS:WS-LEN-IN)
    ADD WS-LEN-IN TO WS-POS
END-IF
IF WS-STRING2 NOT EQUAL SPACES OR LOW-VALUES
   PERFORM VARYING WS-LEN-IN
              FROM 100 BY -1
             UNTIL WS-STRING2(WS-LEN-IN:1) 
                   NOT EQUAL (SPACES OR LOW-VALUES) OR
                   WS-LEN-IN = 1
    END-PERFORM
    MOVE WS-STRING2(1:WS-LEN-IN)
      TO WS-CONCATENATED-OUTPUT(WS-POS:WS-LEN-IN)
    ADD WS-LEN-IN TO WS-POS
END-IF
IF WS-STRING3 NOT EQUAL SPACES OR LOW-VALUES
   PERFORM VARYING WS-LEN-IN
              FROM 100 BY -1
             UNTIL WS-STRING3(WS-LEN-IN:1) 
                   NOT EQUAL (SPACES OR LOW-VALUES) OR
                   WS-LEN-IN = 1
    END-PERFORM
    MOVE WS-STRING3(1:WS-LEN-IN)
      TO WS-CONCATENATED-OUTPUT(WS-POS:WS-LEN-IN)
    ADD WS-LEN-IN TO WS-POS
END-IF
DISPLAY WS-CONCATENATED-OUTPUT(1:WS-POS)

您可以将其放在一个段落中并一遍又一遍地执行,但是我这样做是为了确切说明它在进行什么。当您在COBOL中定义图片子句时,它将始终保持该长度,因此,如果我只是尝试将3个变量串在一起,则它们之间将有大量的额外空间,因为每个图片子句的长度均为100个字符,而与我放置的内容无关在他们之中。我使用这些循环来计算每个变量的长度。首先,我检查以确保变量中包含某些内容,然后向后循环直到找到字符。

您没有说是否也需要修剪前导空格,因此我仅假设尾随空格。您也可以使用INSPECT TALLYING来获取计数而不是编写循环

答案 1 :(得分:0)

使用UNSTRING命令和TALLYING INWITH POINTER选项来跟踪要放置下一个字符串的位置。

相关问题