Fortran 77中的字符串数组

Siu*_*Siu 7 string fortran character fortran77

我有一个关于Fortran 77的问题,但我找不到解决方案.

我正在尝试存储一个字符串数组,定义如下:

character matname(255)*255
Run Code Online (Sandbox Code Playgroud)

Wich是255个长度为255的字符串.

后来我从文件中读取了名称列表,并按如下方式设置了数组的内容:

matname(matcount) = mname
Run Code Online (Sandbox Code Playgroud)

编辑:实际上,mname值是按mname = 'AIR'类型进行编码character*255,它是matadd()执行前一行的函数的参数.但这仅用于测试,将来它将从文件中读取.

后来我想打印它:

write(*,*) matname(matidx)
Run Code Online (Sandbox Code Playgroud)

但它似乎打印了所有255个字符,它打印我分配的字符串和大量的垃圾.

  • 这就是我的问题,我怎么知道存储的字符串的长度?
  • 我应该拥有所有长度的另一个阵列吗?
  • 我怎么知道字符串读取的长度?

谢谢.

Tim*_*tei 5

您可以使用此功能获取长度(没有空白尾巴)

integer function strlen(st)
      integer       i
      character     st*(*)
      i = len(st)
      do while (st(i:i) .eq. ' ')
        i = i - 1
      enddo
      strlen = i
      return
      end
Run Code Online (Sandbox Code Playgroud)

来自这里:http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS:当你说:matname(matidx)它得到整个字符串(256)字符...所以这是你的字符串加空格或垃圾


dag*_*rym 4

Timotei 发布的函数将为您提供字符串的长度,只要您感兴趣的字符串部分仅包含空格,如果您在程序中分配值,则该长度应该为 true,因为 FORTRAN 应该初始化变量为空,对于字符来说意味着一个空格。

但是,如果您正在从文件中读入,则可能会在行末尾拾取其他控制字符(特别是回车符和/或换行符,\r 和/或 \n,具体取决于您的操作系统)。您还应该将它们扔到函数中以获得正确的字符串长度。否则,您可能会得到一些有趣的打印语句,因为这些字符也会被打印。

这是我的函数版本,用于检查除空格之外末尾的替代空白字符。

  function strlen(st)
  integer           i,strlen
  character         st*(*)
  i = len(st)
  do while ((st(i:i).eq.' ').or.(st(i:i).eq.'\r').or.
 +  (st(i:i).eq.'\n').or.(st(i:i).eq.'\t'))
    i = i - 1
  enddo
  strlen = i
  return
  end
Run Code Online (Sandbox Code Playgroud)

如果“垃圾”部分中有其他字符,这仍然无法完全工作。

但是,假设它确实适用于您的数据,您可以将写入语句更改为如下所示:

write(*,*) matname(matidx)(1:strlen(matname(matidx)))
Run Code Online (Sandbox Code Playgroud)

它只会打印出实际的字符串。

至于是否应该使用另一个数组来保存字符串的长度,这取决于您。strlen() 函数的复杂度为 O(n),而在表中查找长度的复杂度为 O(1)。如果您发现自己经常计算这些静态字符串的长度,那么在读入它们时计算一次长度、将它们存储在数组中并在需要时查找它们可能会提高性能。但是,如果您没有注意到速度放缓,我就不会担心。