Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Fortran 77中的字符串数组_String_Fortran_Character_Fortran77 - Fatal编程技术网

String Fortran 77中的字符串数组

String Fortran 77中的字符串数组,string,fortran,character,fortran77,String,Fortran,Character,Fortran77,我有一个关于Fortran 77的问题,我还没有找到解决方案 我试图存储一个字符串数组,定义如下: character matname(255)*255 Wich是长度为255的255个字符串的数组 后来,我从一个文件中读取了名称列表,并将数组的内容设置为: matname(matcount) = mname EDIT:实际上mname值被编码为mname='AIR'类型character*255,它是执行前一行的函数matadd()的参数。但这只是为了测试,将来它将从文件中读取 稍后,我想

我有一个关于Fortran 77的问题,我还没有找到解决方案

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

character matname(255)*255
Wich是长度为255的255个字符串的数组

后来,我从一个文件中读取了名称列表,并将数组的内容设置为:

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

稍后,我想用以下内容打印:

write(*,*) matname(matidx)
但它似乎打印了所有255个字符,打印了我分配的字符串和大量垃圾

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

谢谢。

您可以使用此功能获取长度(无空白尾部)

从这里得到:


PS:当你说:matname(matidx)时,它得到整个字符串(256)个字符。。。这就是你的字符串加上空格或垃圾

函数Timotei post会给出字符串的长度,只要你感兴趣的字符串部分只包含空格,如果在程序中赋值,则应为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
如果“垃圾”部分中还有其他字符,这仍然无法完全工作

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

write(*,*) matname(matidx)(1:strlen(matname(matidx)))
它将只打印出实际的字符串


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

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

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

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

英特尔和康柏Visual Fortran具有内在函数len_trim(string),该函数返回的长度不带尾随空格或空格

如果要抑制前导空格或空格,请使用“调整左”,即调整F(字符串)

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

例如: 字符*1000字符串

        .
        .

  CALL SUBNAM(STRING(1:72)

  SUBROUTINE SYBNAM(STRING)
  CHARACTER*(*) STRING
  LEN(STRING) will be 72, not 1000

+1-Fortran?你是认真的吗?我必须将接收字符串作为参数的函数的类型定义修改为:
character mname*(*)
。以前,该变量的结尾是随机垃圾,现在它填充了空格。谢谢你的解释,非常清楚。我也不知道*符号。谢谢你,我也想投你一票,但我还是没有足够的声誉。对字符串使用结构和长度有时是有意义的。
        .
        .

  CALL SUBNAM(STRING(1:72)

  SUBROUTINE SYBNAM(STRING)
  CHARACTER*(*) STRING
  LEN(STRING) will be 72, not 1000