我想在COBOL中编写一个函数,将PIC X(60)数据类型的字符转换为大写。虽然我知道这样做的一种方法,但我希望能够手动浏览字母并添加一个常量从小写到大写,但我似乎无法对PIC X数据类型执行任何算术除非我把它们重新定义为其他东西,但是我似乎破坏了原来的X字符。
有人可以给我一个例子,说明如果给定PIC X变量,你可以将它增加1个字母(即a - > b,d - > e ...等)。换句话说,我希望能够为此变量添加1:
01 char-temp pic x.
谢谢,
伊万
答案 0 :(得分:3)
以这种方式进行大小写折叠通常是一个非常糟糕的主意,它实际上只适用于7位ASCII。你问的是可能的,甚至是容易做的,但我会提到一些其他的方法来首先大写你的数据。
最简单的方法:
Move function upper-case(my-src-field) To my-tgt-field
非常简单的方法:
Inspect my-field
converting 'abc...z' to 'ABC...Z'
End-Inspect
很难,将一个添加到01 char-temp pic x:
01 my-working-storage.
02 char-temp-area.
03 filler pic x.
03 char-temp pic x.
02 char-temp-9 redefines char-temp-area pic s9(4) comp
然后你可以:
Move 'A' to char-temp
Add +1 to char-temp-9
char-temp将包含'B'。正如其他人所提到的,Cobol对单字节二进制数学并不好,所以你必须使你的字符适合二进制数的低字节,在这种情况下是一个2字节的二进制数。
答案 1 :(得分:1)
你可能很顽皮,并使用重新定义,例如:
01 char-temp pic x.
01 char-temp9 pic 99 comp-x redefines char-temp.
move 65 to char-temp9
display char-temp
或使用参考修改:
01 char-temp pic x.
01 char-temp9 pic 99 comp-x.
move 65 to char-temp9
move char-temp9(1:length of char-temp9) to char-temp
display char-temp
我相信他们也是其他方法......
答案 2 :(得分:1)
单个字符通常占用一个字节的内存。标准COBOL没有一个字节的二进制数值数据类型(注意:PIC 9 USAGE DISPLAY
是数字的字符表示,而不是数字的二进制表示)。因此,对COBOL中的单个字符进行二进制arithemetic并不适合你。
即使您可以对字符执行arithementic,您可能会对字符的二进制表示做出错误的假设 - 字母'b'不一定等于'a'的二进制表示加1(它可能适用于ASCII但不适用于EBCDIC)。
最后,如果要将一个字符替换为另一个字符,则应调查COBOL INSPECT
语句。与bit twiddling不同,INSPECT
完全可移植。
答案 3 :(得分:0)
有人可以给我一个例子,给出一个PIC X变量,你可以 将它增加1个字母(即a - > b,d - > e ...等)。换一种说法, 我希望能够为此变量添加1:
01 char-temp pic x.
对于COBOL 85,可以使用内在函数CHAR
和ORD
。
program-id. add1.
data division.
working-storage section.
1 char-temp pic x.
procedure division.
begin.
move "a" to char-temp
display char-temp "->" with no advancing
perform add-1-to-char
display char-temp
stop run
.
add-1-to-char.
move function char (function ord (char-temp) + 1)
to char-temp
.
end program add1.
结果:
a->b