如何在COBOL中访问字符串中的特定字符?
例如,如果字符串是“work”,我必须访问字符串中的字符'w'并将其存储在字符中。我需要匹配的角色,而不是角色的位置。
例如在c中,我们将执行以下操作来提取字符串中的第i个字符
char data[5] = "work";
char temp;
temp = data[3];
temp将具有值'k'
现在我在COBOL中需要相同的东西。
答案 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就是所需要的。是的,所选择的名称是名称的类型,似乎与参考修改并没有经验相结合。