제 3 장 전처리기및 입출력함수

Download Report

Transcript 제 3 장 전처리기및 입출력함수

제 3 장 전처리기와 입출력 함
수
전처리기 개요
• 전처리기의 유래
– pre-processor에 의해서 생긴 말
– pre(전-앞), processor(처리기)
• 컴파일러 앞에서 먼저 처리함
• 전처리기가 처리하는 내용
1. 전처리 지시자를 처리 (#으로 시작)
#define , #include, #ifdef, #else, #endif, #ifndef, #if, #elif,
#line, #error, #pragma
2. 함수를 처리
sqrt(), atan(), atan2(), exit(), atexit(), memcpy(), memmove(),
va_start(), va_arg() …
3. 주석 제거
• 전처리 지시자의 종류
–
–
–
–
–
–
#define
#include
#ifdef ~ #endif
#if defind(XXX) ~ #endif
#if !defined(XXX) ~ #endif
#undef
#include
• ‘이러 이러한 파일을 포함시켜라’의 의미
를 가짐
• 예제
1. #include <stdio.h>
-시스템 디렉토리에서 찾음
2. #include “my_header.h”
-현재의 디렉토리에서 찾음
#define
• #define
– #include에 비해서 주의 사항이 많음
– ‘이러한 것을 다음부터 이렇게 사용하겠다’는 의미를 가짐
– #define에서 정의한 모든 것들은 전처리기가 지정한 문자열로
치환함
• 예제
1. #define SIZE 1024
– 1024라는 수치 대신에 SIZE라는 문자열을 사용하겠다는 의미
2. #define PIE 3.141592
– 3.141592라는 수치 대신에 PIE라는 문자열을 사용하겠다는 의
미
매크로 변수 정의
•
•
•
•
•
#define YEAR 2007
#define TIME 60
#define MIN 60
#define TIME_VLUE TIME * MIN
#define PRINT printf(“%d\n”,
TIME_VALUE)
• #define PI 3.141519
• #define TRUE 1
주의사항
• 여러 라인에 걸쳐서 매크로를 정의할 수 없음
– #define MAX 100 *
200 *
300
• 매크로 변수에 공백을 삽입할 수 없음
– #define M AX 100 * 200 * 300
– #define MAX 100 * 200 * 300
(X)
(O)
매크로 함수 개념
• #define ADD(x, y) x + y
#define
ADD
(x, y)
x+y
:
:
:
:
매크로
매크로
매크로
매크로
지시자
함수 명 (중간에 공백이 있으면 안됨)
함수 인자
몸체
• 예제
1.define MAX(x, y) (x > y) ? x : y
매크로 함수의 위험성
• 우선 순위에 의한 위험성 (1/2)
• 예제
#define MUL(x, y) x * y
1. printf(“%d\n”, MUL(4, 6));
2. printf(“%d\n”, MUL(2+2, 3+3));
– 1번의 결과: 24
– 2번의 결과: 24가 아님. 2번은 다음과 같이 전개되어 결과값이 14가 됨
– printf(“%d\n”, 2 + 2 * 3 + 6);
• 해결 방법 (괄호 사용)
#define MUL(x, y) (x) * (y)
printf(“%d\n”, MUL(2+2, 3+3));
 printf(“%d\n”, (2 + 2) * (3 + 3));
매크로 함수의 위험성
• 우선 순위에 의한 위험성 (2/2)
• 예제
#define MUL(x, y) (x) * (y)
1. printf(“%d\n”, 300 / MUL(10, 10));
– printf(“%d\n”, 300 / (10) * (10));
• 해결 방법 (전체 괄호 사용)
– #define MUL(x, y) ((x) * (y))
– printf(“%d\n”, 300 / MUL(10, 10));
 printf(“%d\n”, 300 / ((10) * (10)));
전처리 지시자
• #ifdef … #endif
– 조건부 컴파일 지시자
– 매크로 변수 정의 여부에 따라서 컴파일이 수행되거나 수행되지 않도록
함
– 조건적으로 컴파일 되기 때문에 범위가 필요함 (#endif로 처리)
• 예제
#ifdef DEBUG
…
(프로그래머가 작성한 프로그램)
…
#endif
• DEBUG가 매크로 정의되어 있다면 #endif까지 컴파일 되며 매크로 정의되
어 있지 않다면 컴파일되지 않음
입출력 함수의 개요
• printf()/scanf()
• 키보드 입력 및 출력 함수
• 파일 입력 및 출력 함수
• 입출력은 파일, 키보드, 화면, 테이프 드라
이브 등을 뜻함
– 화면 입출력만 뜻하지 않음 (화면 입출력은
‘표준 입출력함수’라고 함)
printf()
•
printf() 란?
–
–
–
–
printf: print와 formatted의 합성어
표준 입출력 함수
문자, 숫자, 문자열, 부동형 숫자 등 다양하게 출력 가능
자동 개행을 해 주지 않음
• 자동개행함수:puts()
•
printf() – 형식
– printf("서식 문자열", 인자1, 인자2, 인자3 …);
• 서식 문자열은 항상 큰 따옴표를 사용함
• 서식 문자열에 따라서 인자가 있을 수도 있고 없을 수도 있음
• 서식 문자열 안에 변환형식문자가 존재하면 인자와 1:1 대응
printf(“%d %f %s\n”, 756, 77.89, “archie”);
printf()
•
printf() – 변환형식문자가 없는 경우
1. printf("I'm archie.");
printf("You are a girl.");
2. printf("I'm archie. You are a girl.");
3. printf("I'm archie.\nYou are a girl.");
4. printf("I'm archie.\n\n\nYou are a girl.");
5. printf("I'm archie.\tYou are a girl.");
1. I’m archie. You are a girl.
2. I’m archie. You are a girl.
3. I'm archie.
You are a girl.
4. I’m archie.
You are a girl.
5. I’m archie. You are a girl.
printf()
• 변환 형식 문자
변환형식문자
변환형식 내용
출력 하고자 하는 데이터 형
%d
인자의 값을 10진수로 출력한다.
printf("%d", 100);
// 100 출력
int
%c
인자의 값을 참조하여 문자 하나를 출력한다.
printf("%c", 'y');
// ‘y’문자 출력
printf("%c", imsi);
// ASCII 문자출력
char
%s
널 문자를 만날 때까지 인자의 값을 출력한다.
printf("%s", "imarchie");
printf("%s", imsi);
// imsi가 가리키는
// 문자열 출력
문자열 포인 변수, 문자열 상수
%x, %X
인자의 값을 16진수로 출력한다.
printf("%x", 100);
// 64 출력
%f
%f
인자의 값을 부동형으로 출력한다.
printf("%f", 100);
// 100.000000
printf("%f", 0.5);
// 0.500000
float, double
%%
'%' 자체를 출력한다.
printf()
• 서식 지정 문자
– 출력의 모양을 결정
• %[flags][width][.prec][F|N|h|l]type
flags : '-', '+', ' ', '#' 등이 있으며 숫자에 음수기
호나 주소를 표시하는 역할을 함
width : 출력의 폭을 지정
prec : 출력되는 값의 정밀도를 지정함. 부동형에서
주로 많이 사용
F, N, h, l: 입력 크기 지정자
type
: 변환형식문자를 지정
printf()
•
flags - :문자와 숫자가 모두 왼쪽 맞춤. 숫자보다도 문자열 출력에 많이 쓰
임
•
flags + : 문자나 문자열인 경우는 사용할 일이 없으며 주로 숫자에서 부호
를 같이 출력하고 싶을 때 사용
•
flags # : 10진수보다는 16진수를 출력할 때 많이 사용하며 특히 포인터(주
소)를 출력하기 위하여 사용됨. 출력되는 값이 주소라는 것을 명시하기 위
하여 0x를 추가하는 경우가 많은데 이때 #을 추가하여 0x를 대신함
•
width : 출력의 폭을 지정하는데, 출력되는 값보다 크게 잡으면 나머지는 공
백으로 채워짐.
•
prec :소수점 이하의 정밀도를 지정할 때 사용함. 지정하지 않으면 소수점
이하 6자리까지 출력하며 ‘.f’를 사용하면 소수점 이하는 잘려나감.
printf()
범위 및
정밀도
내용
flags
예
제
출력 결과
-
printf("[%d]", 538);
printf("[%10d]", 538);
printf("[%-10d]", 538);
printf("[%10s]", “archie”);
printf("[%-10s]", “archie”);
[538]
[
538]
[538
]
[ archie]
[archie ]
+
printf("[%d]", 538);
printf("[%10d]", 538);
printf("[%-10d]", 538);
printf("[%+10d]", 538);
printf("[%+10d]", -538);
[538]
[
538]
[538
]
[
+538]
[
-538]
#
printf("[%#d]\n", 538);
printf("[%#x]\n", 538);
printf("[%#x]\n", &imsi);
[538]
[0x21a]
[0xffbffbdc]
width
n
printf("[%10d]", 538);
printf("[%10s]", “archie”);
[
[
prec
.n
printf("[%f]\n", 538.235);
printf("[%.f]\n", 538.235);
printf("[%10.1f]\n", 538.235);
printf("[%0.2f]\n", 538.235);
printf("[%.1f]\n", 538.235);
printf("[%.2f]\n", 538.235);
[538.235000]
[538]
[
538.2]
[538.24]
[538.2]
[538.24]
538]
archie]
#include <stdio.h>
main()
{
char
int
*name[] = {“UNIX”, “Linux”, “Windows”};
grade[3] = {68, 46, 77};
printf(“%s %s %s\n”, name[0], name[1], name[2]);
printf(“%d %d %d\n”, grade[0], grade[1], grade[2]);
puts(“”);
printf(“%10s %10s %10s\n”, name[0], name[1], name[2]);
printf(“%10d %10d %10d\n”, grade[0], grade[1], grade[2]);
}
scanf()
• 표준 입력 함수
• scan과 formatted의 합성어
• 문자열 입력은 자제하는 것이 좋음
– 문자열 입력은 논리 에러를 유발하거나 사용
법에 상당한 제약을 가져옴
– 문자열 입력은 fgets() 사용하는 것이 좋음
scanf()
#include <stdio.h>
main()
{
int
age;
printf("당신의 나이는 ? ");
scanf("%d", &age);
printf("당신이 살아온 날은 %d일 입니다.", age * 365);
}
scanf()
• 주의사항
1.숫자(정수, 부동형 상수)를 입력 받을 때 '&' 기
호를 잊지 말아야 함
2.문자 하나를 입력 받을 때에도 '&' 기호를 사용해
야함
3.문자열을 입력 받는데 사용하지 말아야 함
scanf()
숫자(정수, 부동형 상수)를 입력 받을 때 '&' 기호를 잊지 말아야 함
#include <stdio.h>
main()
{
int
imsi;
printf("당신의 나이는? ");
scanf("%d", imsi);
printf("당신이 살아온 날은 %d이다.\n", imsi);
}
scanf()
문자 하나를 입력 받을 때에도 '&' 기호를 사용해야 함
#include <stdio.h>
main()
{
char
one, two;
printf("두 문자를 입력하시오.");
scanf("%c%c", &one, &two);
printf("%c %c\n", one, two);
}
scanf()
문자열을 입력 받는데 사용하지 말아야 함
#include <stdio.h>
main()
{
char
name[512];
printf("이름을 입력하시오. ");
scanf("%s", name);
puts(name);
}