Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.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
使用cobol计算变量的长度字符串_Cobol - Fatal编程技术网

使用cobol计算变量的长度字符串

使用cobol计算变量的长度字符串,cobol,Cobol,我在数据库表中有一个注释 我如何计算那根绳子的长度 我有一个变量,定义如下 10 NOTE. 49 NOTE-LEN PIC S9(4) USAGE COMP. 49 NOTE-TEXT PIC X(500). 注释是一个500个字符的字符串。 我想计算音符长度。这里有一种常见的方法: MOVE ZERO TO count-of-trailing-spaces INSP

我在数据库表中有一个注释 我如何计算那根绳子的长度

我有一个变量,定义如下

10 NOTE.
    49 NOTE-LEN          PIC S9(4) USAGE COMP.
    49 NOTE-TEXT         PIC X(500).
注释是一个500个字符的字符串。 我想计算音符长度。

这里有一种常见的方法:

MOVE ZERO TO count-of-trailing-spaces                                     

INSPECT FUNCTION REVERSE ( NOTE-TEXT )                       
   TALLYING count-of-trailing-spaces                                        
   FOR LEADING SPACE

SUBTRACT count-of-trailing-spaces                                     
  FROM LENGTH OF ( NOTE-TEXT )
  GIVING NOTE-LEN
函数REVERSE
将字段的字节交换为相反顺序<代码>检查没有
计数。。。拖尾
(某些供应商的编译器除外,但它是非标准的),因此
检查。。。字段反转后,可以使用前导…

有时我应该脱掉我的讽刺帽子。如果使用
功能反转
,也要先检查字段中的空格,反转500个空格然后计算500个前导空格是没有意义的

还有“了解你的数据”。如果笔记大多很短,而且你做了很多,你可能想调查一下是否需要更快的笔记。这取决于你的数据和硬件是否能从中获益,但要记住这一点

也许值得调查的是,是否有人知道这个领域有多长,并且已经可以告诉你了

我只是从后面循环,计算空间(在第一次检查所有空间之后)。减少对CPU的压力。一种方法是:

IF NOTE-TEXT EQUAL TO SPACE
    MOVE ZERO TO NOTE-LEN
ELSE
    MOVE LENGTH OF NOTE-TEXT TO NOTE-LEN
    PERFORM 
      UNTIL NOTE-TEXT-BYTE ( NOTE-LEN ) 
        NOT EQUAL TO SPACE
          SUBTRACT +1 FROM NOTE-LEN
    END-PERFORM
END-IF
当然,这需要将
NOTE-TEXT-BYTE
定义为
NOTE-TEXT
的组成部分

49级可能很重要,所以不能这么巧妙:

49  NOTE-TEXT         PIC X(500).
49  NOTE-TEXT-BYTE
      REDEFINES NOTE-TEXT
      OCCURS 500      PIC X. 
也许49s为参考修改提供了一些理由。也许不是。这里是我最喜欢的:

If Note-Text > Spaces
    Perform Varying    Note-Len from Length of Note-Text by -1
      Until Note-Text (Note-Len: 1) > Space
    End-Perform
Else
    Move Zero to Note-Len
End-If
使用GNUCobol

FUNCTION LENGTH(FUNCTION TRIM(note-text TRAILING))
在COBOL 2014发布之前,零长度项目的定义是错误的。“函数修剪”将始终为“全空间”字段返回至少一个空间。由于标准中已经定义了零长度项目,在不久的将来,这种情况可能会改变

INSPECT FUNCTION REVERSE ( NOTE-TEXT )                       
   TALLYING count-of-trailing-spaces                                        
   FOR LEADING SPACE

SUBTRACT count-of-trailing-spaces                                     
  FROM LENGTH OF NOTE-TEXT
  GIVING NOTE-LEN
注:
LENGTH OF(NOTE-TEXT)->For LENGTH OF
函数()不是必需的

检查这个@Satya,线程不是很健壮。嵌入的空格呢?对于最多500字节的文本,我希望在某个地方有一些。如果使用
RESVERSE
我看到小于空格的尾随值将悄悄消失,您可能需要检查我的更新答案。我从来没有理解过比尔对空间的偏爱,当然你是对的。我假设Note文本将只包含可显示的1字节字符,否则就不清楚Note Len应该是什么。是的,我也是:-)只是如果不清楚,你会看到我所有的,我想不出不这样做的理由(除非规范说“去掉尾随空格和不可显示字符”)。我不明白为什么
>/
这么受欢迎。一定有人在某处声明了它……和其他人一样,它可以在测试
空间的
IF
中。整洁,清晰。用具有代表性的数据/体积确认它不会使CPU融化,这样就可以了。这不是问题的答案。这是对公认答案的评论,即
长度不需要括号。