2013-05-08 90 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

相关问题