объединение строк неизвестной длины в COBOL
Вопрос
Как объединить две строки неизвестной длины в COBOL?Так, например:
WORKING-STORAGE.
FIRST-NAME PIC X(15) VALUE SPACES.
LAST-NAME PIC X(15) VALUE SPACES.
FULL-NAME PIC X(31) VALUE SPACES.
Если FIRST-NAME = 'JOHN '
и LAST-NAME = 'DOE '
, как я могу получить:
FULL-NAME = 'JOHN DOE '
в отличие от:
FULL-NAME = 'JOHN DOE '
Решение
Я верю, что следующее даст вам то, что вы желаете.
STRING
FIRST-NAME DELIMITED BY " ",
" ",
LAST-NAME DELIMITED BY SIZE
INTO FULL-NAME.
Другие советы
На первый взгляд, решение состоит в том, чтобы использовать модификацию ссылки на STRING вместе с двумя строками, включая пробел.Проблема в том, что вы должны знать, сколько конечных пробелов присутствует в FIRST-NAME, иначе вы получите что-то вроде «JOHNbbbbbbbbbbbbDOE», где b — пробел.
Не существует встроенной функции COBOL для определения количества конечных пробелов в строке, но есть функция для определения количества начальных пробелов в строке.Поэтому, насколько я могу судить, самый быстрый способ — перевернуть имя, найти количество начальных пробелов и использовать модификацию ссылок для объединения имени и фамилии.
Вам придется добавить эти поля в рабочее хранилище:
WORK-FIELD PIC X(15) VALUE SPACES.
TRAILING-SPACES PIC 9(3) VALUE ZERO.
FIELD-LENGTH PIC 9(3) VALUE ZERO.
- Переверните ИМЯ
- ПЕРЕМЕЩИТЕ ФУНКЦИЮ ОБРАТНО (ИМЯ) В РАБОЧОЕ ПОЛЕ.
- WORK-FIELD теперь содержит пробелы в начале, а не в конце.
- Найдите количество конечных пробелов в слове FIRST-NAME
- ПРОВЕРЬТЕ СЛЕДУЮЩИЕ ПРОСТРАНСТВА ДЛЯ ПОДСЧЕТА РАБОЧЕГО ПОЛЯ НА НАЛИЧИЕ ВЕДУЩИХ ПРОСТРАНСТВ.
- TRAILING-SPACE теперь содержит количество конечных пробелов в FIRST-NAME.
- Найдите длину поля FIRST-NAME.
- ВЫЧИСЛИТЕЛЬНАЯ ДЛИНА ПОЛЯ = ДЛИНА ФУНКЦИИ (ИМЯ).
- Объедините две строки вместе.
- СТРОКА ИМЯ (1:ДЛИНА ПОЛЯ – КОНЕЧНЫЕ ПРОБЕЛЫ) « » ФАМИЛИЯ, ОГРАНИЧЕННАЯ ПО РАЗМЕРУ, ДО ПОЛНОГО ИМЯ.
Вы можете попробовать сделать цикл for, чтобы получить реальную длину.