6

私はCOBOLを学んでいます。私は単にユーザー入力をエコーバックするプログラムを書いています。私は変数を次のように定義しました:

User-Input PIC X(30).

後でユーザー入力を受け入れてから、「ユーザー入力といくつかの追加テキスト」を表示すると、30文字を埋めるためのスペースがたくさんあります。余分なスペースを削除する標準的な方法(Rubyのstr.strip!など)はありますか?

4

5 に答える 5

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ステートメントは、空白スペースのみが含まれている場合にUSER-INPUTの範囲外の添え字を回避するために、UNTIL句の左から右への評価に依存していることに注意してください。

于 2010-01-12T17:22:22.987 に答える
3

OpenCOBOL1.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詳細情報。

于 2012-09-06T21:48:56.713 に答える
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.
于 2010-01-12T16:34:56.420 に答える
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.

テストされていません。現在、コンパイラはありません。

于 2010-01-12T16:58:45.017 に答える
0

これを行うには3つの方法があります。

  1. COBOL関数を使用して、文字列の「長さ」を判別します。これは、いくつかの機能の組み合わせです。これは私の好みの方法ですが、追加の変数を宣言する必要があります。
  2. 「長さ」を取得するための独自の関数を作成します。
  3. 「終了」文字列の知識を使用します。3つのスペースや値の小さい文字など、どのキー文字が文字列の終わりを示しているかを知る必要があります。

このサンプルコードは、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.
于 2012-04-06T21:47:47.390 に答える