如何在F90中编写to_upper()或to_lower()函数?

jvr*_*sem 10 string fortran function

如何写一个(英特尔)F90函数将字符串转换为小写(或者,大写)?我想将一个字符数组传递给函数并让它返回一个字符数组,例如

program main
    implicit none

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

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

end program main
Run Code Online (Sandbox Code Playgroud)

这样程序输出hello, world!.

我一直to_lower()RosettaCode中找到的子程序开始,但我无法弄清楚如何将其作为函数编写.

提前致谢!

PS - 如果你能用一串不固定的长度做到这一点,你可以获得奖励积分!

jvr*_*sem 15

哇 - 即使我已经搜索了一个多小时,在发布后立即搜索,我在这里找到了答案(在"Miscellaneous Fortran Hints and Tips"下).

我使用的代码如下(for 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
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!

  • 根据FORTRAN 90标准:"ACHAR和IACHAR的内在函数提供了这些字符与ASCII整理顺序的整数之间的转换." [链接](http://www.nag.co.uk/sc22wg5/links.html).ICHAR将使用系统的本机字符集(不一定是ASCII). (6认同)
  • 这依赖于achar和iachar基于ASCII表,据我所知,这不是标准化的...(话虽如此,我在代码中基本上做同样的事情,我从来没有让编译器让我感到惊讶使用ASCII表...) (3认同)

Set*_*ton 11

这是一个不依赖于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
Run Code Online (Sandbox Code Playgroud)

您可以通过切换循环中的低字符串和字符串来轻松地将其更改为to_lower.

  • 很公平。我将删除便携式声明。我个人认为这种方法乍一看比 ASCII 版本更容易理解,因为它不依赖于 ASCII 表示的知识,但这只是一种意见:) (3认同)

小智 8

作为此代码的原作者,我很高兴它有所帮助.我曾经想知道为什么这些函数没有内置到Fortran中.我的猜测是,它们只能用于一组相当有限的字母,即英文中使用的字母.如果你有几乎任何其他欧洲语言的文字,你将有重音字符,然后将它们转换为大写或小写更难.例如,法语中的电子坟墓变成大写字母通常显示为简单的E(严重的口音丢失),但在e-acute中却没有.Fortran的设计师一直试图提供适合各种语言的设施,并且以多语言方式进行大/小写转换并不容易.至少那是我猜你为什么要自己做的.