13

如何编写将字符串转换为小写(或大写)的(英特尔)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

哇——尽管我搜索了一个多小时,但在发布此内容后,我立即在此处找到了答案(在“Miscellaneous Fortran Hints and Tips”下)。

我使用的代码如下(对于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

您可以通过在循环中切换 low 和 cap 字符串轻松地将其更改为 to_lower。

于 2012-05-29T22:49:28.697 回答
10

作为这段代码的原作者,我很高兴它有一些帮助。我曾经想知道为什么这些函数没有内置到 Fortran 中。我的猜测是它们只适用于一组相当有限的字母,即英语中使用的字母。如果您有几乎任何其他欧洲语言的文本,您将有带有重音符号的字符,然后将它们转换为大写或小写要困难得多。例如,将法语中的 e-grave 转换为大写通常仅显示为纯 E(重音丢失),但在 e-acute 中则不会。Fortran 的设计者一直试图提供适合多种语言的工具,而以多语言的方式进行大小写转换并非易事。至少这是我的猜测,为什么你必须自己做。

于 2012-06-19T21:48:44.057 回答