2010-01-12 260 views
5

我剛剛學習COBOL;我正在編寫一個簡單迴應用戶輸入的程序。我已經定義一個變量:從cobol輸入中刪除空格的標準方法?

User-Input PIC X(30). 

後來,當我接受用戶輸入,然後顯示用戶輸入「再加上一些額外的文本」,它還包含了許多的空間,以填補30個字符。有沒有標準的方法(比如Ruby的str.strip!)去除多餘的空格?

回答

5

人們希望有一種更簡潔的方法來修剪文本字符串 ,但這幾乎是標準解決方案...修剪部分 在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子句中避免出界外 下標對用戶輸入在它僅包含 空格的情況下。

+0

注意:在上面的答案中,我假設你只想刪除尾部空格。如果要刪除前導空格,可以從USER-INPUT的前面開始使用類似的方法,或者可以嘗試使用TALLYING和LEADING修飾符與INSPECT動詞一起演奏。對不起,刺痛的管理並不是COBOL的強項之一。 – NealB 2010-01-12 17:43:28

0

這裏有一個解決方案,如果你在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). 
0

一個更通用的解決方案:

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. 

未經檢驗的,我不手邊有一個編譯器,此刻

+0

使用此解決方案,如果用戶輸入內容中間有空格,則用戶輸入內容將不會完整顯示。 – 2010-01-12 18:41:16

0

有三種方法可以做到這一點。

  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. 
3

使用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。