COBOL:如何在修剪输入前后的所有空格后计算所有字符
COBOL: How to count all characters after trimming all the spaces before and after Input
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,程序就会崩溃。
我们的想法是 trim 从左到右的所有 space 并计算给定输入的所有字符。
我们面临的问题是我们无法计算所有字符,因为我们通常会用 "Inspect count all characters before initial spaces" 来计算。
但是,例如,如果我们有一个像 "Hello World" 这样的输入,他只会计算所有内容,直到 "Hello" 之后的第一个 space。
如果你想获得字符串的长度,有几种不同的方法可以做到这一点:
方法一
一个简单的循环:
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
方法二
检查理货
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% 确定不需要它们,否则我不建议修剪它们。
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,程序就会崩溃。
我们的想法是 trim 从左到右的所有 space 并计算给定输入的所有字符。
我们面临的问题是我们无法计算所有字符,因为我们通常会用 "Inspect count all characters before initial spaces" 来计算。 但是,例如,如果我们有一个像 "Hello World" 这样的输入,他只会计算所有内容,直到 "Hello" 之后的第一个 space。
如果你想获得字符串的长度,有几种不同的方法可以做到这一点:
方法一
一个简单的循环:
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
方法二
检查理货
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% 确定不需要它们,否则我不建议修剪它们。