Skip to content

Fortran内置函数-字符串处理部分

下面列出 Fortran 2008 标准中全部 与字符(CHARACTER)处理有关的 17 个内置函数(intrinsic functions)。
每个都给出
- 原型(函数头)
- 参数表(含类型、意图、可选性)
- 返回值
- 功能与边界规则
- 典型示例代码

如无特别说明,所有参数 STRINGSTRING_ASTRING_BSUBSTRINGSETC 均为任意长度的默认字符型 character(len=*, kind=1)
可选参数 KIND 为整型标量,表示结果字符的 kind;
可选参数 BACK 为逻辑型标量,缺省为 .FALSE.


  1. LEN(STRING)
    原型
    integer function LEN(STRING)
      character(len=*), intent(in) :: STRING
    
  2. 返回 声明长度(不是当前有效字符数)。
  3. 结果与字符串内容、尾随空格无关。
    示例
    character(len=10) :: s = "abc"
    print *, LEN(s)        ! 10
    

  1. LEN_TRIM(STRING)
    原型
    integer function LEN_TRIM(STRING)
      character(len=*), intent(in) :: STRING
    
  2. 返回 去掉尾随空格后的有效长度
  3. 若全为空格,返回 0。
    示例
    print *, LEN_TRIM("FORTRAN   ")   ! 7
    

  1. TRIM(STRING)
    原型
    character(len=LEN(STRING)) function TRIM(STRING)
      character(len=*), intent(in) :: STRING
    
  2. 返回 去掉尾随空格后的子串,长度变为 LEN_TRIM(STRING)
  3. 结果长度在编译期不可知,只能用于表达式或赋值给自动长度变量。
    示例
    write(*,'(a)') '['//TRIM("Hello   ")//']'   ! [Hello]
    

  1. INDEX(STRING, SUBSTRING [, BACK])
    原型
    integer function INDEX(STRING, SUBSTRING, BACK)
      character(len=*), intent(in) :: STRING, SUBSTRING
      logical, optional, intent(in) :: BACK
    
  2. 返回 SUBSTRING 在 STRING 中首次出现的最左起始位置
    BACK=.TRUE. 则返回 最右出现位置;
    未找到返回 0。
  3. 空子串(SUBSTRING="")时,返回 1(BACK=.FALSE.)或 LEN(STRING)+1BACK=.TRUE.)。
    示例
    print *, INDEX("banana","an")          ! 2
    print *, INDEX("banana","an",BACK=.true.) ! 4
    

  1. SCAN(STRING, SET [, BACK])
    原型
    integer function SCAN(STRING, SET, BACK)
      character(len=*), intent(in) :: STRING, SET
      logical, optional, intent(in) :: BACK
    
  2. 返回 STRING 中 第一个(或最后一个,当 BACK=.TRUE.属于 SET 内任一字符的位置
    若都不属于,返回 0。
    示例
    print *, SCAN("FORTRAN","AEIOU")        ! 2 ('O')
    print *, SCAN("FORTRAN","aeiou",BACK=.true.) ! 0(大小写区分)
    

  1. VERIFY(STRING, SET [, BACK])
    原型
    integer function VERIFY(STRING, SET, BACK)
      character(len=*), intent(in) :: STRING, SET
      logical, optional, intent(in) :: BACK
    
  2. 与 SCAN 相反:返回 第一个(或最后一个)不在 SET 中的字符位置
    若全部都在 SET 中,返回 0。
    示例
    print *, VERIFY("123-45","0123456789")   ! 4(字符 '-')
    

  1. REPEAT(STRING, NCOPIES)
    原型
    character(len=LEN(STRING)*NCOPIES) function REPEAT(STRING, NCOPIES)
      character(len=*), intent(in) :: STRING
      integer, intent(in) :: NCOPIES
    
  2. 把原串连续复制 NCOPIES 次拼接。
  3. NCOPIES < 0 时返回空串;结果长度可能极大,注意截断。
    示例
    print *, REPEAT("HA",3)   ! HAHAHA
    

  1. ADJUSTL(STRING)
    原型
    character(len=LEN(STRING)) function ADJUSTL(STRING)
      character(len=*), intent(in) :: STRING
    
  2. 删除前导空格,并在尾部补相同数量空格,实现左对齐。
    示例
    print *, '"'//ADJUSTL("  left")//'"'   ! "left      "
    

  1. ADJUSTR(STRING)
    原型
    character(len=LEN(STRING)) function ADJUSTR(STRING)
      character(len=*), intent(in) :: STRING
    
  2. 删除尾随空格,并在前面补空格,实现右对齐。
    示例
    print *, '"'//ADJUSTR("right  ")//'"'   ! "     right"
    

  1. CHAR(I [, KIND])
    原型
    character(len=1, kind=KIND) function CHAR(I, KIND)
      integer, intent(in) :: I
      integer, optional, intent(in) :: KIND
    
  2. 返回 处理器字符集中位置 I 的字符(缺省 ASCII)。
  3. I 越界(<0 或 >127 对于 ASCII)结果由处理器决定。
    示例
    print *, CHAR(65)   ! 'A'
    

  1. ACHAR(I)
    原型
    character(len=1) function ACHAR(I)
      integer, intent(in) :: I
    
  2. ASCII 字符集版本 CHAR;保证返回 ASCII 字符。
    示例同上。

  1. ICHAR(C)
    原型
    integer function ICHAR(C)
      character(len=1), intent(in) :: C
    
  2. 返回 处理器字符集中 C 的位置(与 CHAR 互逆)。

  1. IACHAR(C)
    原型
    integer function IACHAR(C)
      character(len=1), intent(in) :: C
    
  2. 返回 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 等)均可直接使用。