簡體   English   中英

Fortran 77中的字符串數組

[英]Array of Strings in Fortran 77

我有一個關於Fortran 77的問題,但我找不到解決方案。

我正在嘗試存儲一個字符串數組,定義如下:

character matname(255)*255

Wich是255個長度為255的字符串。

后來我從文件中讀取了名稱列表,並按如下方式設置了數組的內容:

matname(matcount) = mname

編輯:實際上mname值被編碼為mname = 'AIR' ,類型為character*255 ,它是一個函數matadd()的參數,它執行前一行。 但這僅用於測試,將來它將從文件中讀取。

后來我想打印它:

write(*,*) matname(matidx)

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

  • 這就是我的問題,我怎么知道存儲的字符串的長度?
  • 我應該擁有所有長度的另一個陣列嗎?
  • 我怎么知道字符串讀取的長度?

謝謝。

您可以使用此功能獲取長度(沒有空白尾巴)

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)字符...所以這是你的字符串加空格或垃圾

只要您感興趣的字符串部分只包含空格,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

如果“垃圾”部分中還有其他字符,則仍然無法完全運行。

但是,假設它確實適用於您的數據,那么您可以將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()函數在修剪后返回字符串的長度。

intel和Compaq Visual Fortran具有內部函數LEN_TRIM(STRING),它返回長度而沒有尾隨空格或空格。

如果要抑制前導空格或空格,請使用“向左調整”即ADJUSTF(STRING)

在這些FORTRAN中,我還注意到一個有用的特性:如果將一個字符串作為參數傳遞給函數或子例程,並在子例程中將其聲明為CHARACTER *(*),則在子例程中使用LEN(STRING)函數重新傳入傳入的實際字符串長度,而不是調用程序中聲明的字符串長度。

示例:CHARACTER * 1000 STRING

        .
        .

  CALL SUBNAM(STRING(1:72)

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM