【问题标题】:Standard way to remove spaces from input in cobol?从 cobol 中的输入中删除空格的标准方法?
【发布时间】:2010-01-12 16:05:31
【问题描述】:

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

User-Input PIC X(30).

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

【问题讨论】:

    标签: cobol gnucobol


    【解决方案1】:

    人们希望有一种更优雅的方式来简单地修剪文本字符串 但这几乎是标准解决方案......修剪部分 在 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 仅包含的情况下下标 空格。

    【讨论】:

    • 注意:在上面的答案中,我假设您只想删除尾随空格。如果要删除前导空格,可以从 USER-INPUT 的前面开始使用类似的方法,或者您可以尝试使用带有 TALLYING 和 LEADING 修饰符的 INSPECT 动词。抱歉,sting 管理不是 COBOL 的强项之一。
    • "这几乎是标准解决方案",除了 LENGTH OF 是一个非标准扩展。
    【解决方案2】:

    使用 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 了解更多信息。

    【讨论】:

    • 给我一个错误:'Trim'未定义想想,你在“trim”之前缺少一个“function”,所以倒数第二行应该是 Display "[" function Trim(myBigStr) " ]"。
    【解决方案3】:

    如果您在 OpenVMS 上工作,这里有一个解决方案:

       01 WS-STRING-LENGTH                 PIC S9(04) COMP.
    
       CALL "STR$TRIM" USING BY DESCRIPTOR user_output,
                                           user_input,
                                           BY REFERENCE WS-STRING-LENGTH.
    

    【讨论】:

    • +1 用于系统服务调用,很抱歉 necro 评论,但对于带有 DB2 的 z/OS,在没有表访问的情况下也有使用嵌入式 SQL 的肮脏方式。
    【解决方案4】:

    更通用的解决方案:

    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.
    

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

    【讨论】:

    • 这个解决方案,如果用户输入的内容中间有空格,将无法完整显示。
    【解决方案5】:

    您可以通过三种方式做到这一点。

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2016-02-06
      • 2021-05-17
      • 2022-03-16
      • 1970-01-01
      相关资源
      最近更新 更多