제 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 - 30 [전역변수와 정적변수(static)] (0) | 2018.10.28 |
처음하시는 분들을 위한 C언어 기초강의 시즌2 - 31 [다루지 않았던1(포인터를 이용한 함수 통신)] (0) | 2018.10.28 |