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

时间:2012-05-25 18:09:09

标签: string function fortran

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

program main
    implicit none

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

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

end program main

此程序输出hello, world!

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

提前致谢!

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

3 个答案:

答案 0 :(得分:14)

哇 - 即使我已经搜索了一个多小时,在发布后立即搜索,我找到了答案here(在“其他Fortran提示和提示”下)。

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

希望这有助于某人!

答案 1 :(得分:9)

这是一个不依赖于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。

答案 2 :(得分:8)

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