从cobol输入中删除空格的标准方法?

时间:2010-01-12 16:05:31

标签: cobol gnucobol

我刚刚学习COBOL;我正在写一个简单回应用户输入的程序。我已将变量定义为:

User-Input PIC X(30).

稍后当我接受用户输入,然后显示用户输入“加上一些额外的文本”时,它有一堆空格来填充30个字符。是否有标准方法(如Ruby的str.strip!)来删除多余的空格?

5 个答案:

答案 0 :(得分:6)

人们希望以更优雅的方式简单地修剪文本字符串 但这几乎是标准解决方案......修剪部分 在SHOW-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 C@ OTHER STUFF                       
USE ALL 30 CHARACTERS -------X@ OTHER STUFF

请注意,PERFORM VARYING语句依赖于左侧 正确评估UNTIL条款以避免越界 在USER-INPUT仅包含的情况下订阅 空白。

答案 1 :(得分: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。

答案 2 :(得分:1)

如果您使用OpenVMS,这是一个解决方案:

   01 WS-STRING-LENGTH                 PIC S9(04) COMP.

   CALL "STR$TRIM" USING BY DESCRIPTOR user_output,
                                       user_input,
                                       BY REFERENCE WS-STRING-LENGTH.

答案 3 :(得分: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.

未经测试,目前我手头没有编译器

答案 4 :(得分:0)

有三种方法可以做到这一点。

  1. 使用COBOL函数确定字符串的“长度”。这是几个功能的混合。这是我首选的方法,但需要声明额外的变量。
  2. 编写自己的函数以获取“长度”。
  3. 使用“终止”字符串的知识。您必须知道哪些关键字符表示字符串结尾,例如三个空格或一个低值字符。
  4. 此示例代码演示了所有这三个。

       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.