일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- LineTracer
- Deque
- 아두이노 컴파일러
- 수광 소자
- set
- WinAPI
- map
- stl
- 라인트레이서
- Array
- Stack
- list
- arduino compiler
- 컴퓨터 그래픽스
- C언어
- c++
- Algorithm
- directx
- 통계학
- 시스템프로그래밍
- 아두이노
- Arduino
- queue
- priority_queue
- Visual Micro
- html
- vector
- 자료구조
- 아두이노 소스
- 운영체제
- Today
- Total
Kim's Programming
C언어 - 표준 함수 본문
수학 함수
C컴파일러는 많은 수의 표준 함수들을 제공합니다. 공통적으로 자주 사용되는 기능들을 모든 개발자들이 직접 만들어 쓰게 된다면 시간도 많이 걸리고 사회적인 낭비도 심해 질 것입니다. 물론 직접 만들어서 문제없이 쓸 수는 없지만 직접 만든것은 아무 래도 미리 만든거 보다 안정성 또는 속도도 떨어질 것이고 미리 만든 것보다는 안전성도 떨어질 것입니다. 그래서 컴파일러 제작사들은 자주 사용되는 공통적인 함수들을 미리 만들어서 컴파일러와 함꼐 배포하는데 이를 표준함수라고 하며 표준함수들의 집합을 런타임 라이브러리(CRT)라고 부릅니다. 컴파일러 제작사의 우수한 프로그래머들이 공들여 작성한 것이므로 성능이 뛰어남은 물론이고 오랫동안 다양한 프로젝트에서 테스트되었기 때문에 신뢰도 높습니다. 그래서 우리는 원하는 기능을 제공하는 표준 함수를 골라 호출하기만 하면 사용 할 수 있습니다. 초창기의 C언어에서 함수들이 통일되지 않는 혼돈이 되기 시작하여 깔끔하게 정리하기 정리하게된 표준이 바로 89년에 제정된 ANSI C 표준이며 이 시점에서 그동안 무분별하게 추가되고 혼란을 주던 함수들이 통폐합 되어 현재까지 왔습니다. 표준함수들은 다음과 같이 불류가 가능합니다.
분류 |
함수 |
입출력 함수 |
printf(), scanf(), gets(), puts(), getch(), putch() |
수학 함수 |
sin(), cos(), tan(), cow(), floor(), ceil(), hypot() |
문자열 함수 |
strcpy(), strlen(), strcat(), strstr(), strchr() |
시간 함수 |
time(), asctime(), clock() |
파일 입출력 함수 |
fopen(), fclose(), fseek(), fread(), fwrite() |
프로그램 제어 |
exit(), abort(), system() |
메모리 할당 |
malloc(), free(), realloc(), calloc() |
기타 |
rand(), delay() |
printf(), scnaf()같은 기본적인 입출력 함수들은 계속 쓰는 함수이고 사용법도 잘 알고들 있습니다. 단순하게 어떻게 사용하는지만 소개하겠습니다.
삼각 함수
수학함수는 수학적인 계산을 하는 함수입니다. 수학함수의 원형들은 모두 math 헤더에 속해있습니다. 그러므로 수학함수를 사용하기 위해서는 #include<math.h>를 이용하여 math헤더를 인클루드 시켜 주어야합니다. 다음 함수들은 실수형 인수를 받아들여서 삼각함수 값을 계싼하여 실수값으로 리턴하는 함수입니다.
1
2
3
4
5
6
7
8
9 |
double sin(double X);
double cos(double X);
double tan(double X);
double asin(double X);
double acos(double X);
double atan(double X);
double sinh(double X);
double cosh(double X);
double tanh(double X); |
cs |
호도 = 각도*3.1416/180 정도로 계산하면 문제 없이 할 수있습니다. (위의 함수들에 넣을때는 호도값을 넣어야 계산이 됩니다 .^^) 삼각함수는 기존 수학적인 이름과 같은 이름을 사용하므로 double형이고 호도법인것만 기억하면 어렵지 않게 쓸 수 있습니다.
지수 함수
지수함수는 거듭승이나 제곱근, 로그 따위의 값을 구하는 함수들입니다. 실수 차원에서 계싼을 하므로 취하는 인수나 리턴값은 모두 정밀도가 높은 double형을 사용합니다. 지수함수에는 다음과 같은 것들이 있습니다.
지수 함수 |
의미 |
double sqrt(double X); |
x^2 , x의 제곱승 |
double pow(double x, double y); |
x^y, x의 y승 |
double log(double X); |
자연 대수 |
double log10(double X); |
상용 대수 |
double exp(double X); |
자연 대수 exponential |
double hypot(double x, double y) |
직각 삼각형의 사변(높이가 x, 밑변이 y일때 피타고라스 정리) |
sqrt 함수는 제곱근, 즉 두번 곱해서 그 값이 되는 수를 구하는 함수입니다. sqrt(4)의 값은 2.0이 될 것이고 sqrt(2)는 대략적인 값인 1.414214를 리턴 할 것입니다.
정수와 함수
정수화 함수는 실수형 데이터에서 정수부만을 취하는 함수입니다.(소수점 부분을 잘라버리는) 소수부를 잘라 버린다고 해서 계산 결과가 정수가 되지는 않고 리턴 값은 여전히 실수 입니다. 실수 값의 소수부만을 0으로 만든다고 생각하면 더 좋습니다. 정수화 함수에는 다음 2가지가 있습니다.
1
2 |
double floor(double X)
double ceil(double X) |
cs |
두 함수는 소수점 이하를 자르는 방식이 다른데 floor은 소수점 이하는 버리고 정수부만 취하는 함수이고 ceil은 소수점 이하를 올림해서 정수부를 1증가 시킵니다. 다음 예시 소스와 결과를 통해서 알아보겠습니다.
1
2
3
4
5
6
7
8
9 |
#include<cstdio>
#include<cmath>
void main()
{
double X = 3.14;
printf(" floor 결과 = %f\n", floor(X));
printf(" ceil 결과 = %f\n", ceil(X));
} |
cs |
다음 소스의 결과는 다음과 같이 나옵니다.
음수와 양수를 다 해봤을때 두 함수의 정의를 다음과 같이 나타낼 수 있습니다.
- floor : 주어진 인수보다 크지 않은 최대 정수
- ceil : 주어진 인수보다 작지 않은 최소 정수
절대값 함수
절대값 함수는 인수의 부호를 강제로 양수로 바꾸는 함수입니다. 5라는 숫자는 그대로 5로 두고 -5라는 수는 5로 바꾸는 역할을 합니다. 인수의 타입에 따라서 3가지 함수가 정해져 있습니다. 이외에 복소수 타입에 대한 절대값 함수도 있지만 생략하겠습니다.
1
2
3 |
int abs(int n);
long labs(long n);
double fabs (double n); |
cs |
위에서 부터 순서대로 정수형, long형, 실수형에 대한 절대값을 구하는 함수입니다. 16비트환경에서나 int형과 long형의 길이가 다르기 떄문에 다른 함수였으나 32비트에서는 int와 long이 같기 떄문에 abs함수나 labs함수나 같은 역할을 하게됩니다. 예제를 통해서 살짝 알아보겠습니다.
1
2
3
4
5
6
7
8
9
10 |
#include<cstdio>
#include<cmath>
void main()
{
int i = 3;
int j = -5;
printf("i %d의 절대값 = %d\n", i, abs(i));
printf("j %d의 절대값 = %d\n", j, abs(j));
} |
cs |
다음 함수를 이용하여 절대 값을 구성하게 되면 다음과 같이 결과가 출력되게 됩니다.
난수 함수
이번에는 일반적인 함수들과 조금 다른 특이한 난수 함수에 대해서 알아보겠습니다. 난수(Random Number)란 무작위로 만들어지는 알 수 없는 값입니다. 마치 주사위를 던졌을 때 어떤 수가 나올지 미리 알 수 없는 것처럼 말입니다. 어떤 값을 가지게 될 지 예측할 수 없는 수라는 뜻인데 이런 난수가 필요한 이유는 말 그대로 예측을 허용하지 않기 위해서 입니다. 난수를 만들어 사용할 떄는 random이라는 함수는 사용하며 난수 루틴을 초기화할 때는 randomize라는 함수를 사용합니다. 그러나 이 함수들은 진짜 함수들은 진짜 함수가 아니라 매크로로 정의되어 있는 가짜 함수들입니다. 가짜 함수만 쓸수 있어도 난수를 만드는데는 큰 불편함은 없지만 내부를 좀 더 정확하게 이해하기 위해 이 매크로 함수들을 분석해 보겠습니다. 난수를 실제로 만드는 함수는 2가지 입니다.
1
2 |
int rand(void);
void srand(unsigned int seed); |
cs |
rand 함수는 0~RAND_MAX 범위의 수 중에서 무작위로 한 수를 생성해냅니다. RAND_MAX는 컴파일러에 따라 다르지만 일반적으로 72767(0x7ffff)로 정의되어 있습니다. 그래서 rand함수를 호출하면 0부터 32767 중의 임의의 정수가 리턴이 됩니다. 예시를 통해 확인해보겠습니다. 난수함수는 stdlib.h에서 끌어다 쓸 수 있습니다.
1
2
3
4
5
6
7
8
9 |
#include<cstdio>
#include<stdlib.h>
void main()
{
for (int i = 0; i < 10; i++)
{
printf("%d\n", rand());
}
} |
cs |
다음과 같이 하여 난수 10개를 출력하게 만들었습니다. 이 소스는 다음과 같은 출력을 하게됩니다.
결과에서 확인 할 수 있듯이 규칙이 없는 10개의 난수를 막 생성했습니다. 하지만 이런 rand함수를 통해서 무작위 난수가 무작위로 나오기는 하지만 컴파일을 계속 하다보면 알게되지만 난수들이 계속 똑같습니다. rand 함수는 일정한 규칙에 따라 난수를 생성하는데 규칙이 항상 같기 떄문에 난수가 생성되는 순서도 항상 같을 수 밖에 없습니다. 이래서는 제대로 된 난수라고 할 수가 없습니다. 그렇기때문에 난수 생성 루틴의 규칙에 변화를 줄 srand라는 함수를 사용해야 합니다. srand라는 함수는 난수 발생기에 난수를 발생시키는 시작점(seed)을 제공하며 난수 발생기는 이 시작점을 기준으로 하여 난수를 발생시킵니다. 그렇기 때문에 시작점을 바꾸게 되면 생성되는 난수도 달라지게 됩니다. 하지만 이렇게 생성해도 시작점 생성 규칙이 생기게 되면 난수도 그 규칙에 따라서 만들어질 것이고 이는 또 완벽한 난수가 되지 않을 겁니다. 그렇다면 완벽한 난수는 어떻게 만들 수 있을까요? 그것은 바로 시간을 이용하여 작성하는 것입니다. 난수 발생기가 실행 될 시점의 시간을 알 수가 없기 때문에 시간값을 시작점으로 사용하면 완벽한 난수를 생성하는 것이 가능할 것입니다. 다음의 함수를 사용하면 사용가능합니다.
1 |
srand((unsigned)time(NULL)); |
cs |
위의 함수를 int i 뒤에 붙여주게 되면 매번 컴파일 할때마다 다른 난수가 발생하게 됩니다. 이제 완벽한 난수가 발생하므로 rand 함수를 조금더 잘 쓸 수 있게 바꿔줄 차례입니다. rand()함수는 0~32767사이의 임의 정수값 하나를 구하게 되는데 난수는 일정 범위에 속해서 나올 때 사용하는 의미가 생깁니다. 예를들어 카드패라면 0~12사이의 수가 나와야 할 것이고 주사위라면 0~5사이의 수가 나와야 난수로써 인정이 됩니다. rand()함수가 리턴하는 난수를 일정한 범위로 제한하고 싶을때는 %연산자를 이용하면 됩니다.
1
2 |
rand()%13; // 0~12사이의 난수
rand()%6 ; // 0~5사이의 난수 |
cs |
어떤 수를 임의의 수를 a로 나눈 나머지는 항상 a보다 작다. 라는 나머지 연산자를 이용한 훌륭한 방법입니다. srand함수를 이용하면 난수 발생기를 초기화 할 수 있고 rand함수와 나머지연산자를 사용하면 원하는 범위의 난수를 생성할 수 있습니다.
rand 함수는 다양한 유형의 난수를 만들 수 있습니다.
-
0~n사이의 난수는 rand()%n으로 생성합니다. 이때 생성되는 난수의 범위에 인수 그 자체는 포함하지 않습니다. 난수중에 제일 큰 수는 n-1입니다.
12rand()%10; // 0~9사이의 난수rand()%100 ; // 0~99사이의 난수cs -
rand()함수가 만드는 난수의 최소값은 항상 0으로 고정되어 있습니다. 난수의 범위의 끝 값은 인수 n으로 조정하며 범위값의 시작값은 rand()함수호출 결과에 상수를 더해 조정합니다.
-
난수 사이의 간격은 난수를 곱한 후 곱을 사용하면 됩니다. 이때 범위를 지정하는 인수는 곱해주는 수를 미리 나누어 구해야합니다. 만약 0~100사이의 짝수 중 하나는 구하게 된다면 다음과 같이 작성하면 가능합니다.
1rand%(100/2)*2cs 위에서 rand 함수는 0~49까지의 수를 출력하게 되고 그다음 2를 곱하게 되는 구조가 되며 약수로 2를 가지게 된 값들이 출력되기 떄문에 모두 짝수로 출력 될 수 밖에 없습니다. 만약 홀수를 구하고 싶으면 +1만 해주면 홀수가 되게 됩니다. 참 쉽죠?
-
실수 난수가 필요하면 충분한 크기의 정수 난수를 생성한다음 필요한 유효자리수만큼 10의 거듭승으로 나누면됩니다. 예를 들어 다음과 같이 작성한 함수를 이용하면 0.0~9.9사이의 난수를 생성이 가능합니다.
1rand()%100/10.0;cs 실수를 생성하기위해 정수를 실수로 나누어 진것입니다. 소수점 2자리 까지 하려면 0~1000까지 난수를 만들고 100.0으로 만들면 됩니다.
시간 함수
컴퓨터 안에는 시계가 내장되어 있기 떄문에 항상 정확하 시간을 유지하고 있는데 프로그램에서 시간을 필요로 할 경우 시간 함수로 이 값을 조사할 수가 있습니다. 또한 조사한 시간을 목적에 맞게 조정하거나 변환 및 포맷팅도 할 수 있습니다. 모든 시간 함수의 원형은 time.h에 선언 되어 있으므로 신간관련 함수를 상용하려면 반드시 time.h를 인클루드 하여햐 합니다. 시간과 관련된 가장 기본적인 함수는 현재 시간을 구하는 time 함수입니다.
1
2 |
time_t time(time_t *timer);
char *ctime( const time_t *timer); |
cs |
time함수는 1970년 1월 1일 자정 이후 경과한 초들을 조사하는데 리턴 타입인 time_t형은 시스템에 따라서 달라지게 되며 윈도우즈에서는 4바이트 정수(typedef long time_t;)로 정의 되어 있습니다. time 함수는 time_t형 포인터를 인수로 받아 이 인수에 조사된 시간을 채워 주기도 하고 같은 값을 리턴하기도 합니다. 둘 중 아무 값이나 사용해도 상관은 없으며 리턴값만 사용할 경우는 인수로 NULL을 전달할 수도 있습니다. 다음 나오는 2개의 코드는 동일합니다.
time_t now time_t now
now=time(NULL); time(&now)
이함수는 최대 2038년 1월 18일 까지 표현이 가능하고 64비트 버전인 _time64 함수는 3000년 12월 31일 까지 표현이 가능합니다. 이 함수가 조사하는 시간은 초단위이기 때문에 이 값으로부터 우리가 일상적으로 사용하는 시간을 바로 구하기는 무척 어렵습니다. 또한 세계 표준시인 UTC 포맷으로 되어 있어서 우리나라 시간과 일치 하지도 않습니다. 다음 소스를 통해서 현재시각을 출력하겠습니다.
1
2
3
4
5
6
7
8
9
10
11 |
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<time.h>
void main()
{
time_t t;
time(&t);
printf("현재 시간은 %s 입니다.\n", ctime(&t));
} |
cs |
실행결과는 다음과 같이 나오게됩니다.
초단위로 된 시간을 문자열인 형태로 변환하므로 읽기는 편하지만 영문으로 출력되는데다 개행 코드가 작성되있어서 다른 문자열 중간에 삽입하려면 개행 코드를 지운 후 사용해야하는 번거러움 까지 있습니다. 다음 두함수는 날짜와 시간을 문자열 형태로 바로 구하는 좀 더 간단한 함수입니다.
1
2 |
char *_strdate(char *datestr);
char *_strtime(char *timestr); |
cs |
_strdate는 날짜를 MM/DD/YY포맷으로 구해 datestr 버퍼에 복사하며 _strtime은 시간을 HH:MM:SS 포맷으로 구해 timestr 버퍼에 복사하는데 이 함수가 구해주는 시간은 24시간제입니다. 두 함수로 전달되는 버퍼는 NULL문자까지 고려하여 최소한 9바이트 이상 이어야 합니다. 다음 소스는 함수로 날짜와 시간을 구해 출력하는 소스입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13 |
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<time.h>
void main()
{
char Date[10];
char Time[10];
_strdate(Date);
_strtime(Time);
printf("Date : %s, Time : %s\n", Date, Time);
} |
cs |
실행결과는 다음과 같습니다.
문자열 버퍼에 원하는 정보를 바로 조사해서 채워 주므로 출력하기는 편하지만 날짜 포맷의 년도가 제일 뒤쪽에 있는 형식이라 우리나라의 날짜 표기법과는 조금 다릅니다.
시간 구조체
time 함수를 사용하면 현재 시간을 쉽게 구할 수 있고 ctime을 사용하면 이 시간을 문자열로도 바꿀수 있지만 포맷팅을 자유롭게 할 수 없어서 불편함을 느끼게 됩니다. 사간 포맷을 자유롭게 변경하고 싶다면 결과초 형태로 되어 있는 값에서 시간 요소를 분리해야 합니다. 다음 함수들은 time_t형 값을 tm구조체로 변환합니다.
1
2
3 |
struct tm *gmtime(const time_t *timer);
struct tm *localtime(const time_t *timer);
time_t mktime(struct tm *timeptr); |
cs |
gmtime, localtime함수는 달 다 time_t형의 값을 tm 구조체로 변환하는데 gmtime은 세계 표준시로 변환하며 localtime은 지역시간으로 변환합니다. 세계 표준시는 잘 사용되지 않으므로localtime함수가 더 많이 사용됩니다. 이 두 함수도 라이브러리에 정적으로 할당되어 있는 tm 구조체를 사용하므로 한 함수가 구해 놓은 정보는 다른 함수를 호출하면 파괴됩니다. mktime 함수는 반대의 변환을 하는데 tm구조체를 time_t형으로 바꿉니다. tm구조체는 time.h 파일에 다음과 같이 선언 되어 있습니다.
1
2
3
4
5
6
7
8
9
10
11 |
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
}; |
cs |
날짜와 시간을 구성하는 여러 가지 멤버들이 포함되어 있으며 주석도 비교적 상세하게 작성이 되어있습니다. 외울 필요가 없지만 멤버마다 베이스가 제각각 이기 때문에 주의해서 써야합니다.
멤버 |
설명 |
tm_sec |
초(0~59) |
tm_min |
분(0~59) |
tm_hour |
시간(0~23) |
tm_mday |
날짜(1~31) |
tm_mon |
월(0~11) |
tm_year |
1900년 이후 결과 년수 |
tm_wday |
요일(0~6) |
tm_yday |
년중 날짜(0~365) |
tm_isdst |
일광 절약 시간과의 차 |
다음으로 나오는 소스는 tm 구초체로 바꾸고 이 구조체의 멤버를 포맷팅하여 출력합니다. 이 예제에 사용되는 -> 연산자는 구조체 포인터로 부터 멤버를 읽는 연산자 이며 뒤에서 계속 알아보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<time.h>
void main()
{
time_t t;
tm *pt;
time(&t);
pt = localtime(&t);
printf("현재시간은 %d년 %d월 %d일 %d시 %d분 %d초입니다.",
pt->tm_year+1900, pt->tm_mon+1, pt->tm_mday, pt->tm_hour,
pt->tm_min,pt->tm_sec);;
} |
cs |
시간과 날짜를 구성하는 각 요소가 멤버로 분리되어 있으므로 원하는 바대로 포맷팅해서 출력 할 수 있습니다. 결과는 다음과 같습니다.
시간 요소 사이에 한글을 넣을 수도 있고 시간 요소의 출력 순서를 마음대로 조정할 수 있어서 훨씬 더 자유롭고 깔끔한 출력을 할 수 있습니다. asctime함수는 tm 구조체를 문자열로 바꾸는데 cstime함수와 마찬가지로 출력 결과가 영어로 되어 있어서 한글 환경에서는 실용성없고 개행 문자도 포함되어 있습니다.
1
2 |
char *asctime(const struct tm *timeptr);
size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr); |
cs |
strftime함수는 시간을 다양한 방식으로 포맷팅하는데 첫 번쨰 인수를 버퍼, 두 번째 인수로 버퍼의 길이, 세 번째 인수로 포맷팅 방식, 네 번째 인수로 tm 구조체를 줍니다. 세번째 인수에 포맷팅 서식을 어떻게 지정하는가에 따라서 다양한 형식의 문자열로 바꿀 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13 |
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<time.h>
void main()
{
time_t t;
char Format[128];
time(&t);
strftime(Format, 128, "%Y %B %d %A %I:%M:%S %p", localtime(&t));
puts(Format);
} |
cs |
실행결과는 다음과 같이 나오게 됩니다. 출력된 결과를 보면 각 서식의 의미를 알수 있는데 %Y는 년도 %B는 달의 영문 이름 %d는 날짜입니다.
레퍼런스에서 이 함수를 찾아보면 %로 시작하는 여러가지 복잡한 소식을 볼 수 있는데 년도를 두자리 또는 네자리 출력이나 월의 이름을 길게 또는 짧게 출력할 수 있으며 24시간/12시간으로 나눠서 표기도 가능하지만 영문으로 출력되어 우리나라에는 맞지는 않습니다.
기타 시간 함수
시간은 여러모로 쓸데가 많은 정보입니다. 다음 함수는 실행을 한후의 경과된 시간(Process Time)을 조사합니다.
1 |
clock_t Clock(void); |
cs |
clock_t타입은 long형으로 정의가 되어 있으며 이 함수가 조사한 값을CLOCKS_PER_SEC 으로 나누면 프로그램 실행 후의 경과 초를 알 수 있습니다. 이 값은 시스템에 따라 다른데 윈도우즈에서는 1000으로 정의 되어 있습니다.
1
2 |
typedef long clock_t;
#define CLOCKS_PER_SEC 1000 |
cs |
실행 후의 경과 시간 자체는 별로 쓸 데가 없지만 두 작업 시점간의 시간을 계싼하거나 일정한 시간만큼 특정 작업을 계속하고 싶을 때 clock함수가 조사하는 시간이 기준점으로 사용될 수 있습니다. 다음 소스는 3초간 어떤 작업을 반복적으로 수행합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<time.h>
void main()
{
clock_t t1, t2;
int count = 0;
t1 = clock();
for (;;)
{
printf("잠시만 기다려주세요. %d\n", count++);
t2 = clock();
if (t2 - t1 > 3 * CLOCKS_PER_SEC)
{
break;
}
}
printf("끝났습니다.\n");
} |
cs |
t1에 최초 시간을 조사해 놓고 루프를 돌면서 t2를 다시 구해 이 두 시간끼리의 차가 3000이 될 떄를 3초로 계산할 수 있습니다. delay도 정확한 시간을 지연시키기는 하지만 기다리는 동안 다른 일을 할 수 없다는 점에서 다릅니다. 시스템 속도에 상관 없이 일정 시간동안 어떤 작업을 하고 싶다면 clock 함수로 구한 시간을 이용하면 됩니다.
'Programming > C' 카테고리의 다른 글
C언어 - 배열(Array)(2/2) (0) | 2015.08.15 |
---|---|
C언어 - 배열(Array)(1/2) (0) | 2015.08.13 |
기억 부류(Storage Class) (2/2) (0) | 2015.08.10 |
기억 부류(Storage Class) (1/2) (0) | 2015.08.09 |
C언어 - 함수(function)(4/4) (0) | 2015.08.07 |