Fortran 字符串学习

今天遇到一个问题:

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值