Fortran内置函数-字符串处理部分
下面列出 Fortran 2008 标准中全部 与字符(CHARACTER)处理有关的 17 个内置函数(intrinsic functions)。 每个都给出 :
- 原型(函数头)
- 参数表(含类型、意图、可选性)
- 返回值
- 功能与边界规则
- 典型代码
如无特别说明,所有参数 STRING、STRING_A、STRING_B、SUBSTRING、SET、C 均为任意长度的默认字符型 character(len=*, kind=1);
可选参数 KIND 为整型标量,表示结果字符的 kind;
可选参数 BACK 为逻辑型标量,缺省为 . FALSE.。
- LEN(STRING)
integer function LEN(STRING)
character(len=*), intent(in) :: STRING- 返回 声明长度(不是当前有效字符数)。
- 结果与字符串内容、尾随空格无关。
character(len=10) :: s = "abc"
print *, LEN(s) ! 10- LEN_TRIM(STRING)
integer function LEN_TRIM(STRING)
character(len=*), intent(in) :: STRING- 返回 去掉尾随空格后的有效长度。
- 若全为空格,返回 0。
print *, LEN_TRIM("FORTRAN ") ! 7- TRIM(STRING)
character(len=LEN(STRING)) function TRIM(STRING)
character(len=*), intent(in) :: STRING- 返回 去掉尾随空格后的子串,长度变为
LEN_TRIM(STRING)。 - 结果长度在编译期不可知,只能用于表达式或赋值给自动长度变量。
write(*,'(a)') '['//TRIM("Hello ")//']' ! [Hello]- INDEX(STRING, SUBSTRING [, BACK])
integer function INDEX(STRING, SUBSTRING, BACK)
character(len=*), intent(in) :: STRING, SUBSTRING
logical, optional, intent(in) :: BACK- 返回 SUBSTRING 在 STRING 中首次出现的最左起始位置;
若BACK=.TRUE.则返回 最右出现位置;
未找到返回 0。 - 空子串(
SUBSTRING="")时,返回 1(BACK=.FALSE.)或LEN(STRING)+1(BACK=.TRUE.)。
print *, INDEX("banana","an") ! 2
print *, INDEX("banana","an",BACK=.true.) ! 4- SCAN(STRING, SET [, BACK])
integer function SCAN(STRING, SET, BACK)
character(len=*), intent(in) :: STRING, SET
logical, optional, intent(in) :: BACK- 返回 STRING 中 第一个(或最后一个,当
BACK=.TRUE.)属于 SET 内任一字符的位置;
若都不属于,返回 0。
print *, SCAN("FORTRAN","AEIOU") ! 2 ('O')
print *, SCAN("FORTRAN","aeiou",BACK=.true.) ! 0(大小写区分)- VERIFY(STRING, SET [, BACK])
integer function VERIFY(STRING, SET, BACK)
character(len=*), intent(in) :: STRING, SET
logical, optional, intent(in) :: BACK- 与 SCAN 相反: 返回 第一个(或最后一个)不在 SET 中的字符位置;
若全部都在 SET 中,返回 0。
print *, VERIFY("123-45","0123456789") ! 4(字符 '-')- REPEAT(STRING, NCOPIES)
character(len=LEN(STRING)*NCOPIES) function REPEAT(STRING, NCOPIES)
character(len=*), intent(in) :: STRING
integer, intent(in) :: NCOPIES- 把原串连续复制
NCOPIES次拼接。 NCOPIES < 0时返回空串;结果长度可能极大,注意截断。
print *, REPEAT("HA",3) ! HAHAHA- ADJUSTL(STRING)
character(len=LEN(STRING)) function ADJUSTL(STRING)
character(len=*), intent(in) :: STRING- 删除前导空格,并在尾部补相同数量空格,实现左对齐。
print *, '"'//ADJUSTL(" left")//'"' ! "left "- ADJUSTR(STRING)
character(len=LEN(STRING)) function ADJUSTR(STRING)
character(len=*), intent(in) :: STRING- 删除尾随空格,并在前面补空格,实现右对齐。
print *, '"'//ADJUSTR("right ")//'"' ! " right"- CHAR(I [, KIND])
character(len=1, kind=KIND) function CHAR(I, KIND)
integer, intent(in) :: I
integer, optional, intent(in) :: KIND- 返回 处理器字符集中位置 I 的字符(缺省 ASCII)。
- I 越界(<0 或 >127 对于 ASCII)结果由处理器决定。
print *, CHAR(65) ! 'A'- ACHAR(I)
character(len=1) function ACHAR(I)
integer, intent(in) :: I- ASCII 字符集版本 CHAR;保证返回 ASCII 字符。
同上。
- ICHAR©
integer function ICHAR(C)
character(len=1), intent(in) :: C- 返回 处理器字符集中 C 的位置(与 CHAR 互逆)。
- IACHAR©
integer function IACHAR(C)
character(len=1), intent(in) :: C- 返回 ASCII 码值(与 ACHAR 互逆)。
print *, IACHAR('a') ! 9714-17. 词汇比较函数
LGE(STRING_A, STRING_B)
LGT(STRING_A, STRING_B)
LLE(STRING_A, STRING_B)
LLT(STRING_A, STRING_B)
原型统一
logical function L??(STRING_A, STRING_B)
character(len=*), intent(in) :: STRING_A, STRING_B- 依据 ASCII 顺序 做逐字符比较;大小写敏感。
- 返回值含义:
LGE: ≥;LGT: >;LLE: ≤;LLT: <。
print *, LGT("apple","Apple") ! T小结速查表
| 功能类别 | 函数名 |
|---|---|
| 长度 | LEN, LEN_TRIM |
| 去空格 | TRIM, ADJUSTL, ADJUSTR |
| 查找 | INDEX, SCAN, VERIFY |
| 重复 | REPEAT |
| 字符 ←> 码值 | CHAR, ACHAR, ICHAR, IACHAR |
| 词汇比较 | LGE, LGT, LLE, LLT |
以上 17 个函数全部属于 Fortran 2008 标准 的 intrinsic inquiry/transformational functions,任何合规编译器(gfortran ≥ 4.8、ifort、nvfortran 等)均可直接使用。