fortran 佛说如是甚深经典。我从昔来所得慧眼。未曾得闻如是之经。
手气不错
Article

010.character_字符类型

2026年5月13日入门级

字符类型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" # 字符串

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注