| 제 33강) 라이브러리 함수1 |
오늘은 "강의에서 다루지 않았던"의 세번째 시간입니다.
이번 시간에는 라이브러리 함수에 대해서 다뤄보려고 합니다.
| 변환 함수(stdlib.h) |
데이터를 원하는 자료형으로 변환하여 주는 함수입니다.
문자(char)를 숫자로 바꾼다던지, 반대로 숫자를 문자로 바꾼다던지 하는 변환을 수행합니다.
먼저 atoi, atof, atol, itoa(비표준함수) 입니다.
#include <stdlib.h> // 아래의 모든 함수는 stdlib.h에 선언되어 있습니다.
// 문자열 str을 int형 정수로 변환
// (올바른 정수로 변환을 못할 시에는 0을 반환)
// (이때 문자열은 10진수로만 표현해야하며, 소수가 들어올 시 소수점 무시 및 e,E 무시)
int atoi (const char* str);
=> int i = atoi("55"); // i에는 int형으로 55가 변환되어 저장
=> int i = atoi("123.112e-4"); // i에는 int형으로 123이 변환되어 저장(e무시)
// 문자열 str을 double형 실수로 변환
// (올바른 실수로 변환을 못할 시에는 0.0을 반환)
// (이때 문자열은 e,E 식이 들어와도 되며 16진수(0x)도 가능)
double atof (const char* str);
=> double i = atof("55.123"); // i에는 double형으로 55.123000가 변환되어 저장
=> double i = atof("68.234e-3"); // i에는 double형으로 0.068234가 변환되어 저장
=> double i = atof("0x12345"); // i에는 double형으로 74565.000000이 변환되어 저장
// 문자열 str을 long int형 정수로 변환
// (atoi와 동일하나 자료형이 long int다)
// [!!표준함수 아님!! - VS에서만 가능(GCC에서 불가)]
long int atol (const char* str);
// 정수 value를 str배열에 base진수로 변환하여 저장
char* itoa (int value, char* str, int base);
=> char buffer[100] = { 0, };
=> itoa(1234, buffer, 10); // buffer에는 1234가 10진수 형태 문자열로 변환되어 저장 (1234)
=> itoa(15, buffer, 2); // buffer에는 15가 2진수 형태 문자열로 변환되어 저장 (1111)
위의 설명을 보시고 아래의 예제를 직접 코딩 해보세요.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int arrInt[] = { atoi("55"), atoi("123.112e-4") };
int length = sizeof(arrInt) / sizeof(int);
printf("arrInt: ");
for (int i = 0; i < length; i++)
printf("%d ", arrInt[i]);
printf("\n\n");
double arrDouble[] = { atof("55.123"), atof("68.234e-3"), atof("0x12345") };
length = sizeof(arrDouble) / sizeof(double);
printf("arrDouble: ");
for (int i = 0; i < length; i++)
printf("%f ", arrDouble[i]);
printf("\n\n");
/* itoa는 비표준함수입니다. */
char buffer[100] = { 0, };
itoa(123456, buffer, 10); printf("123456 -> %s\n", buffer);
itoa(15, buffer, 2); printf("15 -> %s\n", buffer);
return 0;
}
이제 strtod, strtol 입니다.
#include <stdlib.h> // 아래의 모든 함수는 stdlib.h에 선언되어 있습니다.
// 문자열 str을 double형으로 바꾸되 숫자와 컴마이외의 문자가 왔을시에
// 그 위치를 endptr에 반환한다.
double strtod (const char* str, char** endptr);
=> char buffer[100] = "123.123 5123.123";
=> char* endptr;
=> double a = strtod(buffer, &endptr); // a에는 123.123000이 저장되고, endptr은 그 이후인 " 5123.123"을 가리키게 된다.
// 문자열 str을 long int형으로 base진수로 바꾸되
// 숫자이외의 문자가 왔을시에 그 위치를 endptr에 반환한다.
long int strtol (const char* str, char** endptr, int base);
=> char buffer[] = "123 513";
=> char* endptr;
=> long int a = strtol(buffer, &endptr, 10); // a에는 123이 저장되고, endptr은 그 이후인 " 513"을 가리키게 된다.
위의 설명을 보시고 아래의 예제를 직접 코딩 해보세요.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char buffer[100] = "123.123 5123.123";
char* endptr;
double a = strtod(buffer, &endptr);
printf("a: %f\n", a);
printf("남은 부분: %s\n\n", endptr);
strcpy(buffer, "123 513");
long l = strtol(buffer, &endptr, 10);
printf("l: %d\n", l);
printf("남은 부분: %s\n\n", endptr);
strcpy(buffer, "152.31 23.412 553.1");
endptr = buffer;
while (1)
{
a = strtod(endptr, &endptr);
if (a == 0)
break;
printf("a: %f\n", a);
}
return 0;
}
위의 예제에서 18~26번 줄을 봅시다.
이 앞의 7번~11번과는 달리 endptr을 바로 buffer와 연결시켰습니다.
이렇게 되면 endptr은 buffer의 처음 번지인 buffer[0]을 가리키게 됩니다.
(이 부분은 포인터와 배열부분에서 이미 다뤘으니 자세한 설명은 생략하겠습니다.)
22번 줄에서 a에는 endptr의 시작지점부터 숫자가 처음으로 나오지 않는 지점인
이 공백부분을 자기자신으로 반환하게 됩니다.
그렇기 때문에 endptr은 22번줄을 실행한 후에는 저 공백을 가리키게 됩니다.
첫번째 while문 실행으로 a는 152.31이라는 값을 가지게 됩니다.
그리고 두번째 실행으로 a는 23.412라는 값을 가지게 되며, 세번째 실행으로 a는 553.1이라는 값을 가지게 됩니다. 그리고 네번째 실행일때 a는 그 해당 문자열을 벗어나는 구간을 가리키게 되므로 0이라는 값을 가지게 됩니다.
(정확히 말하자면 buffer라는 배열은 100이라는 공간을 가지게 됩니다. 여기서 값이 들어간 이후의 주소에는 0으로 매꾸어집니다.)
그러므로 while문을 빠져나오게 됩니다.
| 랜덤 함수(난수 생성 함수)(stdlib.h) |
값을 "어떠한 기준점을 바탕으로" 랜덤하게 생성해주는 함수입니다.
랜덤 함수는 기본적으로 2가지 함수가 젓가락 처럼 세트로 사용합니다.
#include <stdlib.h> // srand(), rand()
#include <time.h> // time()
// seed를 이용하여 난수 발생을 초기화 합니다.
// 이때 seed는 time(NULL)을 주로 사용합니다.
void srand (unsigned int seed);
// 난수를 발생시킵니다. 이때 발생되는 난수는 0 ~ RAND_MAX까지 입니다.
// (RAND_MAX는 stdlib.h에 명시되어 있습니다.)
// 난수를 원하는 만큼의 범위 내에서 생성하고 싶을때는 모듈로(%)를 사용합니다.
int rand(void);
=> rand() % 100; // 0 ~ 99 내의 난수
=> rand() % 50 + 1; // 1 ~ 50 내의 난수
=> srand(time(NULL));
=> int random = rand() % 5;
srand를 사용하여 초기화를 한 후에 rand 함수를 이용해서 랜덤값을 생성합니다.
이 랜덤함수를 가지고 주사위를 만들어 봅시다.
주사위는 1~6까지 임의의 숫자가 나오게 만들면 됩니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
printf("=====주사위 게임=====\n");
printf("1. 주사위 던지기\n");
printf("2. 끝내기\n");
printf("-> ");
}
void start()
{
int random = rand() % 6 + 1;
printf("주사위를 던졌습니다.\n");
printf("%d이(가) 나왔습니다.\n\n", random);
}
int main(void)
{
int select;
srand(time(NULL));
while (1)
{
menu();
scanf("%d", &select);
switch (select)
{
case 1:
start();
break;
case 2:
return 0;
default:
break;
}
}
return 0;
}
| 다음 시간에는 |
라이브러리 함수2로 뵙겠습니다.
'Study > C언어' 카테고리의 다른 글
| 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 35 [라이브러리 함수3(날짜 및 시간, time.h)] (3) | 2019.02.16 |
|---|---|
| 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 34 [라이브러리 함수2(문자, 수학)] (0) | 2019.02.16 |
| 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 32 [다루지 않았던2(Call by ~)] (0) | 2018.10.28 |
| 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 31 [다루지 않았던1(포인터를 이용한 함수 통신)] (0) | 2018.10.28 |
| 처음하시는 분들을 위한 C언어 기초강의 시즌2 - 30 [전역변수와 정적변수(static)] (0) | 2018.10.28 |