首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在COBOL中的字符串中查找子字符串

在COBOL中的字符串中查找子字符串
EN

Stack Overflow用户
提问于 2014-10-13 22:16:47
回答 1查看 15.2K关注 0票数 3

我的问题是,给定一个从文件中读取的变量,看看它是否包含或匹配另一个字符串。

换句话说,在文件中查找其变量的所有记录

BRADD PIC X(30)

匹配或包含由键盘引入的字符串。

我很有信心通过检查指令解决了这个问题,我在代码中尝试过这样的方法:

代码语言:javascript
复制
           READ BRANCHFILE NEXT RECORD 
             AT END SET EndOfFile TO TRUE
           END-READ.
           PERFORM UNTIL EndOfFile
               INSPECT BBRADD 
                 TALLYING CONT for CHARACTERS
                   BEFORE INITIAL CITY
               IF CONT>1
                   DISPLAY " BRANCH CODE    :" BBRID
                   DISPLAY " BRANCH NAME    :" BBRNAME
                   DISPLAY " BRANCH ADDRESS :" BBRADD
                   DISPLAY " PHONE          :" BBRPH
                   DISPLAY " E-MAIL         :" BEMAIL
                   DISPLAY " MANAGER NAME   :" BMGRNAME
                   DISPLAY " ------------------"
                   DISPLAY " ------------------"
               END-IF
               READ BRANCHFILE NEXT RECORD 
                   AT END SET EndOfFile TO TRUE
               END-READ
               MOVE 0 TO CONT
           END-PERFORM.

城市是我通过键盘引入的变量。

有人知道如何在“字符串”中找到“子字符串”吗?

例如,如果我引入了“萨拉戈萨”,我的程序就必须打印BBRADD变量包含“萨拉戈萨”的文件中的所有记录。

代码语言:javascript
复制
01 BRANCHREC. 
   88 EndOfFile VALUE HIGH-VALUE. 
   02 BBRID PIC X(6). 
   02 BBRNAME PIC X(15). 
   02 BBRADD PIC X(30). 
   02 BBRPH PIC X(10). 
   02 BEMAIL PIC X(20). 
   02 BMGRNAME PIC X(25). 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-13 23:12:10

每次检查前,您都需要将连续设置为零。

当检查开始时,CONT只从它的初始值得到更新。当你找到你的第一张唱片后,每一张唱片都会看起来像是有城市。

如果梅最初看起来很奇怪,它的工作方式,但如果没有,你会受到限制的时候,这是你希望它的工作方式。

啊,再往前看,你正在设定一个初值,你只是在一个意想不到的地方这样做。如果需要为零,请在应该为零之前立即将其设置为零。找起来容易得多,对将来改变程序的人来说就不太容易弄得一团糟。

然而,你还有另一个问题。假设城市是PIC X(20)。用户进入塞维利亚,你的检查将搜索塞维利亚,然后是13个空格。理想情况下,你会希望塞维利亚后面有一个空间。

您需要能够测试用户输入的值,但不能使用拖尾空白,但不能更多。

目前流行的方法是参考修改。

您需要接受您的用户输入,找出它包含多少尾随空格,计算数据的长度,为后面的空白添加一个,并将该值保存在字段中(最好是二进制字段)。

那么您的检查可以如下所示:

代码语言:javascript
复制
           INSPECT BBRADD 
             TALLYING CONT for CHARACTERS
               BEFORE INITIAL CITY ( 1 : length-of-data-plus-one )

然而,如果塞维利亚真的在场上的话,你就有问题了。

因此,您可以做一个小的更改,不是对出现在它前面的字符进行计数,而是对其出现的次数进行计数。

代码语言:javascript
复制
           INSPECT BBRADD 
             TALLYING CONT for ALL
                           CITY ( 1 : length-of-data-plus-one )

许多人会用引用修改来编写执行循环,并以这种方式进行测试。使用上面检查的最终版本,必须自己编写终止逻辑。为了学习的目的,最好两种方式都这样做。

执行文件时,请始终使用并检查文件状态.把你的阅读放入一个段落并执行它,你不需要两段不同的代码。如果使用文件状态,则不需要AT END (或END-READ),因为用于接收文件状态值的字段对于文件结束时为"10“。只需使用您的88在该领域,价值"10“。

您的问题上的编辑现在指示您的现有88级在哪里。

一方面,这是一个好主意,因为文件的结尾与记录相关联,而且不可能有有效的意外内容。

另一方面,这不是一个“可移植”的解决方案:如果您使用其他COBOL,您可能会发现,一旦到达文件结束,访问FD下的数据就不再有效。在标准中,没有定义在这种情况下发生的事情,所以编译器之间存在差异。

如果使用READ ... INTO ...并将记录布局放在WORKING-STORAGE中,则可以保留组项上的88,让它具有可移植性。这需要稍长的时间来执行,因为数据必须从一个位置传输到另一个位置。

我更喜欢文件状态字段中的88,并通过能够删除AT ENDEND-READ来简化读取。我已经无法访问FD下的记录区域,所以我不会意外地得到看起来很好的错误值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26349747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档