13

文字列を小文字 (または大文字) に変換する (Intel) F90 関数をどのように記述しますか? 文字配列を関数に渡し、文字配列を返すようにしたい、例えば

program main
    implicit none

    character*32 :: origStr = "Hello, World!"
    character*32 :: newStr

    newStr = to_lower(origStr)
    write (*,*) newStr

end program main

このプログラムが出力するようにhello, world!

RosettaCodeto_lower()にあるサブルーチンから始めましたが、関数として記述する方法がわかりません。

前もって感謝します!

PS -- 長さが固定されていない紐でできればボーナスポイント!

4

3 に答える 3

18

うわー-私は1時間以上検索しましたが、これを投稿した直後に、ここで答えを見つけました(「その他のFortranのヒント」の下)。

私が使用したコードは次のとおりです(to_upperの場合)。

function to_upper(strIn) result(strOut)
! Adapted from http://www.star.le.ac.uk/~cgp/fortran.html (25 May 2012)
! Original author: Clive Page

     implicit none

     character(len=*), intent(in) :: strIn
     character(len=len(strIn)) :: strOut
     integer :: i,j

     do i = 1, len(strIn)
          j = iachar(strIn(i:i))
          if (j>= iachar("a") .and. j<=iachar("z") ) then
               strOut(i:i) = achar(iachar(strIn(i:i))-32)
          else
               strOut(i:i) = strIn(i:i)
          end if
     end do

end function to_upper

これが誰かに役立つことを願っています!

于 2012-05-25T18:26:51.467 に答える
13

これはASCII表現に依存しないものです

Pure Function to_upper (str) Result (string)

!   ==============================
!   Changes a string to upper case
!   ==============================

    Implicit None
    Character(*), Intent(In) :: str
    Character(LEN(str))      :: string

    Integer :: ic, i

    Character(26), Parameter :: cap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    Character(26), Parameter :: low = 'abcdefghijklmnopqrstuvwxyz'

!   Capitalize each letter if it is lowecase
    string = str
    do i = 1, LEN_TRIM(str)
        ic = INDEX(low, str(i:i))
        if (ic > 0) string(i:i) = cap(ic:ic)
    end do

End Function to_upper

ループ内でローストリングとキャップストリングを切り替えることで、これを to_lower に簡単に変更できます。

于 2012-05-29T22:49:28.697 に答える
10

このコードの最初の作成者として、このコードがお役に立てば幸いです。なぜこれらの関数が Fortran に組み込まれていないのか疑問に思っていました。私の推測では、それらはかなり制限された文字のセット、つまり英語で使用されるものに対してのみ機能するということです。他のほとんどすべてのヨーロッパ言語のテキストがある場合、アクセント付きの文字があり、それらを大文字または小文字に変換するのははるかに困難です。たとえば、大文字に変換されたフランス語の e-grave は通常、単なる E として表示されますが (グレーブ アクセントが失われます)、e-acute ではそうではありません。Fortran の設計者は常に、幅広い言語に適合する機能を提供しようとしてきましたが、複数言語で大文字/小文字の変換を行うことはまったく簡単ではありません。少なくとも、なぜ自分でやらなければならないのかについての私の推測です。

于 2012-06-19T21:48:44.057 に答える