Fortran系列:
字符串拼接和切片
在fortran
中,字符可以用单引号或者双引号表示,通过character
声明时,可以通过len()
函数指定字符串的最大长度,这些都是早在介绍fortran
类型时就已经提到过的。
如果用数组的角度理解,字符串就是由字符组成是数组,所以可通过(:)
语法进行索引。此外,通过//
运算符可以对字符串进行拼接。
program tinycool
implicit none
character(len = 15) :: surname, firstname
character(len = 30):: name
firstname = 'tiny'
surname = 'cool'
name = firstname//surname
print *, name
print *, name(:5)
end program tinycool
结果为
>a.exe
tiny cool
tiny
trim去除空格
上面输出的name
中间出现了冗长的空格,这是因为surname
的长度是15,但只有4个可见字符,剩下的就都用空格补全了,这太难受了,通过trim
函数可以去除这个东西
program tinycool
implicit none
character(len = 15) :: surname, firstname
character(len = 30):: name
firstname = 'tiny'
surname = 'cool'
name = trim(firstname)//surname
print *, name
print *, name(:5)
end program tinycool
结果为
>a.exe
tinycool
tinyc
对齐
由于字符串规定的长度往往大于可见字符的长度,所以可见字符的位置就有很大的活动空间。通过adjustl
和adjustr
可以让字符居左或者居右
program tinycool
implicit none
character(len = 15) :: surname, firstname
character(len = 30):: name
firstname = 'tiny'
surname = 'cool'
name = adjustl(firstname)//adjustr(surname)
print *, name
name = adjustr(firstname)//adjustl(surname)
print *, name
end program tinycool
效果如下
>a.exe
tiny cool
tinycool
查询和索引
通过index
函数,可以在一个字符串中找到另一个字符串所在的位置,如果返回值为0,代表不存在
program tinycool
implicit none
character(len = 15) :: surname, firstname
character(len = 30):: name
firstname = 'tiny'
surname = 'cool'
name = trim(firstname)//surname
if(index(name, trim(surname)) == 0)then
print *, 'test is not found'
else
print *, 'test is found at index: ', index(name, trim(surname))
end if
end program tinycool
结果为
>a.exe
test is found at index: 5
格式转换
字符虽然看上去和数字没什么关系,但其编码过程仍然需要与数字进行意义对应,fortran
中提供了ASCII码的转换函数
ACHAR(n)
将ASCII转为字符, n = 0 , 1 , ⋯ , 127 n=0,1,\cdots,127 n=0,1,⋯,127CHAR(n)
将ASCII转为字符, n = 0 , 1 , ⋯ , 255 n=0,1,\cdots,255 n=0,1,⋯,255IACHAR(c)
将字符c
转为ASCII,范围是 0 , 1 , ⋯ , 127 0,1,\cdots,127 0,1,⋯,127ICHAR(c)
将字符c
转为ASCII,范围是 0 , 1 , ⋯ , 255 0,1,\cdots,255 0,1,⋯,255
此外,还提供了基于ASCII对字符串进行比较的函数
真值条件 | 真值条件 | ||
---|---|---|---|
GE(s1,s2) | s 1 ⩾ s 2 s_1\geqslant s_2 s1⩾s2 | LGT(s1,s2) | s 1 > s 2 s_1>s_2 s1>s2 |
LLE(s1,s2) | s 1 ⩽ s 2 s_1\leqslant s_2 s1⩽s2 | LLT(s1,s2) | s 1 < s 2 s_1<s_2 s1<s2 |