【问题标题】:Array of Strings in Fortran 77Fortran 77 中的字符串数组
【发布时间】:2010-10-18 01:11:19
【问题描述】:

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

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

character matname(255)*255

Wich 是一个由 255 个长度为 255 的字符串组成的数组。

稍后我从文件中读取名称列表,然后将数组的内容设置如下:

matname(matcount) = mname

编辑: 实际上mname 值被硬编码为mname = 'AIR' 类型character*255,它是函数matadd() 的参数,它执行上一行。但这只是为了测试,以后会从文件中读取。

稍后我想打印它:

write(*,*) matname(matidx)

但它似乎打印了所有 255 个字符,它打印了我分配的字符串和很多垃圾。

  • 这就是我的问题,我如何知道存储的字符串的长度?
  • 我应该有另一个具有所有长度的数组吗?
  • 我怎么知道读取的字符串的长度?

谢谢。

【问题讨论】:

  • +1 - Fortran?你是认真的吗?

标签: string fortran character fortran77


【解决方案1】:

你可以使用这个函数来获取长度(没有空尾)

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

从这里获取:http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS:当您说:matname(matidx) 时,它会获取整个字符串(256)个字符...所以这是您的字符串加上空格或垃圾

【讨论】:

  • 也谢谢你,我想投票给你,但我仍然没有足够的声誉。
【解决方案2】:

发布的函数 Timotei 将为您提供字符串的长度,只要您感兴趣的字符串部分仅包含空格,如果您在程序中分配值应该为真,因为 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

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

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

write(*,*) matname(matidx)(1:strlen(matname(matidx)))

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

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

【讨论】:

  • 我不得不将接收字符串作为参数的函数的类型定义修改为:character mname*(*)。以前,该变量的末尾是随机垃圾,现在用空格填充。感谢您的解释,非常清楚。我也不知道 * 符号。
【解决方案3】:

根据您使用的编译器,您可以使用 trim() 内部函数从字符串中删除任何前导/尾随空格,然后像往常一样处理它,即

character(len=25) :: my_string
my_string = 'AIR'
write (*,*) ':', trim(my_string), ':'

应该打印:AIR:

编辑: 更好的是,看起来有一个 len_trim() 函数可以返回修剪后的字符串长度。

【讨论】:

    【解决方案4】:

    intel 和 Compaq Visual Fortran 具有内部函数 LEN_TRIM(STRING),它返回不带尾随空格或空格的长度。

    如果您想抑制前导空格或空格,请使用“向左调整”,即 ADJUSTF(STRING)

    在这些 FORTRAN 中,我还注意到一个有用的特性:如果将字符串作为参数传递给函数或子例程,并且在子例程中它被声明为 CHARACTER*(*),那么 在子例程中使用 LEN(STRING) 函数会返回传入的实际字符串长度,而不是调用程序中声明的字符串长度。

    示例: CHARACTER*1000 字符串

            .
            .
    
      CALL SUBNAM(STRING(1:72)
    
      SUBROUTINE SYBNAM(STRING)
      CHARACTER*(*) STRING
      LEN(STRING) will be 72, not 1000
    

    【讨论】:

    • 对字符串使用结构及其长度有时是有意义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2015-08-08
    • 2015-01-11
    • 1970-01-01
    • 2014-05-30
    • 2016-12-15
    • 1970-01-01
    相关资源
    最近更新 更多