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