Fortran的character(len=n)对象具有固定长度。赋值时,右侧较短会在右端补空格,右侧较长会从右端截断,左侧对象的声明长度不会随内容改变。这种规则常用于固定宽度编号、表格字段和传统文本记录;适合处理字段长度已由文件格式规定的情况,不适合在未知长度文本中悄然丢失尾部内容。
语法结构
character(len=n) :: text
text = character_expression
- 右侧长度小于n时,先复制已有字符,再用空格补满左侧剩余位置。
- 右侧长度大于n时,只保留最左侧n个字符;被截掉的字符不能从左侧变量中恢复。
- 这是标准赋值语义,不是字符串末尾添加NUL字符。启用字符截断警告时,编译器可以提醒长度已知的截断。
本文代码
! 观察定长字符变量赋值时的补空格和截断。
program characterLengthAssignmentDemo
implicit none
character(len=8) :: materialCode
character(len=11) :: sourceText
materialCode = "Fe"
write (*, "(A,A8,A)") "短值赋值:|", materialCode, "|"
sourceText = "temperature"
materialCode = sourceText
write (*, "(A,A8,A)") "长值赋值:|", materialCode, "|"
end program characterLengthAssignmentDemo
编译运行
(base) hong@hongdeMacBook-Pro 054.characterLengthAssignment % gfortran -Wall -Wextra -Wno-character-truncation -std=f2018 exampleCharacterLengthAssignment.f90 -o characterLengthAssignmentDemo
(base) hong@hongdeMacBook-Pro 054.characterLengthAssignment % ./characterLengthAssignmentDemo
短值赋值:|Fe |
长值赋值:|temperat|
现象分析
materialCode的长度固定为8。字符串Fe只有2个字符,因此赋值后右侧自动补入6个空格;竖线把这些不可见空格的范围显示出来。
temperature共有11个字符。赋给长度8的materialCode后,只保留前8个字符temperat,最后3个字符ure被截去。
程序中的sourceText只是让较长来源单独可见。即使来源是变量,赋值规则仍由左右两侧的字符长度决定。
核心知识点
- character变量的长度是类型参数,普通赋值不会改变该长度。
- 短值右侧补空格,长值右侧截断;两种处理都发生在赋值时。
- 输出或比较定长字符时,需要意识到尾部空格仍属于字符值。
- 重要文本若不允许丢失,应在赋值前检查长度,或在后续课程中使用延迟长度字符。