计算字符串中字符的个数

Counting the numbers of characters in a string

我在定义字符串中的字符数时遇到问题。 例如我有以下代码:

IDENTIFICATION DIVISION.
PROGRAM-ID. TASK1.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 SOURCE-STRING PIC X(50) VALUE "  The length of string    ".
01 LATTER-COUNTER PIC 99.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
    MOVE 0 TO LATTER-COUNTER
    INSPECT SOURCE-STRING TALLYING LATTER-COUNTER FOR [???]
STOP RUN.

我必须写什么才能找到 SOURCE-STRING 的长度(在值“字符串的长度”中写入的字符串)。 长度必须为 26 个字符(包括前导空格 = 2 和末尾空格 = 4)。

正如比尔所说:

COBOL does not have "strings". You have 28 trailing blanks in that field, and all 28 are identical to each other.

如果你想知道长度,包括使用的尾随空格的数量而不是字段中的尾随空格,那么不要 MOVE 中的东西(或使用 VALUE )但是初始化字段(例如使用 MOVE ALL 'x00' TO FIELD)并使用 STRING 来获取数据(这样你甚至会有一个 "C"-string)。这允许您执行 INSPECT ... BEFORE FIRST x'00'.

要考虑的其他选项:

  • FUNCTION LENGTH (content)
  • STRING content INTO ... WITH POINTER LATTER-COUNTER(必须以1开头)

当您向您的问题(包括您使用的 COBOL 编译器)添加更多信息(通过编辑)时,我们可以给出更好的答案。

你可以做的是使用 NULL 来指示字符串的结尾。

首先,将SOURCE-STRING初始化为NULL:

01 SOURCE-STRING PIC X(50) VALUE NULL.

然后,不要使用 MOVE 将字符串移动到变量,而是使用 STRING 语句:

STRING "  The length of string    " INTO SOURCE-STRING

前 26 个字符被移入 SOURCE-STRING,但其余字符未受影响,在字符串末尾留下 NULL 个字节。然后您可以确定 NULL 字节从哪里开始。

或者,您可以使用 STRINGPOINTER 来自动计算移动的字符数:

WORKING-STORAGE SECTION.

 01 SOURCE-STRING PIC X(50) VALUE NULL.
 01 STR-PTR PIC 9(3).

PROCEDURE DIVISION.

    MOVE 1 TO STR-PTR
    STRING "  The length of string    "
    INTO SOURCE-STRING
    POINTER STR-PTR
    SUBTRACT 1 FROM STR-PTR

STR-PTR 将包含实际字符串的长度。请注意,在使用 STRING 命令之前,必须将 STR-PTR 显式设置为 1