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)结果由处理器决定。
示例
- ACHAR(I)
原型
character(len=1) function ACHAR(I)
integer, intent(in) :: I
- ASCII 字符集版本 CHAR;保证返回 ASCII 字符。
示例同上。
- ICHAR(C)
原型
integer function ICHAR(C)
character(len=1), intent(in) :: C
- 返回 处理器字符集中 C 的位置(与 CHAR 互逆)。
- IACHAR(C)
原型
integer function IACHAR(C)
character(len=1), intent(in) :: C
- 返回 ASCII 码值(与 ACHAR 互逆)。
示例
print *, IACHAR('a') ! 97
14–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 等)均可直接使用。