fortran fortran中文资料网
手气不错
Article

059.characterSearch_INDEX、SCAN与VERIFY

2026年9月30日基础级

index查找子串,scan查找属于给定字符集合的字符,verify查找不属于给定字符集合的字符;找不到时三者都返回0。它们常用于解析配置行、定位分隔符和验证数字文本;适合结构较简单的字符记录,并可与子串配合提取字段。

语法结构

position = index(string, substring [, back])
position = scan(string, set [, back])
position = verify(string, set [, back])
  • index返回substring第一次出现的起始位置;back=.true.时从结果意义上选择最后一次出现。
  • scan把set看成字符集合,返回string中第一个属于该集合的字符位置。
  • verify执行相反检查,返回第一个不属于set的字符位置;返回0表示所有字符都通过集合验证。

本文代码

! 从配置记录中查找分隔符、数字和非法字符。
program characterSearchDemo
  implicit none

  character(len=32) :: configLine
  character(len=8) :: method, stepText
  character(len=4) :: invalidStepText
  integer :: equalPosition, separatorPosition, firstDigit

  configLine = "method=rk4;steps=1200"
  equalPosition = index(configLine, "=")
  separatorPosition = index(configLine, ";")
  firstDigit = scan(configLine, "0123456789")

  method = configLine(equalPosition + 1:separatorPosition - 1)
  stepText = configLine(index(configLine, "steps=") + 6:len_trim(configLine))
  invalidStepText = "12O0"

  print "(A,I0)", "等号位置:", equalPosition
  print "(A,I0)", "分号位置:", separatorPosition
  print "(A,I0)", "首个数字位置:", firstDigit
  print "(A,A)", "积分方法:", trim(method)
  print "(A,A)", "步数文本:", trim(stepText)
  print "(A,I0)", "1200中的非法字符位置:", &
    verify(trim(stepText), "0123456789")
  print "(A,I0)", "12O0中的非法字符位置:", &
    verify(invalidStepText, "0123456789")
end program characterSearchDemo

编译运行

(base) hong@hongdeMacBook-Pro 059.characterSearch % gfortran -Wall -Wextra -std=f2018 exampleCharacterSearch.f90 -o characterSearchDemo
(base) hong@hongdeMacBook-Pro 059.characterSearch % ./characterSearchDemo
等号位置:7
分号位置:11
首个数字位置:10
积分方法:rk4
步数文本:1200
1200中的非法字符位置:0
12O0中的非法字符位置:3

现象分析

method=rk4;steps=1200中,第7个字符是等号,第11个字符是分号,因此二者之间的record(8:10)为rk4。

scan从左到右寻找任意数字。rk4中的4位于整条记录第10位,所以首个数字位置是10,而不是步数字段的起点。

verify用0123456789验证步数文本。1200的每个字符都在集合中,因此返回0;12O0的第3个字符是字母O,不在数字集合中,因此返回3。

核心知识点

  • index查子串,scan查集合内字符,verify查集合外字符。
  • 返回值是从1开始的位置,0表示没有找到目标。
  • 可选back=.true.用于取得最右侧匹配。
  • verify返回0是全部合法,不是第0个字符。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注