text(i:j)引用字符变量从第i到第j个字符形成的连续子串,既能读取局部字段,也能作为赋值左侧修改原字符串的一部分。它常用于固定列文本、日期编码和结构化编号;适合字段起止位置稳定的记录,并应与长度或输入格式检查结合,避免区间越界。
语法结构
part = text(first:last)
text(first:last) = replacement
part = text(:last)
part = text(first:)
- 字符位置从1开始,区间两端都包含;text(i:i)是长度1的子串。
- 省略first时从第1个字符开始,省略last时延伸到字符对象末尾。
- 对子串赋值时,右侧同样按子串长度补空格或截断;区间必须落在字符对象边界内。
本文代码
! 从固定格式记录中读取局部字段,并只修改状态字段。
program substringDemo
implicit none
character(len=18) :: record
record = "STN042|20260929|OK"
print "(A,A)", "完整记录:", record
print "(A,A)", "站点编号:", record(1:6)
print "(A,A)", "年份:", record(8:11)
print "(A,A)", "月份:", record(12:13)
print "(A,A)", "日期:", record(14:15)
print "(A,A)", "原状态:", record(17:18)
record(17:18) = "ER"
print "(A,A)", "修改后记录:", record
end program substringDemo
编译运行
(base) hong@hongdeMacBook-Pro 056.substring % gfortran -Wall -Wextra -std=f2018 exampleSubstring.f90 -o substringDemo
(base) hong@hongdeMacBook-Pro 056.substring % ./substringDemo
完整记录:STN042|20260929|OK
站点编号:STN042
年份:2026
月份:09
日期:29
原状态:OK
修改后记录:STN042|20260929|ER
现象分析
记录是由6字符站点编号、分隔符、8字符日期、分隔符和2字符状态组成。因而record(1:6)取到STN042,record(8:11)、record(12:13)和record(14:15)分别取到年、月、日。
record(17:18)最初为OK。把同样长度的ER赋给该子串,只改动第17和18个字符,前面的站点与日期字段保持不变。
子串只是原字符对象的一个区间视图。适合固定位置记录;若分隔符位置可能变化,可以用INDEX或其他的搜索方法。
核心知识点
- 子串上下界从1开始且两端均包含。
- 子串可以出现在表达式中,也可以作为赋值目标。
- 对子串赋值不会改变原字符对象的总长度。
- 固定区间适合固定格式记录,可变格式文本应先搜索边界。