如何写一个(英特尔)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 - 如果你能用一串不固定的长度做到这一点,你可以获得奖励积分!
答案 0 :(得分:14)
我使用的代码如下(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的设计师一直试图提供适合各种语言的设施,并且以多语言方式进行大/小写转换并不容易。至少那是我猜你为什么要自己做的。