2009-04-07 4 views
7

Fortran 77에 대한 질문이있어서 해결책을 찾지 못했습니다. 나는 다음과 같이 정의 문자열 배열 저장하기 위해 노력하고있어Fortran 77의 문자열 배열

:

character matname(255)*255 

느릅 나무는 길이 255 문자열의 배열은 255

나중에 내가로부터 이름의 목록을 읽어 파일 및 I는 다음과 같이 어레이의 내용을 설정

matname(matcount) = mname 

EDIT : 사실 mname 값으로된다 harcoded 이 character*255 인 경우 이전 행을 실행하는 함수 matadd()의 매개 변수입니다. 그러나 이것은 테스트 용이며 미래에는 파일에서 읽혀질 것입니다.

는 나중에 내가 그것을 인쇄 할 :

write(*,*) matname(matidx) 

그러나 내가 할당 된 문자열과 쓰레기를 많이 인쇄, 모든 255 개 문자를 인쇄 할 것으로 보인다.

  • 내 질문에, 어떻게 저장되는 문자열의 길이를 알 수 있습니까?
  • 길이가 다른 다른 배열을 사용해야합니까?
  • 그리고 읽은 문자열의 길이를 어떻게 알 수 있습니까?

감사합니다.

+1

일 - 포트란? 너 진심이야? –

+1

@ 이안 - 왜 안 되니? – Rook

답변

4

Timotei가 게시 한 함수는 관심있는 문자열 부분에 공백 만 포함하는 한 문자열의 길이를 제공합니다. if 당신은 프로그램에 값을 할당하고 있습니다. FORTRAN이 변수를 공백으로 초기화하고 공백을 의미하는 문자로 초기화해야하기 때문에 참이어야합니다.

그러나 파일에서 읽는 경우 줄 끝에 다른 제어 문자 (특히 캐리지 리턴 및/또는 줄 바꿈 문자, OS에 따라 \ r 및/또는 \ n)를 사용할 수 있습니다. . 또한 올바른 문자열 길이를 얻기 위해 함수에서 이들을 버려야합니다. 그렇지 않으면 그 문자가 인쇄되기 때문에 재미있는 print 문을 얻을 수 있습니다.

여기 공백 이외의 끝 부분에 대체 공백 문자가 있는지 확인하는 기능의 버전입니다.

"쓰레기"섹션에 다른 문자가 있으면 여전히 완전히 작동하지 않습니다.

write(*,*) matname(matidx)(1:strlen(matname(matidx))) 

을하고 그냥 실제 문자열을 출력합니다

는 데이터를 저장하기위한 작업 않는 가정, 그러나, 당신은 다음과 같이 당신의 쓰기 문을 변경할 수 있습니다.

다른 배열을 사용하여 문자열의 길이를 유지해야하는지 여부는 귀하에게 달려 있습니다. strlen() 함수는 O (n)이고 테이블의 길이를 찾는 것은 O (1)입니다. 이 정적 문자열의 길이를 자주 계산하면 성능을 향상시켜 읽을 때 한 번 길이를 계산하고이를 배열에 저장 한 다음 필요할 때 찾아 볼 수 있습니다. 그러나, 당신이 감속을 알지 못한다면 나는 그것에 대해 걱정하지 않을 것입니다. 당신이 사용하는 컴파일러에 따라

+0

문자열을 매개 변수로받는 함수의 형식 정의를'character mname * (*)'로 수정해야했습니다. 이전에는 변수의 끝이 임의의 쓰레기 였으므로 이제는 공백이 채워집니다. 설명을 주셔서 감사 드리며 매우 명확하게 설명했습니다. 또한 나는 표기법에 대해서 알지 못했다. – Siu

5

당신은 여기에서 (빈 꼬리없이)

integer function strlen(st) 
     integer  i 
     character  st*(*) 
     i = len(st) 
     do while (st(i:i) .eq. ' ') 
     i = i - 1 
     enddo 
     strlen = i 
     return 
     end 

알았어 길이를 얻기 위해이 기능을 사용할 수 있습니다 http://www.ibiblio.org/pub/languages/fortran/ch2-13.html

PS : 당신이 말할 때 : matname (matidx을)가 전체 문자열을 가져옵니다 (256) chars ... 문자열에 빈칸이나 쓰레기를 더한 것입니다.

+0

+1하지만 더 많을 수 있기를 바랍니다. –

+0

감사합니다. 투표를하고 싶지만 아직도 명성이 없습니다. – Siu

1

, 당신은 평소으로 다음 문자열에서 공백을 후행/선행을 제거하기 위해 trim() 내장 함수를 사용하여 처리 할 수 ​​있습니다, 즉

character(len=25) :: my_string 
my_string = 'AIR' 
write (*,*) ':', trim(my_string), ':' 

:AIR:을 인쇄해야합니다.

편집 : 자른 후 문자열의 길이를 반환하는 len_trim() 함수가있는 것 같습니다.

0

intel 및 Compaq Visual Fortran에는 길이 또는 공백없이 길이를 반환하는 내장 함수 LEN_TRIM (STRING)이 있습니다. 당신은 함수 나 서브 루틴에 문자열을 전달하는 경우 :

는 선행 공백 또는 공백을 억제하려면

사용 예 ADJUSTF (STRING)이 포트란에서

나는 또한 유용한 기능을주의 "왼쪽 조정" 인수가 있고 서브 루틴 내부에서 CHARACTER * (*)로 선언 된 경우 서브 루틴의 LEN (STRING) 함수를 사용하여 을 호출하면 호출 프로그램에서 선언 된대로 문자열의 길이가 아닌 전달 된 실제 문자열 길이가 다시 실행됩니다 .

예 : CHARACTER * 1000 STRING

 . 
     . 

    CALL SUBNAM(STRING(1:72) 

    SUBROUTINE SYBNAM(STRING) 
    CHARACTER*(*) STRING 
    LEN(STRING) will be 72, not 1000 
+0

문자열의 구조와 길이를 사용하면 때로는 의미가 있습니다. – Holmz