【问题标题】:Concatenate strings in COBOL without leading or trailing spaces在 COBOL 中连接字符串,不带前导或尾随空格
【发布时间】:2019-02-02 18:07:07
【问题描述】:

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

输入字母数字。 . 1:这个字符串是
输入字母数字。 . 2:串联。
输入字母数字。 . 3:

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

我可以将这 2 个字符串一起放入输出中,但如果没有它们之间的空格,它们就不会相互连接。

【问题讨论】:

  • 你能告诉我们你试过的代码吗?我可以编写一些代码来做到这一点,但除非我能看到你编写的代码,否则我无法真正解释为什么你的代码不起作用
  • 你可能想看看STRING stuff DELIMITED BY delimiter ...,如果你不需要原始字符串保持不变,你可以使用INSPECT var REPLACING TRAILING SPACES BY LOW-VALUE创建一个分隔符。或者,如果你有一个“最近的”编译器,用FUNCTION TRIM(var) 生成一些中间的“东西”。正如 SaggingRufus 所说:请始终提供您已经编写的代码,以显示问题所在以及要解释的内容。

标签: string concatenation trim cobol


【解决方案1】:

所以假设你不知道这两个字符串的长度,你需要做这样的事情:

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 来获取计数而不是编写循环

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2011-10-02
      • 1970-01-01
      相关资源
      最近更新 更多