You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran拼接字符串整数生成可变格式报错:缺失格式左括号

Fortran可变格式字符串问题解答

我需要为Fortran的WRITE语句创建可变格式,编写了如下测试程序(nvari为变量):

program VariableFormat
  implicit none

  integer              :: x = 1,y = 2, z = 3, i, nvari
  double precision     :: pi = 3.14
  integer, allocatable :: var(:)
  integer              :: A(3) = (/1,2,3/)
  character(100)       :: fmt,fmt2,str1,str2,str3

  print*, size(A)
  allocate(var(size(A)))
  do i = 1, size(A)
     var(i) = A(i)
  end do
  nvari = 2
  !
  ! first part
  !
  fmt = '(a,f4.2)'
  write(*,fmt) "The value of pi is ", pi
  !
  ! second part
  ! 
  write (str1, "(1A2,1I1,1A1,1I2,1A1)") "'(", 3, "I", 15, ","
  print*, str1
  write(str2,'(I10)') nvari
  print*, str2
  write (str3, "(1A1,1I2,1A2)") "I", 15, ")'"
  print*, str3
  fmt2 = trim(adjustl(str1))//trim(adjustl(str2))//trim(adjustl(str3))
  print*, fmt2
  write(*,fmt2) x,y,z,(var(i),i=1,nvari)
  
end program VariableFormat

问题一:运行时格式错误

运行第二部分时报错:

At line 32 of file VariableFormat.F90 (unit = 6, file = 'stdout')
Fortran runtime error: Missing initial left parenthesis in format
'(3I15,2I15)' 

明明fmt2看起来和fmt格式类似,都是'(X,Y)'形式,为什么提示缺失左括号?

解答

问题出在fmt2包含了多余的单引号:

  • 第一部分的fmt = '(a,f4.2)'中,单引号是Fortran字符串的定界符,不是格式字符串的内容,实际fmt存储的内容是(a,f4.2),符合Fortran格式字符串的要求。
  • 而你通过str1/str2/str3拼接生成的fmt2,内容是'(3I15,2I15)'——把单引号也包含在了格式字符串里。Fortran解析格式时,第一个字符是单引号',而非预期的左括号(,因此报错“缺失左括号”。

解决方法:去掉拼接时加入的单引号,让fmt2的内容直接是(3I15,2I15),比如修改str1和str3的写入内容:

write (str1, "(1A1,1I1,1A1,1I2,1A1)") "(", 3, "I", 15, ","  ! 去掉开头的单引号
write (str3, "(1A1,1I2,1A1)") "I", 15, ")"                  ! 去掉结尾的单引号

问题二:更简洁的生成fmt2的方式

解答

完全不需要拆分三个字符串拼接,直接用一次内部WRITE就能生成目标格式字符串,还能避免trim/adjustl的冗余操作:

! 用I0格式自动输出无空格的整数,无需额外处理
write(fmt2, '(A,I0,A,I0,A)') '(', 3, 'I15,', nvari, 'I15)'

如果要更灵活,比如用数组A的大小代替硬编码的3,可以写成:

write(fmt2, '(A,I0,A,I0,A)') '(', size(A), 'I15,', nvari, 'I15)'

一行代码即可生成正确的格式字符串,无需额外处理空格或拼接。

内容的提问来源于stack exchange,提问作者user790082

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:10:54