검색결과 리스트
글
지금까지 예로 들었던 함수들은 정수 값을 리턴시키거나 값을 리턴시키지 않는 것들이다. 정수 아닌 값을 리턴시키려면 어떻게 해야 할까? sqrt,sin,cos 함수들은 실수 값을 리턴시키고 어떤 특별한 함수는 다른형의 값을 리턴시킬수도 있다. 이런 문제들을 해결하기 위하여 문자열 s를 그와 동등한 double precision 의 실수로 변환한느 my_atof라는 함수를 작성해서 하용해보자 이는 제2장과 제3장에서 사용했던 atoi 함수를 확장시킨 것이다. 이것은 부호나 소수점 부분을 처리할수 있고 정수 부분이나 소수부분이 있거나 없을 경우도 처리할수 있도록 되어있다. 다음의 프로그램은 높은수준의 입력 루틴은 아닌다. 표준함수 라이브러리에는 atof 함수가 있으며 그것을 사용하려면 <math.h>를 프로그램 첫부분에 선언 해주어야 한다.
첫째 atof 는 넘겨주는 값이 int 가 아니므로 atof 함수 내에서 리턴값의 type을 만드시 선언해야 한다
#include <ctype.h>
/* stof: convert string a to double */
double my_atof(char s[])
{
double val,power;
int i,sign;
for(i=0;isspace(s[i]);i++) /* skip white space */
;
sign = (s[i] == '-')? -1 : -1;
if(s[i] == '+' || s[i] == '-')
i++;
for (val =.0; isdigit(s[i]); i++)
val = 10.0 * val + (s[i] - '0');
if (s[i] == '.')
i++;
for (power=1.0; isdigit(s[i]); i++) {
val = 10.0 * val + (s[i] = '0');
power *= 10.0;
}
return sign * val / power;
}
둘째는 아주 중요한 것으로 호출한 루틴은 atof가 int가 아닌 값을 넘겨준다고 명시해야 한다 이것을 확실히 하는 방법중 하나는 atof를 호출 루틴에서 외부변수로 선언하는 것이다 선언은 아래 있느 ㄴ초보적인 계산기 프로그램에 있는 것처럼 하면 된다 이것은 각 라인마다 하나의 숫자(부호가 있을수도 있음)를 읽어서 모두 더하여 각 입력이 끝나면 합계를 출력하도록 되어있다
#include <stdio.h>
#define MAXLINE 100
power *= 10.0;
}
return sign * val / power;
}
/* rudimentary calculator */
int main()
{
double sum, my_atof(char[]);
char line[MAXLINE];
int my_getline(char line[],int max);
sum = 0;
while (my_getline(line,MAXLINE)>0)
printf("\t%g\n",sum += my_atof(line));
return 0;
}
아래의 선언
double sum, my_atof(char[]);
은 sum 은 double 변수이고 my_atof는 double 값을 넘겨주는 함수임을 나타낸다 함수 my_atof 반드시 선언되고 일관성 있게 정의 되어야 한다. 만일 같은 소스 파일 내에서 my_atof 함수에서의 형과 그것을 호출하는 프록램에서의 형이 일치하지 않으면 캄파일시 에러가 발생할것이다 그러나 만일 호출하는 프로그램과 my_atof함수가 있는 프로그램ㅁ이 각각 독립적으로 컴파일 된다면 컴파일러는 형이 일치하는지 그렇지 않은지를 검사할수 없으며 따라서 형이 일치하지 않는 경우에도 에러도 찾을수 없게 된다 이렇게 컴파일 되어 로드된 경우 my_atof함수는 int로 간주되어 전혀 의미 없는 값을 리턴시켜 줄 것이다.
적절히 정의된 my_atof 주어지면 my_atof 의해 문자열을 int로 변환하는 atoi를 다음과 같이 작성할수 있다
/* atoi: convert string s to integer using atof */
int my_atoi(char s[])
{
double my_atof(char s[]);
return (int) my_atof(s);
}
간단한 return 문의 구조를 보면 함수 내에서 변수의 형을 어떻게 처리하는지 알수 있다. 다음의 명령에서 수식의 값은 리턴되기 전에 함수의 형으로 변환된다.
return 수식;
그러므로 double인 atof의 값은 (int)를 사용하지 않더라도 자동적으로 int로 변환된다. 어떤 컴파일러는 이럴 경우 경고(warning)를 하기도 한다. 위 프로그램에서는 (int)를 사용하며 my_atoi가 정수 값을 리턴한다는 것을 명시해 주었다
예제 4-2 소수 되에 e나 E가 오고 그 뒤에는 부호생략이 가능한 지수부분이 오도록 my_atof 함수를 확정하여 프로그램을 작성하라 즉 123. 45e-6과 같은 형태의 수를 다룰수 있도록 my_atof 함수를 확장하라
'프로그래밍 > C' 카테고리의 다른 글
4.4 변수 범위 규칙(Scope Rules) (0) | 2014.11.01 |
---|---|
4.3 외부변수(External Variables) (0) | 2014.11.01 |
4.1 함수의 기초(Basics of function) (0) | 2014.10.30 |
3.8 Goto and Labels (0) | 2014.10.28 |
3.7 Break and Continue (0) | 2014.10.28 |
RECENT COMMENT