COBOL解串为数组

时间:2018-09-17 12:01:30

标签: arrays string input record cobol

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

基本上,输入: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次。

2 个答案:

答案 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