2013-01-08 122 views
3

我有一个字符串,我希望计算字符的数量,直到找到某个字符模式。有没有办法使用INSPECT TALLYING检查多个字符?

例如:

给一个字符串:askabanskarkartikrockstar
我想知道有多少个字符字符串中的kartik之前在那里。

在正常情况下,我需要之前找到的字符数,说k,给定字符串中,我会写的代码有些为:

INSPECT WS-INPUT-STRING TALLYING CT-COUNTER FOR CHARACTERS BEFORE LT-K 

  • WS-INPUT-STRING是字母数字的,值为 askabanskarkartikrockstar,
  • CT-COUNTER是用于计数字符数的计数器
  • LT-K是一个字面值为k

但在这里,如果我想在上面的例子做同样的子字符串,如kartik,将与kartik,而不是仅仅k工作更换的LT-K价值?如果是,是否适用于具有十六进制数字形式的值的字母数字文字(例如,在文字X(02)中,一个新行字符存储为x'0D25')?

我想在zOS IBM大型机v10上实现上面的代码。谢谢。

回答

7

你几乎已经回答了你自己的问题......答案是肯定的,你可以这样做。下面是一个工作示例方案:

IDENTIFICATION DIVISION. 
    PROGRAM-ID. EXAMPLE. 
    DATA DIVISION. 
    WORKING-STORAGE SECTION. 
    01 WS-INPUT-STRING PIC X(80). 
    01 WS-COUNTER  PIC 9(4). 
    01 WS-TAG   PIC X(10). 
    PROCEDURE DIVISION. 
    MAIN-PARAGRAPH. 
     MOVE 'askabanskarkartikrockstar' TO WS-INPUT-STRING 
     MOVE ZERO      TO WS-COUNTER 
     MOVE 'kartik'     TO WS-TAG 
     INSPECT WS-INPUT-STRING 
     TALLYING WS-COUNTER 
     FOR CHARACTERS BEFORE WS-TAG(1:6) 
     DISPLAY WS-COUNTER 
     GOBACK 
     . 

WS-COUNTER显示为11,还有WS-TAG字符串前11个字符。

请注意,我将WS-TAG定义为PIC X(10)。该变量比您正在寻找的实际标签值更长。为了防止INSPECT动词从试图匹配尾随通过引入空间:

 MOVE 'kartik' TO WS-TAG 

我不得不指定INSPECT来搜索一个参考修正值。曾我只是用:

 FOR CHARACTERS BEFORE WS-TAG 

不参考修改,WS-COUNTER本来80 - 的WS-INPUT-STRING长度。这是因为找不到字符串'kartik ',并且计数器会计算整个输入字符串的长度。

另一种方法是指定标签的文字:

 FOR CHARACTERS BEFORE 'kartik' 

您可以将十六进制常数为PIC X字段如下:

 MOVE X'0D25' TO WS-TAG 

这占用2个字符,因此会使用WS-TAG(1:2)INSPECT ing。

+0

嗨@NealB,我尝试使用上面的方法来指定有限长度变量中的文字,例如'kartik'将被保存在长度为'X(06)'和'X'0D25'的变量中保存在一个'X(02)'变量中。该方法在变量中使用字母数字值可以很好地工作。当我尝试计算一个十六进制编码的字母数字值(如“X'0D25”)时,出现问题。在这里,它似乎只比较了第一个字符,即当我在X(01)变量中给出'X'0D'时它可以工作,但是当我用'X'0D25'为'X(02) '它不能计算正确的数量。 – ikartik90

+1

@ ikartik90更好地再次查看您正在比较的变量的实际内容(可能其中一个包含双字节字符数据和其他单字节字符)。我已经使用二进制数据测试了'INSPECT TALLYING'(例如,在X'0D00250D250025中找到X'0D25'并且计数器返回为3,这是正确的)。 – NealB

+0

我得到你想表达的意思,而且我已经非常明确地检查了我正在比较的变量的内容。我非常肯定它的正确性。让我吃惊的是,当我测试它的子字符串时它工作的同样的问题,为什么它不适用于十六进制子字符串。 – ikartik90

0

如果你想立即做很多事情,那么你会发现PERFORM VARYING会更快。这是更多的打字,你必须考虑更多,并有更多的机会出现错误。但是一旦你有一个工作,你只需要复制代码重用它。

相关问题