我试图将用“;”分隔的输入行解串为数组。但是我在显示第一个“;”之后的每个单词时遇到了麻烦。
所以基本上,输入: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(包括更多示例)。