我剛剛學習COBOL;我正在編寫一個簡單迴應用戶輸入的程序。我已經定義一個變量:從cobol輸入中刪除空格的標準方法?
User-Input PIC X(30).
後來,當我接受用戶輸入,然後顯示用戶輸入「再加上一些額外的文本」,它還包含了許多的空間,以填補30個字符。有沒有標準的方法(比如Ruby的str.strip!)去除多餘的空格?
我剛剛學習COBOL;我正在編寫一個簡單迴應用戶輸入的程序。我已經定義一個變量:從cobol輸入中刪除空格的標準方法?
User-Input PIC X(30).
後來,當我接受用戶輸入,然後顯示用戶輸入「再加上一些額外的文本」,它還包含了許多的空間,以填補30個字符。有沒有標準的方法(比如Ruby的str.strip!)去除多餘的空格?
人們希望有一種更簡潔的方法來修剪文本字符串 ,但這幾乎是標準解決方案...修剪部分 在SH OW-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 [email protected] OTHER STUFF
USE ALL 30 CHARACTERS [email protected] OTHER STUFF
注意,PERFORM VARYING聲明依賴的左邊 正確的評價UNTIL子句中避免出界外 下標對用戶輸入在它僅包含 空格的情況下。
這裏有一個解決方案,如果你在OpenVMS工作:
01 WS-STRING-LENGTH PIC S9(04) COMP.
CALL "STR$TRIM" USING BY DESCRIPTOR User-Input,
User-Input,
BY REFERENCE WS-STRING-LENGTH.
MOVE User-Input TO your_string.
MOVE another-string to your_string(WS-STRING-LENGTH + 1).
一個更通用的解決方案:
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.
未經檢驗的,我不手邊有一個編譯器,此刻
使用此解決方案,如果用戶輸入內容中間有空格,則用戶輸入內容將不會完整顯示。 – 2010-01-12 18:41:16
有三種方法可以做到這一點。
本示例代碼演示了所有這三個。
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.
使用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。
注意:在上面的答案中,我假設你只想刪除尾部空格。如果要刪除前導空格,可以從USER-INPUT的前面開始使用類似的方法,或者可以嘗試使用TALLYING和LEADING修飾符與INSPECT動詞一起演奏。對不起,刺痛的管理並不是COBOL的強項之一。 – NealB 2010-01-12 17:43:28