2016-08-05 5 views
-2

Предположим, у меня есть переменная PIC X(20).Узнать длину строки

Переменная содержит некоторое значение, например. ABC WXYZ.

Как узнать длину строки, исключая промежуток между ними?

+0

что вы пробовали до сих пор Если ничего, вы не должны, по крайней мере, искать этот сайт, поскольку обработка строк возникла несколько раз, и есть идеи, которые помогут вам arted. Тогда, если вы застряли, вы можете задать более конкретный и более конкретный вопрос. – lurker

+0

@ Maxcc0 Предоставляет ли предоставленный ответ вам? Если да: отметьте это как ответ, если нет: прокомментируйте ответ, что вы пропустите. –

ответ

1

Если вы действительно уверены, что вы не хотите, чтобы пространство между вы можете определить тест-валин и использовать это в PERFORM:

77 some-len PIC 9(02). *> make sure to use appropriate length, if "big" use COMP-5 
    77 string-ptr PIC 9(02). *> make sure to use appropriate length 
    77 some-var PIC X(20) VALUE ' ABC WXYZ'. 
    77 var-len PIC 9(02) VALUE LENGTH OF some-var. 
    01 test-char PIC X. 
     88 no-spaces values 'A' THROUGH 'Z' 
          'a' THROUGH 'z' 
          '0' THROUGH '9' 
          '-', '.'. 

    PROCEDURE DIVISION. 

     MOVE 0 TO some-len 
     PERFORM VARYING string-ptr FROM 1 BY 1 
       UNTIL string-ptr > var-len 
      MOVE some-var (string-ptr) TO test-char 
      IF no-spaces ADD 1 TO some-len END-IF 
     END-PERFORM 

Как Билл указал, если вы хотите знать «не пространства» символов есть более быстрый вариант, который требует меньше ВАР (убедитесь, что вы прокомментируете это позволяет вам и другим, что это делает:

*> set numbers of all non-spaces in some-len 
     MOVE 0 TO some-len 
     INSPECT some-var TALLYING some-len FOR ALL SPACES 
    *> add more counts here if you want to remove more chars like x'0D'/x'0A'/x'00', ... 
    *> INSPECT some-var TALLYING some-len FOR ALL x'00' 
    *> INSPECT some-var TALLYING some-len FOR ALL x'0D' 
    *> INSPECT some-var TALLYING some-len FOR ALL x'0A' 
    *> and finally subtract it from the fields length 
     SUBTRACT some-len FROM LENGTH OF some-var GIVING some-len 
    *> 
+0

Для информации, имя пользователя Maxcc0 и Mainframe, а также быстрый просмотр их профиля показывает тег Mainframe. И, конечно, вспоминая их предыдущий вопрос. Так что 78 не будет работать. COMP-5 был бы плохим, если не нужен (его здесь нет). Почему бы просто не подсчитать пробелы? INSPECT ... TALLYING, например. –

+0

@BillWoodger: Информация о профиле пользователя Maxcc0 не является частью вопроса :-) Я изменил исходный код, чтобы использовать специальный регистр «LENGTH OF» вместо расширения уровня 78 и добавил параметр INSPECT. –

+0

Спасибо за предложения. INSPECT будет работать нормально :). – Maxcc0

Смежные вопросы