2013-05-08 92 views
-1

如何在COBOL中訪問字符串中的特定字符?如何從COBOL中的字符串訪問單個字符?

例如,如果一個字符串是「工作」,我必須訪問字符串中的字符'w'並將其存儲在字符中。我需要匹配的角色,而不是角色的位置。

例如,在C,我們會做以下提取第i個字符的字符串,

char data[5] = "work";                
    char temp;                   
    temp = data[3];                  

溫度將有值「K」

現在我需要在同一COBOL。

+0

向我們展示了程序部和數據部門的相關代碼。 – RBarryYoung 2013-05-08 14:02:05

+1

當你說特定的角色時,你的意思是角色位置還是匹配角色?換句話說,如果字符串是「work」,你想讓「w」返回1,還是你想讓1返回「w」? – 2013-05-08 14:08:09

回答

5

要理解的第一件事是數組索引是基於C和基於COBOL的1。

接下來,COBOL和C具有非常不同的表示字符串的方式。在C中,字符串通常作爲字符數組存儲在 中,字符串的結尾通常使用二進制零表示(空\ 0)。 COBOL 沒有這樣的約定。字符串存儲在指定長度的指定數據項中。這些項目通常是在工作存儲下聲明的 ,並具有與它們相關聯的PICTURE子句,類型爲'X'(PICTURE子句有幾個其他 可能性,但'X'表示任何類型的字符)。例如:

01 MY-VARIABLE PIC X(20). 

暫存變量,名爲MY-變量聲明爲20個字符長。可以在PROCEDURE DIVISION中爲其分配值 ,如下所示。

MOVE 'work' TO MY-VARIABLE 

然後,可以訪問使用稱爲 參考變形例的技術此字符串的各個字符(或字符串):

DISPLAY MY-VARIABLE(3:1) 

將顯示MY-變量的第三個字符(1個基於索引),這是'r'。上面(3) 括號中的第一個數字表示從變量開始的偏移量,第二個數字是從該位置開始的字符數(1)。

還有其他的方法可以做到這一點,比如REDEFINES,其中MY-VARIABLE可以被重新定義爲20個1個字符單元格的數組。這 是一個有點過時的機制,所以我會鼓勵使用引用修改來訪問字符串的部分。

3

重新回答。儘管提到了「字符串」,但我認爲你正在談論什麼可能被稱爲「字段」,即一段數據。

01 a-piece-of-data. 
    05 first-two-bytes-of-data PIC XX. 
    05 third-byte-of-data  PIC X. 
    05 fourth-byte-of-data  PIC X. 

a-piece-of-data是一個「組項目」,它是四個字節長。 「從屬」定義允許您訪問四個字節內的單個字節。

這是可以做到這樣:

01 a-piece-of-data    PIC X(4). 
01 FILLER REDEFINES a-piece-of-data. 
    05 first-two-bytes-of-data PIC XX. 
    05 third-byte-of-data  PIC X. 
    05 fourth-byte-of-data  PIC X. 

它可以與 「訂購」 來完成:

01 a-piece-of-data. 
    05 FILLER OCCURS 4 TIMES. 
     10 a-byte-in-the-piece-of-data PIC X. 

現在,

a-byte-in-the-piece-of-data (3) 

引用數據的第三個字節。

下標可以用文字(如圖所示)或數據名稱(您以正常方式定義的名稱和存儲必須是數字,最好是二進制)或索引名稱(使用INDEXED BY ,在那裏定義名稱,但編譯器定義存儲)。如NealB所示,它也可以通過引用修改來完成。

對我來說,選擇通常歸結爲「哪一個對下一個人來說最清楚?」。

01 WHAREHOUSE-REF. 
    05 WHAREHOUSE-CODE PIC XX. 
     88 WHAREHOUSE-HAS-LIFT VALUE "LN" "CV". 
    05 WHAREHOUSE-FLOOR PIC X. 
     88 WHAREHOUSE-UPPER-FLOOR VALUE "1" "2". 
    05 WHAREHOUSE-BAY  PIC X. 

01 W-LIFT-USAGE   PIC X. 
    88 W-LIFT-USAGE-NONE VALUE ZERO. 

IF WHAREHOUSE-HAS-LIFT 
AND WHAREHOUSE-UPPER-FLOOR 
    MOVE WHAREHOUSE-FLOOR TO W-LIFT-USAGE 
ELSE 
    SET W-LIFT-USAGE-NONE TO TRUE 
END-IF 
PERFORM CALC-ROBOT-TIME-TO-BAY 

這是一樣的(或者是它?你總是可以手動在每次檢查):

01 VAR1 PIC X(4). 
01 VAR2 PIC X. 

IF VAR1 (1:2) = "LN" OR "CV" 
AND VAR1 (3:1) = "1" OR "2" 
    MOVE VAR1 (3:1) TO VAR2 (1:1) 
ELSE 
    MOVE ZERO TO VAR2 (1:1) 
END-IF 
PERFORM CALC-ROUTINE THROUGH CALC-ROUTINE-EXIT 

PS。我知道VAR2,但以我的經驗,那就是有多少沒有經驗的人使用參考修改會對它進行編碼。你也會看到VAR2(1 :),而普通的VAR2就是需要的。是的,選擇的名字是類似的名字,似乎與參考修改並沒有經驗並駕齊驅。

+0

將W-LIFT-USAGE-NONE設置爲TRUE意味着將VAR2(1:1)移動到零?爲什麼VAR2之後需要(1:1)?我只能使用MOVE ZERO VAR2嗎? – user1169587 2016-12-23 02:14:12

+0

是的,但是使用SET作爲條件名稱使得100%完全可以確定發生了什麼。對於長度爲1的PIC X,(1:1)當然是不必要的,但是由於嚴格地說,所有參考修改都是不必要的,所以不要期望不會看到它。使用引用修改的人不會以最好的方式使用它,是嗎?因此,一個字節的VAR(1:1),七個字節的VAR(1:7),然後有人將字段更改爲八個字節長,會發生什麼......? – 2016-12-23 07:10:02

相關問題