如何在打印彩色文本时排除ANSI转义序列的长度影响?
解决Fortran中ANSI转义序列导致输出空格的问题
问题根源
你定义的red、reset、redO都是固定长度的字符变量,ANSI转义序列的字符会占用这些变量的长度配额,再加上固定长度变量本身会自动补空格到指定长度,哪怕用trim和adjustl处理,也没法完全消除固定长度带来的多余空格,最终导致输出带空格。
解决方案1:使用可变长度字符变量
把字符变量改成可变长度(可分配)类型,这样字符串长度会自动匹配实际内容,不会有多余空格:
!example program main implicit none character(len=:), allocatable :: red, reset, redO red = char(27) // '[31m' reset = char(27) // '[0m' redO = red // "O" // reset write (*,'(A)') redO end program main
解决方案2:直接分部分输出
不需要把转义序列和字符合并到一个变量里,直接在write语句中依次输出转义序列、字符、重置序列,这样完全不会有长度问题:
!example program main implicit none character(len=*), parameter :: red = char(27) // '[31m' character(len=*), parameter :: reset = char(27) // '[0m' write (*,'(A,A,A)') red, "O", reset end program main
这里用character(len=*)参数类型,会自动匹配实际字符串长度,同样避免固定长度的问题。
效果验证
两种方法都能输出纯红色的'O',不会有多余空格,和你期望的输出一致。
内容的提问来源于stack exchange,提问作者name castle
相关产品推荐
相关产品推荐

