2010-01-12 46 views
5

Ich lerne gerade COBOL; Ich schreibe ein Programm, das Benutzereingaben einfach zurücksendet. Ich habe eine Variable wie folgt definiert:Standard Weg zum Entfernen von Leerzeichen aus Eingabe in Cobol?

User-Input PIC X(30). 

Später, als ich Benutzereingaben akzeptieren, dann DISPLAY Benutzer-Input „und etwas mehr Text“, es hat eine Reihe von Räumen, die 30 Zeichen zu füllen. Gibt es einen Standardweg (wie Rubys str.strip!), Um die zusätzlichen Leerzeichen zu entfernen?

Antwort

5

haben Man würde auf eine elegantere Art hoffen, einfach die Textzeichenfolgen zu trimmen , aber das ist so ziemlich die Standardlösung ... Der Trimmteil ist im SH erledigt OW-TEXT-Absatz.


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

erzeugt die folgende Ausgabe:


@ OTHER STUFF        
    A B [email protected] OTHER STUFF      
USE ALL 30 CHARACTERS [email protected] OTHER STUFF 

Beachten Sie, dass die PERFORM VARYING Aussage über die zu richtige Auswertung der UNTIL-Klausel links verlässt sich zu vermeiden out-of-bounds Subskribierung auf USER-INPUT in dem Fall, wo es nur Leerzeichen enthält.

+0

Hinweis: In der obigen Antwort ging ich davon aus, dass Sie nur nachstehende Leerzeichen entfernen möchten. Wenn Sie führende Leerzeichen entfernen möchten, können Sie einen ähnlichen Ansatz verwenden, der am Anfang von USER-INPUT beginnt, oder Sie können versuchen, mit dem INSPECT-Verb mit den Modifikatoren TALLING und LEADING zu spielen. Entschuldigung, aber Stachelmanagement ist keine der Stärken von COBOL. – NealB

0

Hier ist eine Lösung, wenn Sie auf OpenVMS arbeiten:

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

eine allgemeinere Lösung:

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. 

nicht getestet, ich habe einen Compiler zur Hand im Moment nicht

+0

Mit dieser Lösung wird der Inhalt der Benutzereingabe nicht vollständig angezeigt, wenn sie ein Leerzeichen in der Mitte enthält. –

0

Es gibt drei Möglichkeiten, wie Sie dies tun können.

  1. Verwenden Sie die COBOL-Funktionen, um die "Länge" der Zeichenfolge zu bestimmen. Dies ist eine Mischung aus ein paar Funktionen. Dies ist meine bevorzugte Methode, erfordert jedoch die Angabe zusätzlicher Variablen.
  2. Schreiben Sie Ihre eigene Funktion, um die "Länge" zu erhalten.
  3. Verwenden Sie die Kenntnis einer "beendenden" Zeichenfolge. Sie müssen wissen, welche Schlüsselzeichen ein Ende der Zeichenfolge angeben, z. B. drei Leerzeichen oder ein niederwertiges Zeichen.

Dieser Beispielcode zeigt alle drei.

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. 

und die Ausgabe sieht wie folgt aus:

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

Verwendung OpenCOBOL 1.1 oder höher.

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. 

Die Trimmfunktion hat auch die Optionen; Führen oder Trailing. cobc -h formor info.

Verwandte Themen