Стандартный способ удалить пробелы из ввода в коболе? - PullRequest
6 голосов
/ 12 января 2010

Я только учу кобол; Я пишу программу, которая просто повторяет ввод пользователя. Я определил переменную как:

User-Input PIC X(30).

Позже, когда я ПРИНИМАЮ пользовательский ввод, затем ОТОБРАЖАЮ пользовательский ввод "плюс какой-то дополнительный текст", в нем будет куча пробелов для заполнения 30 символов. Есть ли стандартный способ (например, str.strip Руби!) Для удаления лишних пробелов?

Ответы [ 5 ]

6 голосов
/ 12 января 2010

Можно надеяться на более элегантный способ простой обрезки текстовых строк но это в значительной степени стандартное решение ... Обрезка делается в параграфе SHOW-TEXT.


      *************************************                    
      * TRIM A STRING... THE HARD WAY...                       
      *************************************                    
       IDENTIFICATION DIVISION.                                
       PROGRAM-ID. TESTX.                                      
       DATA DIVISION.                                          
       WORKING-STORAGE SECTION.                                
       01  USER-INPUT         PIC X(30).                       
       01  I                  PIC S9(4) BINARY.                
       PROCEDURE DIVISION.                                     
           MOVE SPACES TO USER-INPUT                           
           PERFORM SHOW-TEXT                                   

           MOVE '  A B C' TO USER-INPUT                        
           PERFORM SHOW-TEXT                                   

           MOVE 'USE ALL 30 CHARACTERS -------X' TO USER-INPUT 
           PERFORM SHOW-TEXT                                 
           GOBACK                                            
           .                                                 
       SHOW-TEXT.                                            
           PERFORM VARYING I FROM LENGTH OF USER-INPUT BY -1 
                     UNTIL I LESS THAN 1 OR USER-INPUT(I:1) NOT = ' '
           END-PERFORM                                       
           IF I > ZERO                                       
              DISPLAY USER-INPUT(1:I) '@ OTHER STUFF'        
           ELSE                                              
              DISPLAY '@ OTHER STUFF'                        
           END-IF                                            
           .                                                 

Создает следующий вывод:


@ OTHER STUFF                              
  A B C@ OTHER STUFF                       
USE ALL 30 CHARACTERS -------X@ OTHER STUFF

Обратите внимание, что оператор PERFORM VARYING полагается слева на правильная оценка положения UNTIL, чтобы избежать выхода за пределы подписка на USER-INPUT в случае, если она содержит только пробелы.

3 голосов
/ 07 сентября 2012

Используйте OpenCOBOL 1.1 или выше.

 Identification division.
 Program-id. 'trimtest'.
*> Compile:
*> cobc -x -free -ffunctions-all  TrimTest.cbl
*>
 Data division.
 Working-Storage Section.
1 myBigStr Pic X(32768) Value Spaces.

 Procedure Division.

Display "Enter Something? " With no advancing.
Accept myBigStr.
Display "[" Trim(myBigStr) "]".
Goback.

Функция обрезки также имеет опции; Ведущий или Трейлинг. cobc -h formore info.

1 голос
/ 12 января 2010

Вот решение, если вы работаете на OpenVMS:

   01 WS-STRING-LENGTH                 PIC S9(04) COMP.

   CALL "STR$TRIM" USING BY DESCRIPTOR user_output,
                                       user_input,
                                       BY REFERENCE WS-STRING-LENGTH.
0 голосов
/ 07 апреля 2012

Есть три способа сделать это.

  1. Используйте функции COBOL для определения "длины" строки. Это сочетание пары функций. Это мой предпочтительный метод, но требует объявления дополнительных переменных.
  2. Напишите свою собственную функцию, чтобы получить «длину».
  3. Использовать знание "завершающей" строки. Вы должны знать, какие ключевые символы обозначают конец строки, например три пробела или символ с низким значением.

Этот пример кода демонстрирует все три.

   IDENTIFICATION DIVISION.
   PROGRAM-ID. TESTPROG.
   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 ONE-A     PIC X(20) VALUE 'RALPH WIGGAM'.
   01 ONE-A-TLY PIC 9(02) VALUE ZERO.
   01 ONE-A-LEN PIC 9(02) VALUE ZERO.
   01 ONE-B     PIC X(20) VALUE 'LIKES LEARNDING'.
   01 ONE-B-TLY PIC 9(02) VALUE ZERO.
   01 ONE-B-LEN PIC 9(02) VALUE ZERO.
   01 TWO-A     PIC X(20) VALUE 'RALPH WIGGAM'.
   01 TWO-A-LEN PIC 9(02) VALUE ZERO.
   01 TWO-B     PIC X(20) VALUE 'LIKES LEARNDING'.
   01 TWO-B-LEN PIC 9(02) VALUE ZERO.
   01 THREE-A   PIC X(20) VALUE 'RALPH WIGGAM'.
   01 THREE-B   PIC X(20) VALUE 'LIKES LEARNDING'.
   01 THREE-C   PIC X(80) VALUE SPACES.
   PROCEDURE DIVISION.

       DISPLAY ' -- METHOD ONE -- '
       INSPECT FUNCTION REVERSE(ONE-A)
        TALLYING ONE-A-TLY FOR LEADING SPACES.
       SUBTRACT ONE-A-TLY FROM LENGTH OF ONE-A GIVING ONE-A-LEN.
       INSPECT FUNCTION REVERSE(ONE-B)
        TALLYING ONE-B-TLY FOR LEADING SPACES.
       SUBTRACT ONE-B-TLY FROM LENGTH OF ONE-A GIVING ONE-B-LEN.
       DISPLAY ONE-A(1:ONE-A-LEN)
               ' ' ONE-B(1:ONE-B-LEN)
               '.'.

       DISPLAY ' -- METHOD TWO -- '
       PERFORM VARYING TWO-A-LEN FROM LENGTH OF TWO-A BY -1
        UNTIL TWO-A-LEN < 1 OR TWO-A(TWO-A-LEN:1) > SPACE
       END-PERFORM.
       PERFORM VARYING TWO-B-LEN FROM LENGTH OF TWO-B BY -1
        UNTIL TWO-B-LEN < 1 OR TWO-B(TWO-B-LEN:1) > SPACE
       END-PERFORM.
       DISPLAY TWO-A(1:TWO-A-LEN)
               ' ' TWO-B(1:TWO-B-LEN)
               '.'.

       DISPLAY ' -- METHOD THREE, NAIVE -- '
  *    DELIMITING BY JUST ANY SPACES ISN'T GOOD ENOUGH.
       STRING THREE-A DELIMITED BY SPACES
              ' ' DELIMITED BY SIZE
              THREE-B DELIMITED BY SPACES
              '.' DELIMITED BY SIZE
              INTO THREE-C.
       DISPLAY THREE-C.

       DISPLAY ' -- METHOD THREE, OK -- '
       STRING THREE-A DELIMITED BY '  '
              ' ' DELIMITED BY SIZE
              THREE-B DELIMITED BY '  '
              '.' DELIMITED BY SIZE
              INTO THREE-C.
       DISPLAY THREE-C.
   EXIT-PROG.
       STOP RUN.

и вывод выглядит так:

 -- METHOD ONE --            
RALPH WIGGAM LIKES LEARNDING.
 -- METHOD TWO --            
RALPH WIGGAM LIKES LEARNDING.
 -- METHOD THREE, NAIVE --   
RALPH LIKES.                 
 -- METHOD THREE, OK --      
RALPH WIGGAM LIKES LEARNDING.
0 голосов
/ 12 января 2010

более общее решение:

01 length pic 99.

perform varying length from 1 by 1 
  until length > 30 or user-input[length] = space
end-perform.
if length > 30
  display user-input 'plus some extra text'
else
  display user-input[1:length] 'plus some extra text'
end-if.

не проверено, у меня нет компилятора на данный момент

...