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

String 如何在F90中编写to_upper()或to_lower()函数?,string,function,fortran,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 这样这个程序输出你好,世

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

program main
    implicit none

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

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

end program main
这样这个程序输出
你好,世界

我一直从位于的
to_lower()
子例程开始,但我不知道如何将其作为函数编写

提前谢谢

PS——如果你能用一个长度不固定的字符串来做这件事,就可以获得额外的积分

哇——尽管我搜索了一个多小时,但在发布这篇文章后,我立即找到了答案(在“杂项Fortran提示和提示”下)

我使用的代码如下(对于to_upper):

函数到上(strIn)结果(strOut)
! 改编自http://www.star.le.ac.uk/~cgp/fortran.html(2012年5月25日)
! 原作者:克莱夫·佩奇
隐式无
字符(len=*),意图(in)::strIn
字符(len=len(strIn))::strOut
整数::i,j
i=1,len(strIn)
j=iachar(strIn(i:i))

如果(j>=iachar(“a”)和.j,那么这里有一个不依赖于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字符串,您可以轻松地将其更改为_lower。

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

这依赖于achar和iachar基于ASCII表,w据我所知,这不是标准化的…(也就是说,我在代码中做的基本上是相同的事情,我从来没有一个编译器不使用ASCII表而让我吃惊…)根据FORTRAN 90标准:“内部函数ACHAR和IACHAR提供这些字符与ASCII排序序列的整数之间的转换。”。ICHAR将使用系统的本机字符集(不一定是ASCII)。我看不出为什么它应该更具可移植性。ASCII转换函数是标准的Fortran 90,因此也适用于具有不同排序顺序的计算机,无论是EBCDIC还是其他类型的计算机。而且由于您的程序也使用Fortran 90的其他功能,因此它需要Fortran 90编译器,与使用
ach的程序一样ar
确实..很公平。我将删除可移植语句。我个人认为这种方法乍一看比ASCII版本更容易理解,因为它不依赖ASCII表示的知识,但这只是一种观点:)嗨,克莱夫,欢迎来到SO。2006年我第一次从你的书中开始学习Fortran。我只是想说声谢谢。我还没有读过你的书,但感谢你的有用代码和有见地的评论!我最近将这个例程传递给了另一位同事。我将不得不在其中添加你的名字。:-)
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