ABAP--字符串变量和字符变量的区别

字符变量
字符变量是通过DATA语句后面跟上TYPE C进行定义的,且跟上LENGTH n来定义字符变量的长度。字符变量的长度定义后就不能再改变,它没有象C语言用'/0'表示字符变量结束。在ABAP中所有在字符右边的空格都将被忽略,也就是说将一个由空格字组成字符串赋值给字符变量,系统仍然认为是个空字符串(empty/initial)。
DATA: cvar    TYPE c  LENGTH 20,
         len      TYPE i.
cvar = '    '.
len = STRLEN( cvar ).
WRITE:/ 'Charlen: ', len. 
这段代码将一个由空格组成的字符串赋值给字符变量,系统得到变量长度是0.
注意:有一个特例,在concatenate语句中的separated by ' ',该语句中的 ' '将作为空格处理而非空字符串处理。

字符串变量
字符串变量在内存里是由两部分组成:数据管理头和字符串数据。在数据管理头里有指向字符串数据指针域和字符串长度指示域。字符串变量最大理论长度为2147483647个字符,它的长度常常受 ztta/max_memreq_MB 参数和并发处理进程限制。
DATA: svar    TYPE string,
         len      TYPE i.
svar = ' '.
len = STRLEN( svar ).
WRITE:/ 'Stringlen: ', len. 
运行该段代码,字符串的长度也是0。这主要由于字符常量' '在ABAP里当作字符变量处理,这样空格就被忽略了(也就是认为是初始化的)。
我们可以使用字符串常量来避免该问题。字符串常量和字符常量的区别主要起始和结束的标记符号不同,字符串常量使用“`”,字符常量使用“'”。使用字符串常量` `,我们将可以得到包含空格的字符串变量,系统将不忽略尾部的空格。
expected result:

DATA: svar    TYPE string,
         len      TYPE i.
svar = ` `.
len = STRLEN( svar ).
WRITE:/ 'Stringlen: ', len. 
注意:ABAP将保留关键字SPACE定义为一个字符长度的字符常量,参见系统代码单元:<SYSINI>。因此,将SPACE赋值给字符串变量,字符串变量认为空,而非是一个空格。如果要将空格串赋值给字符串变量,我们就需要用到字符串常量赋值。请参见下面用空格替换分号的代码:
DATA: cvar    TYPE c  LENGTH 20,
        svar    TYPE string,
         len      TYPE i.
cvar = 'A;B;C;D;E'. 
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH ' '.          " (1) 
WRITE:/ cvar. 
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH space.        " (2) 
WRITE:/ cvar. 
REPLACE ALL OCCURRENCES OF ';' IN cvar WITH ` ` .         " (3) 
WRITE:/ cvar. 
svar = `A;B;C;D;E`. 
REPLACE ALL OCCURRENCES OF ';' IN svar WITH ` `.          " (4) 
WRITE:/ svar.
运行该代码我们看到 (1) 和 (2)没有得到需要的结构,字符常量(space 和' ')都被系统当作空字符处理,而非空格字符处理。 代码(3) 也不能得出正确的结果,主要由于` `将先转换为字符变量,再参与计算,这样空格又被忽略。只有代码(4) 才能得到我们需要的结果: A B C D E.

与其他类型变量混合使用
DATA: cvar TYPE c LENGTH 20,svar TYPE string,pvar TYPE p LENGTH 5,l TYPE i.
pvar = 5.
cvar = pvar.
l = STRLEN( cvar ).
WRITE:/ 'Content: |', cvar, '| (', l, ')'.
svar = pvar.
l = STRLEN( svar ).
WRITE:/ 'Content: |', svar, '| (', l, ')'.
pvar = - 5.
cvar = pvar.
l = STRLEN( cvar ).
WRITE:/ 'Content: |', cvar, '| (', l, ')'.
svar = pvar.
l = STRLEN( svar ).
WRITE:/ 'Content: |', svar, '| (', l, ')'.
使用字符变量将使用右对齐的转换进行赋值,其中最右边一位为符号位,如果是正5符号将为空格将被忽略,字符长度将为19。如果负5的话符号将为"-"占用,那样字符长度将为20.
使用字符串变量将使用左对齐的转换进行赋值,其中最左边一位为符号位,,如果是正5符号将为空格,字符长度将为2。如果负5的话符号将为"-"占用,那样字符长度仍然为2.
对于这个赋值转换差异,大家在代码处理时一定要注意。

使用字符串变量的缺点
很多人都会认为使用字符串变量将会影响性能,其实这对于ABAP系统来说不是很大问题,ABAP程序的性能更多取决数据的处理性能。

子串处理
使用字符变量你可以使用下列方式进行字串赋值。
DATA: cvar TYPE c LENGTH 20,svar TYPE stringi.
cvar = 'Hello World'.
cvar+5(1) = ','.
write:/ cvar.
但对于字符串变量,你就不能这么操作,你就得需要使用REPLACE命令进行字串处理。
DATA: cvar TYPE c LENGTH 20,svar TYPE stringi.
svar = 'Hello World'."
 svar+5(1) = ','. <= compiler error
REPLACE SECTION OFFSET 5 LENGTH 1 OF svar WITH ','.
WRITE:/ svar.

So, you have to write a little bit more code.

 

字符串翻译
If you need to translate your report to different languages you can just add a nummer in brackets after the literal 'Error Message'(001) which is more readable as text-001. This is not working with string literals.

 

几个常用字符串处理类
CL_ABAP_CHAR_UTILITIES 

 CL_ABAP_STRING_UTILITIES

 

Source URL:http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/15889

你可能感兴趣的:(c,String,report,url,语言,compiler)