C Programming C 표준라이브러리 (C Standard Library) Seo, Doo-Ok Clickseo.com clickseo@gmail.com
목 차 표준입출력 : stdio.h 문자분류 : ctype.h 문자열처리 : string.h 표준라이브러리 : stdlib.h 수학관련함수 : math.h 날짜및시간관련함수 : time.h 2
표준라이브러리 (1/2) 표준라이브러리함수 (standard library functions) C 언어와 C++ 언어에는프로그래머의편의성을도모하기위해프로그램언어개발자들에의해작성되어포함된함수 C 표준라이브러리 (C standard library) ISO C 라이브러리 라고도한다. C POSIX 라이브러리 와거의동시에개발 glibc (The GNU C Library) 표준라이브러리함수를불러들이기위해전처리구문영역에 #include 문을사용 대표적인표준라이브러리함수인 scanf와 printf함수를사용하기위해헤더파일 <stdio.h> 를이용한다. 3
C 표준라이브러리 헤더파일 표준라이브러리 (2/2) 하나이상의함수원형선언과자료형의정의그리고다양한매크로들을포함 현재총 29개의헤더파일을제공 1995 년, 규범별첨 1(NA1) 에서 3 개의헤더파일추가 iso646.h, wchar.h 그리고 wctype.h 1999 년, C99 버전에서새롭게 6 개의헤더파일추가 complex.h, fenv.h, inttypes.h, stdbool.h, stdint.h 그리고 tgmath.h 2011 년, C11 버전에서 5 개의헤더파일이더추가 stdalign.h, stdatomic.h, stdnoreturn.h, threads.h 그리고 uchar.h 4
C 표준라이브러리 표준입출력 : <stdio.h> 5
표준입출력 (1/14) 입출력함수 스트림 (stream) : 디스크나그외장치를오가는데이터의모임 표준입출력라이브러리는 text stream 또는 binary stream을처리 text stream : \n 으로끝나는행들의모임 binary stream : 아무런처리를거치지않은데이터들의모임 stream은 open 을통해서파일이나 device 로바꾸어질수있고, close 에의해종료된다. 파일을 open 하면그파일의포인터가반환된다. 6
데이터유형 (Data Type) #include <stdio.h> 표준입출력 (2/14) typedef unsigned int size_t; struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE; typedef int64 fpos_t; 7
표준입출력 (3/14) 매크로 (Macro) : 변수및상수 #include <stdio.h> extern FILE iob[fopen_max] #define stdin (& iob[0]) // 표준입력스트림 #define stdout (& iob[1]) // 표준출력스트림 #define stderr (& iob[2]) // 프로그램의오류메시지나다른예외적인내용을출력하기위한출력스트림 #define EOF (-1) #define NULL ((void *) 0) #define BUFSIZ // 256KB, 512KB 또는 4096KB #define FOPEN_MAX // 동시에개방할수있는스트림개수 ( 최소 8 이상 ) #define FILENAME_MAX // 개방할수있는파일이름의최대길이 #define SEEK_SET 0 #define SEEK_CUR 1 #define SEEK_END 2 8
표준입출력 (4/14) 파일접근 (File access) 함수 #include <stdio.h> FILE *fopen(const char *filename, const char *mode); // stdin, stdout, stderr 중하나를다른파일과다시연결할때주로사용 FILE *freopen(const char *filename, const char *mode, FILE *stream); 반환 ( 성공 ) : 개방된파일의스트림의시작주소를반환 ( 실패 ) : NULL 값을반환 #include <stdio.h> FILE *fclose(file *stream); int fflush(file *stream); 반환 ( 성공 ) : 0 값을반환 ( 실패 ) : EOF 값을반환 9
표준입출력 (5/14) 직접적인입출력 (Direct I/O) 함수 #include <stdio.h> size_t fread(void *buffer, size_t size, size_t count, FILE *stream); size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream); - buffer : 읽기또는기록할메모리시작주소 - size : 각객체 ( 블록 ) 의크기 - buffer : 기록할객체 ( 블록 ) 의수 - size : 개방된스트림 반환 ( 성공 ) : 성공적으로읽기도는기록한객체 ( 블록 ) 수 (count) 를반환 ( 실패 ) : 오류발생 10
표준입출력 (6/14) 파일위치 (File positioning) 함수 (1/2) #include <stdio.h> long ftell(file *stream); 반환 ( 성공 ) : 지정된파일스트림에서파일포인터의위치값을반환 ( 실패 ) : EOF 값을반환 #include <stdio.h> // 개방된파일스트림에서파일포인터의위치를직접설정 int fseek(file *stream, long offset, int whence); #include <stdio.h> 반환 ( 성공 ) : 0 값을반환 ( 실패 ) : 0 이외의값을반환 // (void)fseek(stream, 0L, SEEK_SET) 과동일 void rewind(file *stream); 11
파일위치함수 (2/2) #include <stdio.h> 표준입출력 (7/14) int fgetpos(file *stream, fpos_t *pos); int fsetpos(file *stream, const fpos_t *pos); 반환 ( 성공 ) : 0 값을반환 ( 실패 ) : 0 이외의값을반환 ftell 함수와 fseek 함수사용시단점보완 fgetpos 함수와 fsetpos 함수는 ftell 함수와 fseek 함수사용시파일의크기가너무커서그위치를자료형 long int로표현할수없는경우를위해표준 C 언어에서추가된파일위치지정함수 12
표준입출력 (8/14) 형식화된입출력 (Formatted I/O) 함수 #include <stdio.h> int scanf(const char *format,...); 반환 ( 성공 ) : 입력에성공한필드개수를반환 ( 실패 ) : EOF 값을반환 int fscanf(file *stream, const char *format,...); int sscanf(char *buffer, const char *format,...); #include <stdio.h> int printf(const char *format,...); int fprintf(file *stream, const char *format,...); 반환 ( 성공 ) : 출력한바이트수를반환 ( 실패 ) : EOF 값을반환 int sprintf(char *buffer, const char *format,...); int snprintf(char *buffer, int buf_siz, const char *format,...); 13
표준입출력 (9/14) 비형식화된입출력 (Unformatted I/O) 함수 (1/3) #include <stdio.h> int fgetc(file *stream); int getc(file *stream); int fputc(int ch, FILE *stream); int putc(int ch, FILE *stream); int ungetc(int ch, FILE *stream); 반환 ( 성공 ) : 스트림으로부터읽거나기록한문자를반환 ( 실패 ) : EOF 값을반환 14
표준입출력 (10/14) 비형식화된입출력함수 (2/3) #include <stdio.h> int getchar(); int putchar(int ch); // int getc(stdin) // int putc(ch, stdout) 반환 ( 성공 ) : 표준입출력에서읽거나가록한문자를반환 ( 실패 ) : EOF 값을반환 15
표준입출력 (11/14) 비형식화된입출력함수 (3/3) #include <stdio.h> char *gets (char *str); char *gets_s (char *str, rsize_t n); char *fgets (char *str, int count, FILE *stream); // C11 반환 ( 성공 ) : str의주소를반환 ( 실패 ) : NULL 을반환 #include <stdio.h> int puts (const char *str); int fputs (const char *str, FILE *stream); 반환 ( 성공 ) : 음수가아닌정수를반환 ( 실패 ) : EOF 를반환 16
표준입출력 (12/14) 오류처리 (Error handling) 함수 라이브러리에있는많은함수들은에러가발생했을때에러가발생했음을알려준다. <errno.h> 에는 errno라는변수가선언되어있어서어떤에러가발생했는지를알수있게되어있다. #include <stdio.h> // 해당입력스트림으로부터파일의끝에도달했는지를검사 // 파일의끝에도달한경우 0이아닌값을, 도달하지않은경우에는 0을반환 int feof(file *stream); // 스트림의오류상태를반환 // 입출력도중오류가발생했다면 0이아닌값을, 그렇지않다면 0을반환 int ferror(file *stream); // 주어진스트림의오류발생여부나파일끝에도달했는지에대한정보를초기화 void clearerr(file *stream); 17
오류처리함수 (cont d) 표준입출력 (13/14) #include <stdio.h> // str 과 error 에해당하는에러메시지를출력한다. // 출력형식 : fprintf(stderr, %s : %s n, str, error message ) void perror(const char *str); 18
표준입출력 (14/14) 파일에대한작업 (Operations on files) 함수 #include <stdio.h> // 지정된파일 (filename) 을삭제한다. int remove(const char *filename); // 기존파일이름 (old_filename) 을새로운파일이름 (new_filename) 으로변경한다. int rename(const char *old_filename, const char *new_filename); 호출성공 : 0 을반환에러발생 : 0 이아닌값을반환 19
C 표준라이브러리 문자분류 : <ctype.h> 20
문자분류 (1/6) 매크로 (Macro) : 변수및상수 #include <ctype.h> #define _UPPER 0x1 // upper case letter #define _LOWER 0x2 // lower case letter #define _DIGIT 0x4 // digit[0-9] #define _SPACE 0x8 // tab, carriage return, newline, // vertical tab or form feed #define _PUNCT 0x10 // punctuation character #define _CONTROL 0x20 // control character #define _BLANK 0x40 // space char #define _HEX 0x80 // hexadecimal digit #define _LEADBYTE 0x8000 // multibyte leadbyte #define _ALPHA (0x0100 _UPPER _LOWER) // alphabetic character 21
문자분류함수 (1/2) 문자분류 (2/6) 주어진분류에속하고있는지그렇지않은지를알려준다. 접두어 is 로시작 #include <ctype.h> int islower(int ch); int isupper(int ch); // 영문소문자여부판단 // 영문대문자여부판단 int isdigit(int ch); int isxdigit(int ch); // 10 진수숫자문자여부판단 // 16 진수숫자문자여부판단 int isalnum(int ch); int isalpha(int ch); // isalpha(ch) 또는 isdigit(ch) 가만족되는경우 // isupper(ch) 또는 islower(ch) 가만족되는경우호출성공 : 0 값을반환에러발생 : 0 이외의값을반환 22
문자분류함수 (2/2) 문자분류 (3/6) 주어진분류에속하고있는지그렇지않은지를알려준다. #include <ctype.h> int iscntrl(int ch); int isgraph(int ch); // 제어문자여부판단 // 그래픽문자여부판단 int isspace(int ch); int isblank(int ch); //, \f, \r, \n, \t, \v //, \t int isprint(int ch); int ispunct(int ch); // 주어진문자를인쇄할수있는지여부판단 // 영문자, 숫자공백이아닌특수문자여부판단호출성공 : 0 값을반환에러발생 : 0 이외의값을반환 23
문자분류 (4/6) [ 출처 : http://en.wikipedia.org/wiki/c_character_classification ] 24
문자분류 (5/6) 문자변환함수 영문대문자롤소문자로또는영문소문자를대문자로변환 접두어 to 로시작 변환된문자값인정수를반환 #include <ctype.h> int tolower(int ch); int toupper(int ch); // 문자 ch를소문자로변환 // 문자 ch를대문자로변환 호출성공 : 변환된문자 ch 를반환에러발생 : 기존의문자 ch 를반환 25
프로그램예제 : 문자분류및변환함수 #include <stdio.h> #include <string.h> #include <ctype.h> 문자분류 (6/6) int main(void) { char *p, str[] = Hi~ Clickseo"; puts(str); for(p = str; p < str + strlen(str); p++) { if( islower(*p) ) putchar( toupper(*p) ); else if( isupper(*p) ) putchar( tolower(*p) ); else putchar(*p); } printf("\n"); } return 0; 26
C 표준라이브러리 문자열처리 : <string.h> 27
데이터유형 (Data Type) 문자열처리 (1/8) #include <string.h> typedef unsigned int size_t; typedef unsigned short wchar_t; 매크로 (Macro) : 변수및상수 #include <string.h> #define NULL ((void *) 0) 28
문자열처리 (2/8) 문자열조작 (String manipulation) 함수 널문자를포함한원본문자열을목적지문자열로복사 #include <string.h> char *strcpy (char *dest, const char *src); char *strncpy (char *dest, const char *src, size_t size); 한문자열을다른문자열의끝에연결 반환값 : 대상이되는메모리공간의시작주소 (dest) #include <string.h> char *strcat (char *dest, const char *src); char *strncat (char *dest, const char *src, size_t size); 반환값 : 대상이되는메모리공간의시작주소 (dest) 29
문자열처리 (3/8) 문자열검사 (String examination) 함수 (1/4) 문자열길이를반환 #include <string.h> size_t strlen (const char *str); 반환값 : 대상문자열의길이 (byte) 반환 두개의문자열을비교 #include <string.h> int strcmp (const char *str1, const char *str2); int strncmp (const char *str1, const char *str2, size_t size); 반환값 :(str1 < str2) 음수값을반환 (str1 > str2) 양수값을반환 (str1 == str2) 0 값을반환 30
문자열검사함수 (2/4) #include <string.h> 문자열처리 (4/8) // 문자가문자열에존재하는지검색 char *strchr (const char *str, int ch); char *strrchr (const char *str, int ch); // 문자열에서부분문자열이존재하는지검색 char *strstr (const char *dest, const char *src); 호출성공 : 검색된문자또는문자열위치의메모리주소를반환에러발생 : NULL 값을반환 strchr : 문자열의처음부터처음으로일치하는문자를검색 strrchr : 문자열의끝에서부터일치하는문자를검색 31
문자열검사함수 (3/4) #include <string.h> 문자열처리 (5/8) size_t *strspn(const char *dest, const char *src); size_t *strcspn(const char *dest, const char *src); 호출성공 : 찾아낸세그먼트의길이에러발생 : 0 값을반환 ( 세그먼트가존재하지않을경우 ) strspn : 원본문자열에서대상문자열의순서대로존재하지않더라도, 대상문자열에존재하는문자들중에서원본문자열에 연속적으로몇개나존재하는검색하는함수 strcspn : 대상문자열을구성하는문자가 원본문자열에연속적으로존재하지않는길이를구하는함수 32
문자열검사함수 (4/4) #include <string.h> 문자열처리 (6/8) const char *strpbrk(const char *dest, const char *str); 호출성공 : 문자열 str 에있는문자중첫번째로발견된위치 ( 주소 ) 에러발생 : NULL 값을반환 ( 한문자도존재하지않을경우 ) strpbrk : 특정문자열에서여러개의문자중하나라도존재하는지검색 #include <string.h> char *strtok(char *str, const char *token); 호출성공 : 찾아낸 token 위치 ( 주소 ) 에러발생 : NULL 값을반환 (token 이더이상없을경우 ) strtok : 원하는구분자를이용하여문자열을쪼갤수있도록하는함수 33
문자열처리 (7/8) 메모리복사 (Memory manipulation) 함수 (1/2) #include <string.h> void *memset(void *dest, int ch, size_t count); void *memcpy(void *dest, const void *src, size_t count); void *memmove(void *dest, const void *src, size_t count); 호출성공 : 대상이되는메모리공간의시작주소 (dest) 에러발생 : NULL 값을반환 memset : 주어진메모리공간에특정데이터를저장 memcpy : 주어진메모리공간을원하는만큼복사 memmove : memcpy 함수와그기능이비슷하다. 34
메모리복사함수 (2/2) #include <string.h> 문자열처리 (8/8) int memcmp(const void *dest, const void *src, size_t count); memcmp : 주어진메모리공간을원하는만큼비교 반환값 :(des < src) 음수값을반환 (des > src) 양수값을반환 (des == src) 0 값을반환 #include <string.h> int memchr(const void *dest, int ch, size_t count); 호출성공 : 검색할문자 (ch) 를발견한가장첫번째메모리주소에러발생 : NULL 값을반환 memchr : 특정메모리공간에서사용자가지정한문자를검색 35
C 표준라이브러리 표준라이브러리 : <stdlib.h> 36
표준라이브러리 (1/14) 데이터유형 (Data Type) #include <stdlib.h> typedef unsigned int size_t; typedef unsigned short wchar_t; // 몫과나머지를계산하는 div, ldiv 그리고 lldiv 함수에서사용하는데이터구조 typedef struct _div_t { int quot; // 몫 (The quotient) int rem; // 나머지 (The remainder) }div_t; sturct _ldiv_t { long quot; // 몫 (The quotient) long rem; // 나머지 (The remainder) }ldiv_t; sturct _lldiv_t { long long quot; long long rem; }lldiv_t; // 몫 (The quotient) // 나머지 (The remainder) 37
표준라이브러리 (2/14) 매크로 (Macro) : 변수및상수그리고매크로함수 #include <stdlib.h> #define NULL ((void *) 0) // exit 함수를위해정의된값 #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 // rand 함수사용시임의의난수발생최대값 #define RAND_MAX 0x7fff #define max(a, b) (((a) > (b))? (a) : (b)) #define min(a, b) (((a) < (b))? (a) : (b)) 38
표준라이브러리 (3/14) 숫자를문자열로변환하는함수 정수형숫자를 2 진수, 8 진수, 10 진수또는 16 진수의문자열로변환 itoa 함수 : integer to ascii ltoa 함수 : long to ascii #include <stdlib.h> // int 형숫자를문자열 str 로변환 char *itoa (int value, char *str, int radix); // long 형숫자를문자열 str 로변환 char *ltoa (long value, char *str, int radix); 호출성공 : 변환된문자열의시작주소 (str) 범위오류 : NULL 값을반환 39
표준라이브러리 (4/14) 프로그램예제 : 숫자를문자열로변환 #include <stdio.h> #include <stdlib.h> int main(void) { int num1 = 12345; long int num2 = 54321; char str[1024]; itoa(num1, str, 10); printf(" 정수 : %d, 문자열 : %s \n", num1, str); ltoa(num2, str, 10); printf(" 정수 : %ld, 문자열 : %s \n", num2, str); itoa(num1, str, 2); printf(" 정수 : %d, 2 진수문자열 : %s \n", num1, str); itoa(num1, str, 16); printf(" 정수 : %d, 16 진수문자열 : %s \n", num1, str); } return 0; 40
표준라이브러리 (5/14) 문자열을숫자로변환하는함수 (1/4) 문자열을숫자로 ( 실수형또는정수형 ) 변환 #include <stdlib.h> // 문자열 str 을 int, long 또는 long long 형정수로변환 int atoi (const char *str); long atol (const char *str); long long atoll (const char *str); 호출성공 : 변환된정수형값을반환범위오류 : 0 값을반환 ( 더이상변환을수행할수없을경우 ) #include <stdlib.h> // 문자열 str 을 double 형실수로변환 double atof (const char *str); 호출성공 : 변환된실수형값을반환범위오류 : 0.0 값을반환 ( 더이상변환을수행할수없을경우 ) 41
표준라이브러리 (6/14) 문자열을숫자로변환하는함수 (2/4) 문자열을정수 (long 또는 long long) 값으로변환 #include <stdlib.h> // 문자열 str 을 long 또는 long long 형정수로변환 long strtol (const char *str, char **str_end, int radix); long long strtoll (const char *str, char **str_end, int radix); 호출성공 : 변환된정수형값을반환범위오류 : LONG_MAX, LONG_MIN, LLONG_MAX 또는 LLONG_MIN 반환 0 값을반환 ( 더이상변환을수행할수없을경우 ) 문자열의구조 [ 공백또는탭문자 ] [ 부호 (+ 또는 -) ] [ 숫자 ( 0 ~ 9 ) str_end 는변환이중지될경우, 중지된문자를가리키는용도 ( 에러검색시사용 ) radix는해석할진법을지정 42
표준라이브러리 (7/14) 문자열을숫자로변환하는함수 (3/4) 문자열을부호없는정수 (long) 값으로변환 #include <stdlib.h> // 문자열 str 을 long 또는 long long 형정수로변환 unsigned long strtoul (const char *str, char **str_end, int radix); unsigned long long strtoull (const char *str, char **str_end, int radix); 호출성공 : 변환된정수형값을반환범위오류 : ULONG_MAX, ULLONG_MAX 반환 0 값을반환 ( 더이상변환을수행할수없을경우 ) 문자열의구조 [ 공백또는탭문자 ] [ 부호 (+ 또는 -) ] [ 숫자 ( 0 ~ 9 ) str_end 는변환이중지될경우, 중지된문자를가리키는용도 ( 에러검색시사용 ) radix는해석할진법을지정 43
표준라이브러리 (8/14) 문자열을숫자로변환하는함수 (4/4) 문자열을부동소수점 (float, double, long double) 으로변환 #include <stdlib.h> // 문자열 str 을 double 형실수로변환 float strtof (const char *str, char **str_end); double strtod (const char *str, char **str_end); long doube strtold (const char *str, char **str_end); 호출성공 : 변환된부동소수점값을반환범위오류 : HUGE_VAL, HUGE_VALF 또는 HUGE_VALL 반환 0 값을반환 ( 더이상변환을수행할수없을경우 ) 문자열의구조 [ 공백또는탭문자 ] [ 부호 (+ 또는 -) ] [ 숫자 ( 0 ~ 9 ) ] [ 소수점 (.) ] [e] str_end 는변환이중지될경우, 중지된문자를가리키는용도 ( 에러검색시사용 ) 44
표준라이브러리 (9/14) 프로그램예제 : 문자열을숫자로변환 #include <stdio.h> #include <stdlib.h> int main(void) { char *str1 = "123"; char *str2 = "1234567"; char *str3 = "123.456"; int long int double num1; num2; num3; } num1 = atoi(str1); num2 = atol(str2); num3 = atof(str3); printf(" 문자열 : %s, int 형숫자 : %d \n", str1, num1); printf(" 문자열 : %s, int 형숫자 : %d \n", str2, num2); printf(" 문자열 : %s, int 형숫자 : %d \n", str3, num3); return 0; 45
메모리관련함수 표준라이브러리 (10/14) 동적메모리할당및해제함수 #include <stdlib.h> void *malloc (size_t size); void *calloc(size_t num, size_t size); void *realloc (void *ptr, size_t new_size); 호출성공 : 동적으로할당받은메모리공간의시작주소를반환범위오류 : NULL 값을반환 #include <stdlib.h> void free (void *ptr); 46
표준라이브러리 (11/14) 프로세스제어관련함수 #include <stdlib.h> void exit (int exit_code); // 프로그램을정상적인상태로종료 void abort (); // 프로그램을그상태에서정지 ( 비정상적인종료 ) // 프로세스가 exit 함수를호출하여종료할때수행되는함수들을등록한다. int atexit (void (*func)(void)); // exit 함수와같지만 clean-up-action을수행하지않고프로그램종료 void _exit(int exit_code); void _Exit(int exit_code); #include <stdlib.h> int system(const char *command); 호출성공 : 0 값을반환범위오류 : -1 값을반환 47
표준라이브러리 (12/14) 프로그램예제 : 프로그램흐름제어관련함수 #include <stdlib.h> #include <stdio.h> void func1(void); void func2(void); int main(void) { printf("hello\n"); atexit(func1); atexit(func2); printf("bye\n"); } exit(0); // _exit(0); 수정시 func1 과 func2 는실행되지않고종료한다. void func1(void) { printf("func1\n"); } void func2(void) { printf("func2\n"); } 48
표준라이브러리 (13/14) 임의의난수생성함수 #include <stdlib.h> // 0~RAND_MAX 의사이에서임의의난수를생성하여반환 int rand (void); // seed 있는랜덤발생함수, 초기의 seed 는 1이다. void srand (unsigned int seed); 49
표준라이브러리 (14/14) 프로그램예제 : 3 개의난수생성 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int a, b, c; srand(time(null)); a = rand(); b= rand(); c = rand(); printf("3 개의난수생성 : a = %d, b = %d, c = %d \n", a, b, c); } return 0; 50
C 표준라이브러리 수학관련함수 : <math.h> 51
수학계산함수 (1/3) #include <math.h> 수학관련함수 (1/14) // 나눗셈함수 ( 몫과나머지계산 ) div_t div(int x, int y); ldiv_t ldiv(long x, long y); lldiv_t lldiv(long long x, long long y); 52
수학계산함수 (2/3) #include <math.h> 수학관련함수 (2/14) // 정수형의절대값을계산하여반환 int abs(int n); long labs(long n); long long llabs(long long n); #include <math.h> // 부동소수점의절대값을계산하여반환 float fabsf(float arg); double fabs(double arg); long double fabsl(long double arg); 53
수학계산함수 (3/3) #include <math.h> 수학관련함수 (3/14) // 실수 x 를실수y 로나눈나머지를계산하여반환 float fmodf(float x, float y); double fmod(double x, double y); long double fmodl(long double x, long double y); // 실수 x 와실수 y 에서큰값을반환 float fmaxf(float x, float y); double fmax(double x, double y); long double fmaxl(long double x, long double y); // 실수 x 와실수 y 에서작은값을반환 float fminf(float x, float y); double fmin(double x, double y); long double fminl(long double x, long double y); 54
지수와로그함수 (1/3) 수학관련함수 (4/14) #include <math.h> // 기본 base 가자연로그 (e) 인 arg 제곱값을반환 float expf(float arg); double exp(double arg); long double expl(long double arg); #include <math.h> // arg 의자연로그 ( 기본 base 는 e) 값을반환 float logf(float arg); double log(double arg); long double logl(long double arg); 55
지수와로그함수 (2/3) 수학관련함수 (5/14) #include <math.h> // arg 의자연로그 ( 기본 base 는 10) 값을반환 float log10f(float arg); double log10(double arg); long double log10l(long double arg); 56
지수와로그함수 (3/3) 수학관련함수 (6/14) #include <math.h> // base 의 exp 승값을계산하여반환 float powf(float base, float exp); double pow(double base, double exp); long double powl(long double base, long double exp); #include <math.h> // arg 의 0 이아닌제곱근을계산하여반환 float sqrtf(float arg); double sqrt(double arg); long double sqrtl(long double arg); 57
삼각함수 (1/3) #include <math.h> 수학관련함수 (7/14) // arg 의 sine 값을계산하여반환 float sinf(float arg); double sin(double arg); long double sinl(long double arg); // arg 의 cosine 값을계산하여반환 float cosf(float arg); double cos(double arg); long double cosl(long double arg); // arg 의 tangent 값을계산하여반환 float tanf(float arg); double tan(double arg); long double tanl(long double arg); 58
삼각함수 (2/3) #include <math.h> 수학관련함수 (8/14) // arg 의 arc sine 값을계산하여반환 float asinf(float arg); double asin(double arg); long double asinl(long double arg); // arg 의 arc cosine 값을계산하여반환 float acosf(float arg); double acos(double arg); long double acosl(long double arg); // arg 의 arc tangent 값을계산하여반환 float atanf(float arg); double atan(double arg); long double atanl(long double arg); 59
삼각함수 (3/3) #include <math.h> 수학관련함수 (9/14) // y/x 의 arc tangent 값을계산하여반환 float atan2f(float y, float x); double atan2(double y, double x); long double atan2l(long double y, long double x); 60
쌍곡선함수 (1/2) 수학관련함수 (10/14) #include <math.h> // arg 의쌍곡선 (hyperbolic) sine 값을계산하여반환 float sinhf(float arg); double sinh(double arg); long double sinhl(long double arg); // arg 의쌍곡선 (hyperbolic) cosine 값을계산하여반환 float coshf(float arg); double cosh(double arg); long double coshl(long double arg); // arg 의쌍곡선 (hyperbolic) tangent 값을계산하여반환 float tanhf(float arg); double tanh(double arg); long double tanhl(long double arg); 61
쌍곡선함수 (2/2) 수학관련함수 (11/14) #include <math.h> // arg 의쌍곡선 (hyperbolic) arc sine 값을계산하여반환 float asinhf(float arg); double asinh(double arg); long double asinhl(long double arg); // arg 의쌍곡선 (hyperbolic) arc cosine 값을계산하여반환 float acoshf(float arg); double acosh(double arg); long double acoshl(long double arg); // arg 의쌍곡선 (hyperbolic) arc tangent 값을계산하여반환 float atanhf(float arg); double atanh(double arg); long double atanhl(long double arg); 62
수학관련함수 (12/14) 가장가까운정수또는부동소수점연산함수 (1/2) #include <math.h> // arg 를초과하는정수중에서가장가까운정수를반환 float ceilf(float arg); double ceil(double arg); long double ceill(long double arg); // arg 보다작은정수중에서가장가까운정수를반환 float floorf(float arg); double floor(double arg); long double floorl(long double arg); // arg 의소수점이하를버리고정수를반환 float truncf(float arg); double trunc(double arg); long double truncl(long double arg); 63
수학관련함수 (13/14) 가장가까운정수또는부동소수점연산함수 (2/2) #include <math.h> // arg 에서가까운정수 ( 즉, 반올림값 ) 를반환 float roundf(float arg); double round(double arg); long double roundl(long double arg); long lroundf(float arg); long lround(double arg); long lroundl(long double arg); long long llroundf(float arg); long long llround(double arg); long long llroundl(long double arg); 64
수학관련함수 (14/14) 부동소수점조작함수 #include <math.h> // 실수 x 를정수부분과실수부분으로분리하여한다. // 정수부분은 iptr 에저장되고, 실수부분은반환 float modff(float x, float *iptr); double modf(double x, double *iptr); long double modfl(long double x, long double *iptr); #include <math.h> // arg *2 exp 를계산하여반환 // arg * pow(2, exp) 의결과와동일하다. float ldexpf(float arg, int exp); double ldexp(double arg, int exp); long double ldexpl(long double arg, int xp); 65
C 표준라이브러리 날짜및시간관련함수 : <time.h> 66
날짜및시간관련함수 (1/7) 데이터유형 (Data Type) #include <time.h> struct tm { int tm_sec; // 초 [0-59] int tm_min; // 분 [0-59] int tm_hour; // 시 [0-23] int tm_mday; // 일자 [1-31] int tm_mon; // 1월에서 12월 [0 11, 0 = January] int tm_year; // 1900년이후부터경과한년도 int tm_wday; // 일요일에서토요일 [0 6, 0 = Sunday] int tm_yday; // 1월 1일부터경과된날짜 [0-365] int tm_isdst; // 서머타임설정여부플러그 }; typedef long time_t; typedef long clock_t; // 시간을표현하는산술유형 // 프로세스실행시간유형 67
날짜및시간관련함수 (2/7) 매크로 (Macro) : 변수및상수 #include <time.h> #define CLOCKS_PER_SEC 1000 #define CLK_TCK CLOCKS_PER_SEC 68
날짜및시간관련함수 (3/7) 시간조작함수 #include <time.h> // 프로그램시작후의경과한 clock tick(1초에 18.2만큼증가 ) 를반환 clock_t clock(); 호출성공 : process tick count 값을반환호출실패 : (clock_t) -1 값을반환 #include <time.h> // 1970년 1월 1일자정부터경과된현재시간을초단위로계산하여반환 time_t time(time_t *time); 호출성공 : 현재시간값을반환호출실패 : (time_t) -1 값을반환 #include <time.h> // time2 time1 을초로계산하여결과값을반환 double difftime(time_t time2, time_t time1); 호출성공 : 두시간의차를계산한실수값을반환 69
날짜및시간관련함수 (4/7) 프로그램예제 : 시간관련함수 #include <stdio.h> #include <time.h> int main(void) { clock_t start, end; int i = 0; double time; start = clock(); while(i < 30000000) i++; end = clock(); time = (double) (end - start) / CLK_TCK; printf( 수행시간 : %lf\n", time ); } return 0; 70
날짜및시간관련함수 (5/7) 형식변환함수 (1/2) #include <time.h> // 구조체 time_ptr 에저장된값을지정된형식의문자열로변환 char *asctime(const tm *time_ptr); // time 값을시간과날짜형식의지정된문자열로변환 char *ctime(const time_t *time); 문자열형식 호출성공 : 지정된형식으로변환된문자열의시작주소를반환호출실패 : NULL 값을반환 Www Mmm dd hh:mm:ss yyy Www : 요일 (Mon, Tue, Wed, Thu, Fri, Sat, Sun) Mmm : 월 (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec) dd : 일 (the day of the month) hh : 분 (minutes) ss : 초 (seconds) yyyy : 년도 (years) 71
날짜및시간관련함수 (6/7) 형식변환함수 (2/2) #include <time.h> // time 함수에의해구해진시간을날짜와시간관련구조체 tm 에저장 (GMT 표준시간 ) tm *gmtime(const time_t *time); // time 함수에의해구해진시간을 tm 구조체에저장 ( 지역표준시간 ) tm *localime(const time_t *time); 호출성공 : 변환된날짜와시간관련구조체 tm의시작주소를반환호출실패 : NULL 값을반환 72
날짜및시간관련함수 (7/7) 프로그램예제 : 날짜관련함수 #include <stdio.h> #include <time.h> int main(void) { time_t t; struct tm *gmt, *local; // time 함수를이용하여현재시간을구한다. t = time(null); printf(" 현재 GMT : %d \n", t); // 현재시간을 GMT 와지역표준시간으로변환 gmt = gmtime(&t); local = localtime(&t); // tm 구조체에저장된값을지정된문자열로변환 // 지정된문자열형식 : Www Mmm dd hh:mm:ss yyy printf("gmt 표준시간 : %s \n", asctime(gmt) ); printf(" 지역표준시간 : %s \n", asctime(local) ); } return 0; 73
참고문헌 [1] 서두옥, 이동호 ( 감수 ), ( 열혈강의 ) 또하나의 C : 프로그래밍은셀프입니다, 프리렉, 2012. [2] Paul Deitel, Harvey Deitel, "C How to Program", Global Edition, 8/E, Pearson, 2016. [3] SAMUEL P. HARBISON Ⅲ, GUY L. STEELE, C 프로그래밍언어, C : A Reference Manual, 5/E, Pearson Education Korea, 2005. [4] Behrouz A. Forouzan, Richard F. Gilberg, 김진외 7인공역, 구조적프로그래밍기법을위한 C, 도서출판인터비젼, 2004. [5] Brian W. Kernighan, Dennis M. Ritchie, 김석환외 2인공역, The C Programming Language, 2/E, 대영사, 2004. 이강의자료는저작권법에따라보호받는저작물이므로무단전제와무단복제를금지하며, 내용의전부또는일부를이용하려면반드시저작권자의서면동의를받아야합니다. Copyright Clickseo.com. All rights reserved. 74