今天遇到一个问题:
program test_string
integer :: I_LINE_NUMBER = 10
character(Len=20) string
character(Len=20) char_I_LINE_NUMBER
character(Len=10) char_I_LINE_NUMBER2
write(char_I_LINE_NUMBER, *) I_LINE_NUMBER
write(6,*) char_I_LINE_NUMBER
write(char_I_LINE_NUMBER2, *) I_LINE_NUMBER
write(6,*) char_I_LINE_NUMBER2
!char_I_LINE_NUMBER = trim(char_I_LINE_NUMBER)
!write(6,*) char_I_LINE_NUMBER
!char_I_LINE_NUMBER = trim(adjustl(adjustr(char_I_LINE_NUMBER)))
!write(6,*) char_I_LINE_NUMBER
end program test_string
执行后出现如下错误:需要弄清 fortran 转换字符串时,是不是有一个默认最短长度
[root@kentvm01x64 string]# ./a.out
10
forrtl: severe (66): output statement overflows record, unit -5, file Internal List-Directed Write
Image PC Routine Line Source
a.out 000000000046D10A Unknown Unknown Unknown
a.out 000000000046BC06 Unknown Unknown Unknown
a.out 0000000000440A40 Unknown Unknown Unknown
a.out 000000000042544E Unknown Unknown Unknown
a.out 000000000042498F Unknown Unknown Unknown
a.out 00000000004092C8 Unknown Unknown Unknown
a.out 0000000000407498 Unknown Unknown Unknown
a.out 0000000000402B94 Unknown Unknown Unknown
a.out 0000000000402A8C Unknown Unknown Unknown
libc.so.6 000000368821D994 Unknown Unknown Unknown
a.out 0000000000402999 Unknown Unknown Unknown
示例代码
program test_string
integer :: I_LINE_NUMBER = 10
character(Len=20) :: string = "loop"
character(Len=20) :: string2 = " LOOPA "
character(Len=20) char_I_LINE_NUMBER
character(Len=10) char_I_LINE_NUMBER2
write(char_I_LINE_NUMBER, *) I_LINE_NUMBER ! int 转化为字符串后, 数值会居中在中间,如 " 10 "
write(6,*) "(1)"
write(6,*) char_I_LINE_NUMBER !左右均有空格, 10 居中.
!write(char_I_LINE_NUMBER2, *) I_LINE_NUMBER ! 会出错, overflow
!write(6,*) char_I_LINE_NUMBER2
write(6,*) "final"
write(6,*) trim(adjustl(char_I_LINE_NUMBER))
write(6,*) trim(char_I_LINE_NUMBER) !左有空格, 右侧没有
char_I_LINE_NUMBER = trim(char_I_LINE_NUMBER)
write(6,*) "(2) ????? "
write(6,*) char_I_LINE_NUMBER ! 左右均有空格, 为什么右侧空格没有除去 ??
write(6,*) "(3)"
write(6,*) trim(char_I_LINE_NUMBER) !左有空格, 右侧没有
write(6,*) "(4)"
write(6,*) char_I_LINE_NUMBER ! 左右均有空格
write(6,*) "(5)"
write(6,*) "trim"//trim(char_I_LINE_NUMBER) !左有空格, 右侧空格除去了
char_I_LINE_NUMBER = trim(adjustl(adjustr(char_I_LINE_NUMBER)))
write(6,*) char_I_LINE_NUMBER ! 右边有空格,左侧无空格. 说明字符串赋值时,如果长度没填满,右侧自动补上空格.
write(6,*) trim(adjustl(adjustr(char_I_LINE_NUMBER))) !左侧有一个空格, 右侧没有空格. 实际上左右侧的空格均全部去掉了.
write(6,*) string !左侧有一个空格, 右侧有空格.
write(6,*) trim(string) ! 去掉右侧的空格
write(6,*) trim(adjustl(adjustr(string))) !左侧还有一个空格. 说明 fortran 默认输出时左侧输出一个空格
write(6,*) "hello" !常量字符串,输出时左侧会有一个空格,尾部没有
write(6, *) "hello"//string ! 输出的是 "helloloop " 说明 fortran 默认左侧输出一个空格.
write(6, *) 'hello'//trim(string) ! 输出的是 "helloloop"
write(6, *) 'hello'//adjustr(string) !输出的是 "hello loop"
write(6, *) 'hello'//adjustl(string) !输出的是 "helloloop "
write(6, *) string2
write(6, *) trim(string2) !右侧没有空格
string2 = trim(string2)
write(6, *) string2 !左右均有空格
string2 = trim(adjustl(string2))
write(6, *) string2 !左边无空格, 右侧有. 这说明了 赋值语句 string2 = trim(string2) 没有效果.
!即 trim 对那些左右均有空格的字符串处理后赋值无作用.
!只对左侧没有空格的字符串处理好赋值有作用. 带考证.
write(6, *) "Best"
!最佳方式, trim 放在外侧.
! adjustl 的作用是将字符串移到最左侧, 左对齐
! adjustr 的作用是将字符串移到最右侧, 右对齐
! trim 是去除字符串右侧的空格,貌似若字符串左侧也有空格,则无效果,待考证.
write(6,*) trim(adjustl(char_I_LINE_NUMBER)) write(6,*) trim(adjustl(string)) write(6,*) trim(adjustl(string2)) end program test_string! 字符串赋值时,如果长度没填满,右侧自动补上空格.