2010-01-12 7 views
5

Je suis en train d'apprendre COBOL; J'écris un programme qui fait simplement écho à l'entrée de l'utilisateur. J'ai défini une variable:Manière standard d'enlever des espaces d'entrée dans cobol?

User-Input PIC X(30). 

plus tard quand j'ACCEPTE l'utilisateur d'entrée, puis DISPLAY utilisateur-entrée « plus un texte supplémentaire », il a un tas d'espaces pour remplir les 30 caractères. Existe-t-il un moyen standard (comme la str.strip de Ruby!) Pour supprimer les espaces supplémentaires?

Répondre

5

On pourrait espérer une manière plus élégante de couper simplement les chaînes de texte mais c'est à peu près la solution standard ... La partie de recadrage se fait dans le SH Paragraphe 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            
      .             

produit la sortie suivante:


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

Notez que la EFFECTUER déclaration VARIANT repose sur la gauche pour évaluation droite de la clause UNTIL pour éviter hors des limites du terrain subscripting sur USER-INPUT dans le cas où il contient seulement espaces.

+0

Remarque: Dans la réponse ci-dessus, j'ai supposé que vous vouliez supprimer uniquement les espaces de fin. Si vous voulez supprimer des espaces de début, une approche similaire peut être utilisée en commençant au début de USER-INPUT ou vous pouvez essayer de jouer avec le verbe INSPECT avec les modificateurs TALLYING et LEADING. Désolé, mais la gestion de Sting n'est pas un des points forts de COBOL. – NealB

0

est ici une solution si vous travaillez sur 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

une solution plus générale:

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. 

non testé, je n'ai pas un compilateur à portée de main au moment

+0

Avec cette solution, le contenu de l'entrée de l'utilisateur ne sera pas complètement affiché s'il contient un espace au milieu. –

0

Vous pouvez le faire de trois façons.

  1. Utilisez les fonctions COBOL pour déterminer la "longueur" de la chaîne. C'est un mélange de quelques fonctions. C'est ma méthode préférée, mais nécessite de déclarer des variables supplémentaires.
  2. Écrivez votre propre fonction pour obtenir la "longueur". Utiliser la connaissance d'une chaîne de "terminaison"
  3. Vous devez savoir quels caractères clés indiquent une fin de chaîne, comme trois espaces ou un caractère de faible valeur.

Cet exemple de code illustre les trois.

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. 

et la sortie ressemble à ceci:

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

Utilisez OpenCobol 1.1 ou plus.

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. 

La fonction de rognage comporte également les options; Leading ou Trailing. cobc -h info formore.

Questions connexes