字符类型character用来保存文本内容,适合表示名称、单位、标签、文件名、提示语等字符串数据。
本文代码
program characterDemo
implicit none
character(len=24) :: equationName ! 定义名为equationName最大长度是24字符的字符型变量
character(len=12) :: speedUnit
character(len=20) :: dataFileName
equationName="Navier-Stokes" ! 字符赋值,右侧文本要放在引号中
speedUnit="m/s" ! 字符串可保存单位
dataFileName="run_001.dat" ! 字符串中可以保存文件名
print *,"本例为character字符类型:"
print *,"equationName=",equationName,"end"
print *,"equationName=",trim(equationName),"end"
print *,"speedUnit=",trim(speedUnit)
print *,"dataFileName=",trim(dataFileName)
end program characterDemo
编译运行
(base) hong@hongdeMacBook-Pro 010.character % gfortran exampleCharacter.f90
(base) hong@hongdeMacBook-Pro 010.character % ./a.out
本例为character字符类型:
equationName=Navier-Stokes end
equationName=Navier-Stokesend
speedUnit=m/s
dataFileName=run_001.dat
(base) hong@hongdeMacBook-Pro 010.character %
运行结果
- equationName是字符型变量,声明时写成character(len=24) :: equationName,表示将字符串”Navier-Stokes”赋值给字符型变量equationName。其输出结果显示为:equationName=Navier-Stokes。但真实输出却是equationName=Navier-Stokes 11个空格 end,是因为
- equationName变量长度为24,Navier-Stokes只有13个字符
- equationName变量在输出时我没有用trim截断空格,所以编译器在右侧自动补了11个空格
- 我在后面加了”end”作为演示
- 在下一行我使用了trim(equationName),结果自然是把两个字符串(变量equationName的字面量+”end”)连起来。
- speedUnit字符型变量,声明时写成character(len=12) :: speedUnit,将字符串”m/s”赋值给speedUnit。输出结果显示为:speedUnit=m/s。
- dataFileName同理。
知识点总结
- fortran的character(len=…)是定长字符串;赋值内容不足指定长度时,右侧会自动补空格。trim()的作用是去掉字符串右侧的尾部空格,常用于输出和字符串拼接。
- 关于字符与字符串
- 通常来说,字符表示单个字符,如 “A”、”b”、”9″;字符串表示多个连续字符,如 “name:”、”label01″、”李四”。
- 在fortran语言中我把使用character类型声明的变量统一表述为“字符型变量”,这也贴合对character的直译”字符”。赋值给character变量的右侧内容通常称为字符串字面量;当长度为1时,也可以称为字符。
- 综上,我在运行结果中讲表示将字符串”Navier-Stokes”赋值给字符型变量equationName是准确的。
- 相较于其他常见编程语言,fortran不同于C#/C/C++要把字符与字符串严格分成两种类型。C的设计哲学是”字符=1字节;字符串=一串字节+\0来贴近内存,看上去很底层”,而fortran专注计算,早期没有作灵活地字符串设计,统一使用character表示字符型变量,很类似python没有char而统一使用string的高级抽象。
// csharp
char c = 'A'; // 字符类型
string s = "ABC"; // 字符串
// c
char c = 'A'; // 字符类型
char s[] = "ABC"; // C语言并没有内建的string类型。表示字符串时用“字符数组+结尾的空字符'\0'”。如char s[] = "ABC"; 实际包含了'A','B','C','\0' 四个字符,其中'\0'是空字符,数值为0,其用来表示字符串结束,所以数组大小是4,strlen(s)的结果是3。
// c++
char c = 'A'; // 字符类型
std::string s = "ABC"; // 字符串类型
% matlab
c = 'A'; % 字符/字符数组,长度为1
s = "ABC"; % 字符串类型string
s2 = 'ABC'; % 字符数组char array,并非string类型
# python
c = 'A' # python没有单独的char类型,一般使用'A'表示字符
s = "ABC" # 字符串类型str
# R
ch <- 'A' # 字符串,之前用c代表char,但R语言有内置函数c(),所以使用ch代替。
s <- "ABC" # 字符串