COBOL: как подсчитать все символы после обрезки всех пробелов до и после ввода

STRING FUNCTION TRIMR(EINA01 OF FORMAT1)     
       DELIMITED BY SIZE                     
   INTO WORTTXT1                             
END-STRING.                                  
MOVE FUNCTION REVERSE (WORTTXT1) TO WORTTXT2.
STRING FUNCTION TRIMR(WORTTXT2)              
       DELIMITED BY SIZE                     
   INTO WORTTXT3                             
END-STRING.                                  
INSPECT WORTTXT3 TALLYING LOO FOR CHARACTERS 
                 BEFORE INITIAL SPACES.      


   MOVE EINN01 OF FORMAT1 TO X.              
   MOVE EINN02 OF FORMAT1 TO Y.              
   MOVE EINA01 OF FORMAT1 (X:Y)              
     TO AUSA01 OF FORMAT1.                   

Наша проблема в том, что если мы превысим длину переменной EINA01, которая равна 50, программа вылетит.

Наша идея заключалась в том, чтобы обрезать все пробелы слева и справа и подсчитать все введенные символы.

Проблема, с которой мы сталкиваемся, заключается в том, что у нас нет возможности подсчитать все символы, поскольку обычно мы делаем это с помощью «Проверить подсчет всех символов перед начальными пробелами». Но если у нас, например, есть ввод типа «Hello World», он будет считать все только до первого пробела после «Hello».


person Community    schedule 31.08.2018    source источник


Ответы (1)


Если вы хотите получить длину строки, есть несколько разных способов сделать это:

СПОСОБ 1

простой цикл:

WS-INPUT-STRING  PIC  X(100) VALUE "12345678901234567890".
WS-OUTPUT-STRING PIC X(50).
WS-POS           PIC X(4) COMP.

PERFORM VARYING WS-POS
           FROM 100 BY -1
           UNTIL WS-INPUT-STRING(WS-POS:1)
                 NOT EQUAL SPACE OR
                 WS-POS < 1
END-PERFORM
IF WS-POS <= 50
   MOVE WS-INPUT-STRING(1:WS-POS) TO WS-OUTPUT-STRING
END-IF

СПОСОБ 2

проверять подсчет

WS-INPUT-STRING  PIC X(100) VALUE "12345678901234567890".
WS-OUTPUT-STRING PIC X(50).
WS-BLANK-COUNT   PIC 9(4) COMP.
WS-IN-MAX        PIC 9(4) COMP VALUE 100.

INSPECT FUNCTION REVERSE (WS-INPUT-STRING)
        TALLYING WS-BLANK-COUNT FOR LEADING SPACES
IF (WS-IN-MAX - WS-BLANK-COUNT) <= 50
   MOVE WS-INPUT-STRING(1:WS-IN-MAX - WS-BLANK-COUNT)
END-IF

оба эти варианта являются жизнеспособными. Я предпочитаю петлю сам.

Также помните, как правило, начальные пробелы важны, я бы не рекомендовал их обрезать, если вы не уверены на 100%, что они не требуются.

person SaggingRufus    schedule 31.08.2018
comment
Хороший ответ! @СагингРуфус. Я тоже предпочитаю метод 1. - person Srinivasan JV; 02.09.2018