我试图将用“;”分隔的输入行解串为数组。但是我在显示第一个“;”之后的每个单词时遇到了麻烦。

所以基本上,输入:Hello; Stack; Overflow



输出:值:2(因为有2个分号)



我的记录表的第1行:您好



我的记录表的第2行:堆栈



我的记录表的第3行:溢出

到目前为止,我的代码:

*-------------------------------------------------------------
 LINKAGE SECTION.
 01  X-INPUT-LINE                   PIC X(2000).
 01  X-SEP-CHAR                     PIC X(1).
 01  X-RET-TABLE.
  02 CMAX                           PIC 9(5) COMP-3.
  02 ENTRY-REC OCCURS 0 TO 9999 TIMES DEPENDING ON CMAX
                                      INDEXED   BY CIDX.
   04 ENTRY-REC2.
    07 LINEVALUE                    PIC X(100).

PROCEDURE DIVISION USING X-INPUT-LINE
                         X-SEP-CHAR
                         X-RET-TABLE.

MAIN SECTION.
MN-00.
INITIALIZE WERT.

INSPECT X-INPUT-LINE TALLYING WERT FOR ALL
        X-SEP-CHAR.
MOVE X-INPUT-LINE TO VAL.

ADD 1 TO WERT.
PERFORM WERT TIMES
MOVE WERT TO LINEVALUE OF X-RET-TABLE (WERT)
     UNSTRING VAL DELIMITED BY ";"
     INTO STRVAL
     END-UNSTRING


IF CMAX OF X-RET-TABLE < 9999
   ADD  1  TO CMAX OF X-RET-TABLE
   MOVE STRVAL TO ENTRY-REC(CMAX OF X-RET-TABLE)

END-IF
END-PERFORM.


使用下面的代码,我只能在示例中显示“ Hello”,程序将在3个不同的行中显示3次。

最佳答案

您的原始代码几乎可以正常工作。

主要问题是,您UNSTRING给定变量并始终使用相同的起点。

他我们可以使用WITH POINTER。在STRING上使用的子句说“存储下一个字符的位置”,在UNSTRING上使用的子句说“读取下一个字符的位置”。

使用起始代码(添加了调用者,实际上使用了给定的分隔符,而不是固定的“;”和结果的DISPLAY),添加了here,我们为起点添加了一个变量并使用它。

     UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
     INTO STRVAL
     END-UNSTRING


变成

     UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
     INTO STRVAL
     WITH POINTER STARTING-POINT
     END-UNSTRING


您还需要初始化一些部分并可以直接使用表格项(只要确保计数器不会太大),即可为您提供result(包括更多示例)。

10-06 09:13