2016-12-20 1 views
0

나는 숫자 (x)를 입력으로 요구하고 숫자 (y)를 출력으로 얻는 Fortran95/03로 함수를 계산하는 간단한 프로그램을 작성하려고한다. 사용자 입력이 real :: input하고 iostat의 입력은 숫자 나 문자가 있다면 확인하는 나에게 도움이 사용자 입력이 변수에 맞는지 확인하는 방법은 무엇입니까?

read (*,*, iostat=stat) input 
if(stat > 0) then 
    print *, "False input, use numbers!" 

처럼 읽기 호출 보인다.

제 문제는 1000000000000과 같이 매우 큰 숫자를 입력하면 프로그램이 "bufferoverflow"라는 오류 메시지와 충돌합니다. 나는 4 바이트 변수보다 더 큰 실수를 만들 수 있음을 알고 있지만 입력 숫자를 더 크게 만들 수 있기 때문에 문제가 해결되지 않습니다.

주요 질문은 사용자 입력으로 인해 프로그램이 충돌하는 것을 방지 할 수 있습니까?

+0

'iostat ='이 주어 졌을 때도 프로그램이 종료된다고 말하는가? 다음에 나오는 질문이이 질문에 대한 답이 아니지만, 어쩌면 '15000000000000000000000 ... 0'이 아닌 '1.5e903'형식으로 입력 할 수는 없습니까? – francescalus

답변

1

사용자의 입력 값을 확인하는 것은 저자 이외의 다른 사람과 상호 작용하는 모든 종류의 소프트웨어에서 사용해야하는 매우 기본적인 기술입니다. 모든 프로그래밍 언어에서 사용됩니다.

당신은 너무 작은도 될 수있는 가치를 잊지 마세요 간단한 조건

if (input > input_max) then 
    print *, "Input value too large, try again" 
    cycle ! or return stop or set some flag or whatever 
end if 

을 사용할 수 있습니다!

어디에서 충돌이 발생했는지 이해하는 것이 중요합니다. 큰 숫자를 입력하는 것에서부터 오는 것이 아니라, 너무 큰 배열을 할당하거나 부동 소수점 예외를 유발하는 계산을하는 등 나쁜 방식으로 숫자를 사용하는 것에서 비롯된 것이 분명합니다.

1

입력을 문자열로 읽은 다음 문자열 입력의 유효성을 검사 한 다음 내부 읽기를 사용하여 유효성이 검사 된 문자열을 REAL로 변환하십시오.

입력 및 출력에 프로세서 의존 동작의 많은 측면이 있습니다. 견고성을 원할 경우 일반적으로 다리 작업을 직접 수행해야합니다. 예를 들어 실수에 대한 잘못된 입력이 제공된 경우 프로세서가 오류 조건으로 식별하고 0이 아닌 IOSTAT 코드를 반환 할 필요가 없습니다.

목록 지향 입력은 사용자와 사용자를 이동할 수있는 수많은 놀라운 기능이 있으므로 추가 과제를 제공합니다.

관련 문제