String 如何在F90中编写to_upper()或to_lower()函数?
如何编写将字符串转换为小写(或大写)的(英特尔)F90函数?我想把一个字符数组传递给函数,让它返回一个字符数组,例如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 这样这个程序输出你好,世
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