Я просто изучаю КОБОЛ; я пишу программу что просто echos назад ввод данных пользователем. Я определил переменную как:
User-Input PIC X(30).
Позже, когда я ПРИНИМАЮ Ввод данных пользователем, затем ОТОБРАЖАЮ Ввод данных пользователем "плюс некоторый дополнительный текст", он имеет набор пробелов для заполнения этих 30 символов. Есть ли стандартный путь (как str.strip Ruby!) для удаления дополнительных пространств?
Один надеясь на более элегантный способ просто обрезки текстовых струн Но это в значительной степени стандартное решение ... часть обрезки сделано в параметре шоу-текста.
*************************************
* 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
Обратите внимание, что выполнение разных операторов зависит слева от правильная оценка до пункта, чтобы избежать вне оценки Подскабоваться на пользовательский ввод в случае, когда он содержит только Пустые места.
Более общее решение:
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.
непроверенные, у меня нет компилятора под рукой в данный момент
Вот решение, если вы работаете с OpenVMS:
01 WS-STRING-LENGTH PIC S9(04) COMP.
CALL "STR$TRIM" USING BY DESCRIPTOR user_output,
user_input,
BY REFERENCE WS-STRING-LENGTH.