我正在尝试将用“;”分隔的输入行解串为数组。但是我在显示第一个“;”之后的每个单词时遇到了麻烦。
基本上,输入: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次。
答案 0 :(得分:4)
您的原始代码几乎有效。
主要问题是,您UNSTRING
WITH POINTER
始终使用相同的起点。
我们可以使用STRING
。在UNSTRING
上使用的子句说“存储下一个字符的位置”,在DISPLAY
上使用的子句说“读取下一个字符的位置”。
使用起始代码(添加了调用者,实际上使用给定的分隔符而不是固定的“;”和结果的 UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
INTO STRVAL
END-UNSTRING
),添加了here,我们为起始点添加了一个变量并使用它。
UNSTRING X-INPUT-LINE DELIMITED BY X-SEP-CHAR
INTO STRVAL
WITH POINTER STARTING-POINT
END-UNSTRING
成为
back_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
forward_button.setVisibility(View.GONE);
backButton();
if (mediator == 10) {
forward_button.setVisibility(View.VISIBLE);
backk--;
display.setText(list[backk]);
}
if (backk == currentnumber-5 ) {
back_button.setClickable(false);
}
if (backk != currentnumber-5) {
back_button.setClickable(true);
back_button.setEnabled(true);
}
if (mediator != 10){
back_button.setEnabled(false);
display.setText(list[currentnumber]);
}
}
});
您还需要初始化一些部分,并可以直接使用表格项(只要确保计数器不会太大),即可为您提供result(包括更多示例)。
答案 1 :(得分:1)
解串实际上不是那样的。如果您知道要解串的内容的字段名称,则解串将起作用。基本上,代码中发生的事情是您运行了3次unstring,并且因为“ hello”是unstring中的第一件事,因此它被解开了3次。如果要对数组进行可伸缩的操作,则需要编写如下循环:
MKMarkerAnnotationView
我还没有真正的时间来测试它并确保它100%有效,但是您需要遵循这些原则。我会尽量避免在这里使用unstring。
当您确切知道要输入多少个字段时,Unstring非常有用。例如,假设您有一个与MQ系列进行交互的通用程序。作为该程序的输入,您可以传递一个字符串,其中包含类似
的指令01 WS-UNSTRING-FIELDS.
05 WS-INPUT PIC X(1000).
05 WS-SUB PIC 9(4) COMP.
05 WS-START PIC 9(4) COMP VALUE 1.
05 WS-INDEX PIC 9(4) COMP VALUE 0.
05 WS-ARRAY OCCURS 0 TO 9999 DEPENDING ON WS-INDEX.
PERFORM VARYING WS-SUB
FROM 1 BY 1
UNTIL WS-SUB > FUNCTION LENGTH(WS-INPUT)
IF WS-INPUT(WS-SUB:1) = ";"
ADD 1 TO WS-INDEX
MOVE WS-INPUT(WS-START:WS-SUB - 1)
TO WS-ARRAY(WS-INDEX)
COMPUTE
WS-START = WS-SUB + 1
END-COMPUTE
END-IF
END-PERFORM
然后您可以在此上下文中使用unstring将它们分为2个字段:
QueueName/Action
可以说这里的输入是:
UNSTRING WS-INPUT DELIMITED BY "/"
INTO WS-Q-NAME
WS-ACTION
END-UNSTRING
WS-Q-NAME将具有THIS_IS_MY_QUEUE_NAME,而WS-ACTION将具有DELETE