7

Fortran 77 について質問がありますが、解決策が見つかりません。

次のように定義された文字列の配列を格納しようとしています。

character matname(255)*255

これは、長さ 255 の 255 個の文字列の配列です。

後でファイルから名前のリストを読み取り、配列の内容を次のように設定します。

matname(matcount) = mname

編集:実際mnameには value はmname = 'AIR'typeのようにハードコードされています。これは、前の行を実行するcharacter*255関数のパラメーターです。matadd()ただし、これはテスト用であり、将来的にはファイルから読み取られます。

後で私はそれを印刷したい:

write(*,*) matname(matidx)

しかし、255文字すべてを出力しているようで、割り当てた文字列と大量のゴミを出力します。

  • それが私の質問です。保存されている文字列の長さを知るにはどうすればよいですか?
  • すべての長さの別の配列が必要ですか?
  • また、読み取った文字列の長さを知るにはどうすればよいですか?

ありがとう。

4

4 に答える 4

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

ここから入手: http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS: あなたが言うとき: matname(matidx) それは全体の文字列 (256) 文字を取得します...それはあなたの文字列に空白またはゴミを加えたものです

于 2009-04-07T12:37:30.097 に答える
4

Timoteiが投稿した関数は、関心のある文字列の部分にスペースのみが含まれている限り、文字列の長さを提供します.FORTRANは変数を初期化することになっているため、プログラムで値を割り当てる場合はtrueにする必要があります.空であり、スペースを意味する文字の場合。

ただし、ファイルから読み込んでいる場合は、行末に他の制御文字が含まれる可能性があります (特に、OS によっては、キャリッジ リターンやライン フィード文字、\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(*,*) matname(matidx)(1:strlen(matname(matidx)))

実際の文字列だけを出力します。

文字列の長さを保持するために別の配列を使用する必要があるかどうかは、あなた次第です。strlen() 関数は O(n) ですが、テーブルの長さを調べるのは O(1) です。これらの静的文字列の長さを頻繁に計算している場合は、読み取り時に一度長さを計算し、それらを配列に格納し、必要に応じてそれらを検索すると、パフォーマンスが向上する場合があります。ただし、減速に気付かない場合は、心配する必要はありません。

于 2009-04-07T16:35:08.620 に答える
1

使用しているコンパイラによっては、組み込み関数を使用しtrim()て文字列から先頭/末尾のスペースを削除し、通常どおりに処理できる場合があります。

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

印刷する必要があります:AIR:

編集:さらに良いことlen_trim()に、文字列がトリミングされた後に文字列の長さを返す関数があるようです。

于 2009-04-07T19:27:41.030 に答える