C 언어 API(Application Programing Interface)
C 언어에는 굉장히 많은 API들이 있습니다.
이번 장에서는 C 언어에 내장된 여러가지 유용한 API들을 찾고 사용할 수 있는 방법에 대해 설명합니다.
21.1 C 언어 문자 관련 API
이번에는 문자 관련 API를 사용해보겠습니다.
<ctype.h>
파일을 인클루드하면 문자의 내용을 판단하여 대문자, 소문자 등으로 변경할 수 있습니다.
코드: CharTypeDemo.c
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char c = 'A';
printf("문자: %c(%d)\n", c, c);
printf("소문자: %c(%d)\n", tolower(c), tolower(c));
printf("대문자: %c(%d)\n", toupper(c), toupper(c));
}
문자: A(65)
소문자: a(97)
대문자: A(65)
C 언어에서 문자는 char
대신 int
형식으로도 사용 가능합니다.
문자 변수의 값을 %c
로 출력하면 문자가 출력되고 %d
서식 지정자를 사용하면 숫자가 출력됩니다.
<ctype.h>
파일에 정의된 toupper()
함수와 tolower()
함수를 사용하여 문자를 대문자 또는 소문자로 변경 가능합니다.
21.1 연습문제: 영문 대문자 A부터 Z까지의 문자 하나를 입력받아 소문자로 바꾸어 출력하는 프로그램
코드: ToUpperPractice.c
//[?] 영문 대문자 A부터 Z까지의 문자 하나를 입력받아 소문자로 바꾸어 출력하는 프로그램
#include <stdio.h>
int main(void)
{
int c;
printf("영문 대문자 A부터 Z까지의 문자 하나를 입력: _\b");
c = getche();
// 대문자 'A'부터 'Z'까지만 처리하고, 나머지는 경고음과 함께 종료
if (c >= 'A' && c <= 'Z')
{
printf("\n입력한 문자의 소문자: %c\n", tolower(c));
}
else
{
printf("\n다시 도전하세요.\a\n");
}
return 0;
}
영문 대문자 A부터 Z까지의 문자 하나를 입력: D
입력한 문자의 소문자: d
영문 대문자 A부터 Z까지의 문자 하나를 입력: y
다시 도전하세요.
21.1 심사문제: 영문 대문자 A부터 Z까지의 문자 하나를 입력받아 소문자로 바꾸어 출력하는 프로그램
코드: ToUpperExam.c
//[?] 영문 대문자 A부터 Z까지의 문자 하나를 입력받아 소문자로 바꾸어 출력하는 프로그램
#include <stdio.h>
int main(void)
{
int c;
printf("영문 대문자 A부터 Z까지의 문자 하나를 입력: _\b");
c = getche();
printf("\n입력한 문자의 소문자: %c\n", tolower(c));
return 0;
}
영문 대문자 A부터 Z까지의 문자 하나를 입력: Y
입력한 문자의 소문자: y
21.2 isalpha() 함수: 알파벳 문자이면 참을 반환
#include <stdio.h>
#include <ctype.h> // 문자 처리 관련 함수
int main(void)
{
// 원본 데이터: 문자 배열(문자열)
char str[] = "A1b2c D3e4f\0F4e3d C2b1a";
// isalpha() 함수: 알파벳이면 1(참)
if (isalpha(str[0]))
{
printf("%c는 알파벳 문자\n", str[0]);
}
}
A는 알파벳 문자
21.3 isdigit() 함수: 숫자이면 참을 반환
코드: IsDigit.c
#include <stdio.h>
#include <ctype.h> // 문자 처리 관련 함수
int main(void)
{
// 원본 데이터: 문자 배열(문자열)
char str[] = "A1b2c D3e4f\0F4e3d C2b1a";
// isdigit() 함수: 숫자이면 1(true)
if (isdigit(str[1]))
{
printf("%c은(는) 숫자\n", str[1]);
}
}
1은(는) 숫자
21.4 isalnum() 함수: 알파벳 또는 숫자이면 참을 반환
코드: IsAlNum.c
#include <stdio.h>
#include <ctype.h> // 문자 처리 관련 함수
int main(void)
{
// 원본 데이터: 문자 배열(문자열)
char str[] = "A1b2c D3e4f\0F4e3d C2b1a";
// isalnum() 함수: 알파벳 또는 숫자이면 true
if (isalnum(str[2]) && isalnum(str[3])) // b && 2
{
printf("%c와 %c는 알파벳 또는 숫자\n", str[2], str[3]);
}
return 0;
}
b와 2는 알파벳 또는 숫자
21.5 isupper() 함수와 islower() 함수: 대문자 또는 소문자 판단
코드: IsUpperIsLower.c
#include <stdio.h>
#include <ctype.h> // 문자 처리 관련 함수
int main(void)
{
// 원본 데이터: 문자 배열(문자열)
char str[] = "A1b2c D3e4f\0F4e3d C2b1a";
// isupper() 함수: 대문자이면 1
if (isupper(str[0])) // A
{
printf("%c는 대문자\n", str[0]);
}
// islower() 함수: 소문자이면 1
if (islower(str[2])) // b
{
printf("%c는 소문자\n", str[2]);
}
return 0;
}
A는 대문자
b는 소문자
21.6 isspace() 함수: 공백 문자이면 참을 반환
코드: IsSpace.c
#include <stdio.h>
#include <ctype.h> // 문자 처리 관련 함수
int main(void)
{
// 원본 데이터: 문자 배열(문자열)
char str[] = "A1b2c D3e4f\0F4e3d C2b1a";
// isspace() 함수: 공백 문자이면 1
if (isspace(str[5])) // 5번째 인덱스의 문자값이 공백이냐?
{
printf("\"%c\"는 공백\n", str[5]);
}
return 0;
}
" "는 공백
21.7 C 언어 함수 설명서 사이트
21.8 .NET API 탐색기와 Docs
Microsoft는 Microsoft Learn를 제공하여 웹에서 모든 API에 대한 검색을 제공합니다. 다음 경로에서 .NET API 탐색기를 실행할 수 있습니다.
21.9 구조체, 열거형
구조체(Struct)
DateTime 구조체, TimeSpan 구조체 형태로 표현되며 클래스와 거의 동일하게 사용됩니다.
열거형(Enumeration)
Color 열거형 등이 있으며 특정 목록을 관리할 때 편리함을 제공합니다.
21.11 C 언어 수학 관련된 함수인 절댓값 함수를 사용하여 절댓값 구하기
C 언어 수학 관련된 함수인 절댓값 함수를 사용하여 절댓값 구하는 예제입니다.
코드: abs_api.c
// 수학 관련된 함수: 절댓값 함수를 사용하여 절댓값 구하기
#include <stdio.h>
#include <stdlib.h> // abs(), labs()
#include <math.h> // fabs()
int main(void)
{
//[1] abs() 함수: 정수(int) 데이터 타입의 절댓값
printf("%d -> %d\n", -100, abs(-100)); // -100 -> 100
//[2] labs() 함수: 정수(long) 데이터 타입의 절댓값
printf("%ld -> %ld\n", -1234, labs(-1234)); // -1234 -> 1234
//[3] fabs() 함수: 실수(double) 데이터 타입의 절댓값
printf("%.2f -> %.2f\n", -3.14, fabs(-3.14)); // -3.14 -> 3.14
return 0;
}
-100 -> 100
-1234 -> 1234
-3.14 -> 3.14
21.12 나머지를 구해주는 나머지 함수 사용하기
C 언어에서 나머지를 구해주는 나머지 함수 사용하는 예제입니다.
코드: div_mod.c
// 나머지를 구해주는 나머지 함수 사용하기
#include <stdio.h>
#include <stdlib.h> // div(), ldiv()
#include <math.h> // fmod()
int main(void)
{
div_t r; // div_t: div() 함수의 반환값 형식
ldiv_t m; // ldiv_t: ldiv() 함수의 반환값 형식
double d; // double: fmod() 함수의 반환값 형식
//[1] 정수(int) 나누기
r = div(5, 3);
printf("몫: %d, 나머지: %d\n", r.quot, r.rem); // 1, 2
//[2] 정수(long) 나누기
m = ldiv(3, 5);
printf("몫: %ld, 나머지: %ld\n", m.quot, m.rem); // 0, 3
//[3] 실수 나누기
d = fmod(3.14, 3.12); // 0.02
printf("나머지: %.2f\n", d);
return 0;
}
몫: 1, 나머지: 2
몫: 0, 나머지: 3
나머지: 0.02
21.13 실수를 정수와 소수로 분리하기
C 언어에서 실수(floating-point)를 정수부(integer part)와 소수부(fractional part)로 분리하는 함수를 소개합니다.
코드: modf.c
// 실수(floating-point)를 정수부(integer part)와 소수부(fractional part)로 분리하기
#include <stdio.h>
#include <math.h> // modf(), modff(), modfl()
int main(void)
{
double d, i, f;
d = 3.14; // 원본 데이터
f = modf(d, &i); // 정수부와 소수부 분리하기
// 3.14의 정수부는 3이고 소수부는 0.14입니다.
printf("%.2f의 정수부는 %.f이고 소수부는 %.2f입니다.", d, i, f);
return 0;
}
3.14의 정수부는 3이고 소수부는 0.14입니다.
21.14 C 언어 거듭제곱(pow)과 제곱근(sqrt) 구하기
C 언어의 math.h
헤더 파일에서 제공하는 거듭제곱(pow
)과 제곱근(sqrt
)을 구하는 함수를 소개합니다.
pow()
함수는 pow(2, 10)
형태로 2의 10제곱을 구하는 거듭제곱 함수이고, sqrt()
함수는 sqrt(9)
형태로 루트 9를 구해주는 제곱근 함수입니다.
pow() 함수와 sqrt() 함수의 시그니처는 다음과 같습니다.
- double pow(double __x, double __y);
- double sqrt(double __x, double __y);
코드: pow_sqrt.c
//[?] 거듭제곱과 제곱근 구하기
#include <stdio.h>
#include <math.h> // pow(), sqrt() 함수가 정의된 헤더 파일
int main(void)
{
// 2의 10승과 2의 20승
printf("%.0lf, %.0lf\n", pow(2, 10), pow(2, 20)); // 1024, 1048576
// 9의 제곱근
printf("%.0lf\n", sqrt(9)); // 3
return 0;
}
1024, 1048576
3
21.15 지역화(Localization)
#include <locale.h>
21.17 C 언어 내장 함수: 랜덤 값 관련
프로그래밍에서 랜덤 값은 실행할 때마다 임의의 값이 나오는 걸 의미합니다.
C 언어에서 랜덤 값을 만들어내고자할 때에는 srand()
, time()
, rand()
의 3가지 함수의 조합으로 만들 수 있습니다.
코드: RandDemo.c
// 내장 함수 : 랜덤값 출력(임의값 출력)
#include <stdio.h> // printf(), scanf(), ...
#include <stdlib.h> // rand(), ...
#include <time.h> // time()
int main(void)
{
int i = 0;
int r = 0;
int l = 0;
//[1] 난수 초기값 설정
srand((unsigned)time(0));
//[!] 로또 번호 생성기: 1~45까지의 수를 5개 랜덤하게 출력
for (i = 0; i < 5; i++)
{
// rand() 함수는 0 ~ 32767 중 하나를 출력
l = rand() % 45 + 1; // rand() % 45 => 0~44까지 중 하나가 나옴
printf("%d", l);
if (i == 4)
{
printf("\n");
}
else
{
printf(",\t");
}
}
return 0;
}
22, 3, 16, 19, 5
21.18 putch() 함수로 화면에 문자 하나 출력하기
putch() 함수를 사용하면 콘솔 화면에 문자 하나를 출력할 수 있습니다.
코드: PutchDemo.c
//[?] putch() 함수: 콘솔 화면에 문자 하나를 출력
#include <stdio.h>
int main(void)
{
putch('A');
putch('\n'); // 이스케이프 시퀀스도 하나의 문자로 표현
putch(65); // 문자 'A'에 해당하는 아스키코드 값으로 문자 출력
return 0;
}
A
A
문자 하나를 출력할 때에는 putch()
함수에 'A', '\n', 아스키코드 65
를 사용해서 문자 하나를 출력할 수 있습니다.
21.19 getch() 함수로 콘솔에서 문자 하나 입력받기
코드: GetchDemo.c
//[?] getch() 함수: 콘솔 화면에서 문자 하나를 입력 + 에코(입력한 문자가 표시) 표시 없음
#include <stdio.h>
int main(void)
{
int grade;
printf("당신의 학점은? (A, B, C, D, F) _\b");
grade = getch();
printf("입력한 학점은 %c입니다.\n", grade);
return 0;
}
당신의 학점은? (A, B, C, D, F) _
입력한 학점은 A입니다.
21.20 getche() 함수로 콘솔에서 문자 하나 입력받기
getche()
함수는 getch()
함수와 동일한 기능을 구현하고 함수 이름 끝에 e
가 더 추가된 것처럼 콘솔 화면에서 입력받을 때 입력 받은 문자가 화면에 표시(echo
)가 되는 기능이 추가됩니다.
코드: GetcheDemo.c
//[?] getche() 함수: getch() 동일하게 콘솔 화면에서 문자 하나를 입력하나 Echo 기능이 추가됨
#include <stdio.h>
int main(void)
{
int grade;
printf("당신의 학점은? (A, B, C, D, F) _\b");
grade = getche();
printf("\n입력한 학점은 %c입니다.\n", grade);
return 0;
}
당신의 학점은? (A, B, C, D, F) A
입력한 학점은 A입니다.
21.21 putchar() 매크로를 사용하여 화면에 문자 하나 출력
putchar()
함수는 원칙적으로 putchar()
매크로입니다.
하지만, 크게 구분을 짓지 않아도 상관없습니다.
이 putchar()
함수는 표준 출력을 나타내는 stdout
키워드를 사용하여 현재 사용하고 있는 화면에 문자 하나를 출력합니다.
코드: PutcharMacro.c
//[?] putchar() 함수: 표준 출력(stdout)에 문자 하나를 출력
#include <stdio.h>
int main(void)
{
putchar('Z');
putchar('\n');
putchar(90);
return 0;
}
Z
Z
21.22 getchar() 매크로를 사용하여 문자 하나 입력 받기
getchar()
함수 또는 매크로는 표준 입력을 의미하는 stdin
으로부터 문자 하나를 입력 후 엔터 키를 입력하면 그 값을 받아올 수 있습니다.
현재 우리는 콘솔에서 프로그램을 실행하기에 표준 입력인 stdin
은 콘솔 화면을 나타냅니다.
코드: GetcharMacro.c
//[?] getchar() 함수: 표준 입력(stdin)에서 문자 하나를 입력
#include <stdio.h>
int main(void)
{
int anykey;
printf("키보드에서 아무키나 누르고 엔터치세요.\n");
anykey = getchar();
printf("입력한 값은 %c입니다.\n", anykey);
return 0;
}
키보드에서 아무키나 누르고 엔터치세요.
A
입력한 값은 A입니다.
getchar() 함수로 문자 하나 입력 받아 if 문으로 알파벳 문자 비교 판단
코드: alphabet.c
#include <stdio.h>
int main(void)
{
char c;
printf("알파벳 한 자를 입력하세요.\n");
c = getchar(); // 사용자로부터 문자 하나 입력
// if 문으로 알파벳 문자인지 확인
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
{
printf("%c는 알파벳 문자입니다.\n", c);
}
return 0;
}
알파벳 한 자를 입력하세요.
Z
Z는 알파벳 문자입니다.
21.23 문자 비교 관련 내장 함수들: <ctype.h> 헤더 파일
코드: ctype_demo.c
#include <stdio.h>
#include <ctype.h>
int main(void)
{
printf("%d\n", isalpha('1')); // 0
printf("%d\n", isalpha('A')); // 1
printf("%d\n", isupper('z')); // 0
printf("%d\n", isupper('Z')); // 1
printf("%d\n", islower('Z')); // 0
printf("%d\n", isspace('@')); // 0: 공백문자이면 0 이외의 값, 0
return 0;
}
0
1
0
1
0
0
21.23.1 문자를 대문자 또는 소문자로 변환하기
코드: toupper_tolower.c
#include <stdio.h>
#include <ctype.h>
int main(void)
{
printf("%c를 대문자로 변환: %c\n", 'a', toupper('a')); // 대문자로 변환
printf("%c를 소문자로 변환: %c\n", 'T', tolower('T')); // 소문자로 변환
return 0;
}
a를 대문자로 변환: A
T를 소문자로 변환: t
21.24 장 요약
C 언어에서 제공하는 API는 너무나도 많습니다.
이 강의를 통한 C 언어의 학습이 유용한 이유는 흩어져 있는 API를 학습 난이도에 맞게 순서를 정해서 단계별로 학습하게 도와주기 때문입니다.
자, 계속해서 수많은 API들을 학습해나가겠습니다.