2012-05-25 3 views
8

문자열을 소문자 (또는 대문자)로 변환하는 (Intel) F90 함수를 작성하는 방법은 무엇입니까? 함수에 문자 배열을 전달하고 문자 배열을 반환하려고합니다.F90에서 to_upper() 또는 to_lower() 함수를 작성하려면 어떻게해야합니까?

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() 서브 루틴부터 시작했지만 기능으로 작성하는 방법을 알 수는 없습니다.

미리 감사드립니다.

추신 - 고정 길이의 문자열로 할 수 있다면 보너스 포인트!

답변

6

이 코드의 원저자로서, 나는 그것이 도움이 된 것을 기쁘게 생각합니다. 필자는 이러한 기능이 Fortran에 내장되어 있지 않은 이유에 대해 궁금해했습니다. 내 생각 엔 그들은 단지 제한된 글자, 즉 영어로 사용되는 글자에 대해서만 작동한다는 것입니다. 거의 모든 다른 유럽 언어의 텍스트를 사용하는 경우 악센트가있는 문자를 사용하고 대문자 또는 소문자로 변환하는 것이 훨씬 어렵습니다. 예를 들어 불어로 된 e-grave는 보통 대문자로 변합니다 (보통 악센트는 없어집니다). 그러나 e-acute에서는 그렇지 않습니다. Fortran의 설계자는 항상 다양한 언어에 맞는 기능을 제공하려고 노력했으며 다중 언어 방식으로 대/소문자 변환을 수행하는 것은 쉽지 않습니다. 적어도 당신이 직접해야하는 이유는 내 추측입니다.

+0

안녕하세요, Clive, SO. 나는 2006 년에 당신의 책에서 Fortran을 배우기 시작했습니다. 고마워요. – milancurcic

+0

나는 당신의 책을 읽지 않았지만 유용한 코드와 통찰력있는 코멘트에 감사드립니다!나는 최근 또 다른 동료에게 일상을 넘겼다. 나는 당신의 이름을 그것에 추가해야 할 것입니다. :-) – jvriesem

13

와우 - 한 시간 이상 검색했지만 즉시 게시 한 후 답변이 here ("기타 포트란 힌트 및 팁"아래)되었습니다.

내가 사용하는 코드는 (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 

희망이 누군가를하는 데 도움이!

+3

이것은 achar과 iachar가 ASCII 테이블을 기반으로합니다. 내 지식은 표준화되어 있지 않습니다 ... (말하자면, 기본적으로 내 코드에서 동일한 것을하고 컴파일러는 놀라지 않았습니다. ASCII 테이블을 사용하지 않음으로써 ...) – mgilson

+5

FORTRAN 90 표준에 따라 : "내장 함수 ACHAR 및 IACHAR은이 문자들 사이의 변환을 제공합니다. 과 ASCII 조합 시퀀스의 정수" [link] (http://www.nag.co.uk/sc22wg5/links.html). ICHAR은 시스템의 기본 문자 집합 (반드시 ASCII는 아님)을 사용합니다. – SimpleSimon

6

다음은 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로 변경할 수 있습니다에 의존하지 않는 하나입니다.

+0

더 휴대하기 쉬운 이유가 보이지 않습니다. ASCII 변환 함수는 표준 Fortran 90이므로 EBCDIC 또는 기타 다른 조합 순서가있는 컴퓨터에서도 작동합니다. 또한 프로그램이 다른 Fortran 90 기능을 사용하기 때문에'achar'을 사용하는 프로그램과 마찬가지로 Fortran 90 컴파일러가 필요합니다. –

+0

충분히 정교합니다. 나는 휴대용 문을 제거 할 것이다. 개인적으로이 방법은 ASCII 표현에 대한 지식에 의존하지 않으므로 ASCII 버전보다 처음에는 쉽게 이해할 수 있다고 생각합니다. 단지 의견 일뿐입니다. – SethMMorton

관련 문제