如何从COBOL中的字符串访问单个字符?

时间:2013-05-08 13:56:18

标签: cobol

如何在COBOL中访问字符串中的特定字符?

例如,如果字符串是“work”,我必须访问字符串中的字符'w'并将其存储在字符中。我需要匹配的角色,而不是角色的位置。

例如在c中,我们将执行以下操作来提取字符串中的第i个字符

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

temp将具有值'k'

现在我在COBOL中需要相同的东西。

2 个答案:

答案 0 :(得分:7)

首先要理解的是,基于C的数组索引为零,而基于COBOL的数组为1。

下一步COBOL和C具有非常不同的表示字符串的方式。在C中,通常存储字符串 作为字符数组,字符串的结尾通常使用二进制零(null \ 0)表示。 COBOL 没有这样的约定。字符串存储在指定长度的命名数据项中。这些项目通常是 在WORKING-STORAGE下声明并且有一个与'X'类型相关的PICTURE子句(还有其他几个 PICTURE子句的可能性,但“X”代表任何类型的字符。例如:

01    MY-VARIABLE   PIC X(20).

名为MY-VARIABLE的Working Storage变量声明为20个字符长。可以为其分配值 在程序部分如下。

MOVE 'work' TO MY-VARIABLE

然后,您可以使用称为的技术访问此字符串(或子字符串)的各种字符 参考修改:

DISPLAY MY-VARIABLE(3:1)

将显示MY-VARIABLE的第三个字符(基于1的索引),即'r'。上面括号中的第一个数字(3) 表示从变量开头的偏移量,第二个数字是从该位置开始的字符数(1)。

还有其他方法可以做到这一点,例如REDEFINES,其中MY-VARIABLE可以重新定义为20个1个字符单元格的数组。这个 是一个有点过时的机制,所以我鼓励使用引用修改来访问部分字符串。

答案 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是一个“组项”,长度为4个字节。 “从属”定义允许您访问四个字节中的单个字节。

可以这样做:

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就是所需要的。是的,所选择的名称是名称的类型,似乎与参考修改并没有经验相结合。