Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在COBOL中从字符串中获取单个字符?_Arrays_String_Variables_Cobol - Fatal编程技术网

Arrays 如何在COBOL中从字符串中获取单个字符?

Arrays 如何在COBOL中从字符串中获取单个字符?,arrays,string,variables,cobol,Arrays,String,Variables,Cobol,例如,如果字符串是工作字符串,我必须访问第三个字符并存储它。在C中,我们可以: 字符数据[5]=工作; 字符温度=数据[2]; 变量temp的值为“r”。现在我需要在COBOL中实现一个等价物。首先要了解的是,数组索引在C中是基于零的,在COBOL中是基于1的 接下来,COBOL和C有非常不同的表示字符串的方法。在C语言中,字符串通常被存储 作为字符数组,字符串的结尾通常使用二进制零null\0表示。COBOL 没有这样的惯例。字符串存储在指定长度的命名数据项中。这些项目通常是 在WORKING

例如,如果字符串是工作字符串,我必须访问第三个字符并存储它。在C中,我们可以:

字符数据[5]=工作; 字符温度=数据[2];
变量temp的值为“r”。现在我需要在COBOL中实现一个等价物。

首先要了解的是,数组索引在C中是基于零的,在COBOL中是基于1的

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

01    MY-VARIABLE   PIC X(20).
名为MY-variable的工作存储变量声明为20个字符长。可以为其指定一个值 在程序部分,如下所示

MOVE 'work' TO MY-VARIABLE
然后,您可以使用一种称为 参考修改:

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

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

重新回答。尽管提到了字符串,但我认为您所说的可能是一个字段,一段数据

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.
一段数据是一个组项,有四个字节长。从属定义允许您访问四个字节中的单个字节

可以这样做:

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.
现在,

引用数据的第三个字节

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.
可以使用文本(如图所示)或数据名完成订阅,您以正常方式定义的数据名和存储必须是数字,最好是二进制或使用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

另外,我知道VAR2,但根据我的经验,有多少没有使用引用修改经验的人会编写它。您还将看到VAR2 1:,而普通的VAR2就是所需的全部。是的,选择的名称类型似乎与参考修改密切相关,没有经验。

向我们展示过程分割和数据分割中的相关代码。当你说特定字符时,你是指字符位置还是匹配字符?换句话说,如果字符串是work,您希望w返回1还是希望1返回w?将w-LIFT-USAGE-NONE设置为TRUE意味着将零精确移动到VAR2 1:1?为什么在VAR2之后需要1:1?我可以只使用MOVE ZERO TO VAR2吗?是的,没错,但是使用SET作为条件名称可以100%准确地确定发生了什么。当然,长度为1的picx的1:1是不必要的,但是严格来说,所有的参考修改都是不必要的,所以不要期望看不到它。使用引用修改的人不会以最好的方式使用它,是吗?那么,1个字节的变量是1:1,7个字节的变量是1:7,然后有人把字段改为8个字节长,会发生什么。。。?