КОБОЛ: Как подсчитать все символы после обрезки всех пробелов до и после ввода - PullRequest
0 голосов
/ 31 августа 2018
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».

1 Ответ

0 голосов
/ 31 августа 2018

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

МЕТОД 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%.

...