25
제 3 제 제제제제제 제제제 제제

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

Embed Size (px)

DESCRIPTION

제 3 장 전처리기와 입출력 함수. 전처리기 개요. 전처리기의 유래 pre-processor 에 의해서 생긴 말 pre( 전 - 앞 ), processor( 처리기 ) 컴파일러 앞에서 먼저 처리함 전처리기가 처리하는 내용 전처리 지시자를 처리 (# 으로 시작 ) #define , #include, #ifdef, #else, #endif, #ifndef, #if, #elif, #line, #error, #pragma 함수를 처리 - PowerPoint PPT Presentation

Citation preview

Page 1: 제  3  장 전처리기와 입출력 함수

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

Page 2: 제  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. 주석 제거

Page 3: 제  3  장 전처리기와 입출력 함수

• 전처리 지시자의 종류

– #define – #include– #ifdef ~ #endif– #if defind(XXX) ~ #endif– #if !defined(XXX) ~ #endif– #undef

Page 4: 제  3  장 전처리기와 입출력 함수

#include• ‘ 이러 이러한 파일을 포함시켜라’의 의미를

가짐

• 예 제1. #include <stdio.h>

- 시스템 디렉토리에서 찾음

2. #include “my_header.h”- 현재의 디렉토리에서 찾음

Page 5: 제  3  장 전처리기와 입출력 함수

#define• #define

– #include 에 비해서 주의 사항이 많음– ‘ 이러한 것을 다음부터 이렇게 사용하겠다’는 의미를 가짐– #define 에서 정의한 모든 것들은 전처리기가 지정한 문자열로

치환함

• 예제 1. #define SIZE 1024

– 1024 라는 수치 대신에 SIZE 라는 문자열을 사용하겠다는 의미

2. #define PIE 3.141592– 3.141592 라는 수치 대신에 PIE 라는 문자열을 사용하겠다는

의미

Page 6: 제  3  장 전처리기와 입출력 함수

매크로 변수 정의• #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

Page 7: 제  3  장 전처리기와 입출력 함수

주의사항• 여러 라인에 걸쳐서 매크로를 정의할 수 없음

– #define MAX 100 *200 *300

• 매크로 변수에 공백을 삽입할 수 없음– #define M AX 100 * 200 * 300 ( X )– #define MAX 100 * 200 * 300 ( O )

Page 8: 제  3  장 전처리기와 입출력 함수

매크로 함수 개념•#define ADD(x, y) x + y

#define : 매크로 지시자ADD : 매크로 함수 명 ( 중간에 공백이 있으면 안됨 )(x, y) : 매크로 함수 인자x + y : 매크로 몸체

•예제1.define MAX(x, y) (x > y) ? x : y

Page 9: 제  3  장 전처리기와 입출력 함수

매크로 함수의 위험성• 우선 순위에 의한 위험성 (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));

Page 10: 제  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)));

Page 11: 제  3  장 전처리기와 입출력 함수

전처리 지시자• #ifdef … #endif

– 조건부 컴파일 지시자– 매크로 변수 정의 여부에 따라서 컴파일이 수행되거나 수행되지 않도록

함– 조건적으로 컴파일 되기 때문에 범위가 필요함 (#endif 로 처리 )

• 예제#ifdef DEBUG…( 프로그래머가 작성한 프로그램 )…#endif

• DEBUG 가 매크로 정의되어 있다면 #endif 까지 컴파일 되며 매크로 정의되어 있지 않다면 컴파일되지 않음

Page 12: 제  3  장 전처리기와 입출력 함수

입출력 함수의 개요• printf()/scanf()

• 키보드 입력 및 출력 함수• 파일 입력 및 출력 함수• 입출력은 파일 , 키보드 , 화면 , 테이프

드라이브 등을 뜻함– 화면 입출력만 뜻하지 않음 ( 화면 입출력은

‘표준 입출력함수’라고 함 )

Page 13: 제  3  장 전처리기와 입출력 함수

printf()• printf() 란 ?

– printf: print 와 formatted 의 합성어– 표준 입출력 함수– 문자 , 숫자 , 문자열 , 부동형 숫자 등 다양하게 출력 가능– 자동 개행을 해 주지 않음

• 자동개행함수 :puts()

• printf() – 형식– printf(" 서식 문자열 ", 인자 1, 인자 2, 인자 3 …);

• 서식 문자열은 항상 큰 따옴표를 사용함• 서식 문자열에 따라서 인자가 있을 수도 있고 없을 수도 있음• 서식 문자열 안에 변환형식문자가 존재하면 인자와 1:1 대응

printf(“ %d %f %s\n” , 756, 77.89, “ archie” );

Page 14: 제  3  장 전처리기와 입출력 함수

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.");

6. I’m archie. You are a girl.7. I’m archie. You are a girl.8. I'm archie.

You are a girl.4. I’m archie.

You are a girl.5. I’m archie. You are a girl.

Page 15: 제  3  장 전처리기와 입출력 함수

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.000000printf("%f", 0.5); // 0.500000

float, double

%% '%' 자체를출력한다 .

Page 16: 제  3  장 전처리기와 입출력 함수

printf()• 서식 지정 문자

– 출력의 모양을 결정

• %[flags][width][.prec][F|N|h|l]typeflags : '-', '+', ' ', '#' 등이 있으며 숫자에 음수기호나 주소를 표시하는 역할을 함width : 출력의 폭을 지정prec : 출력되는 값의 정밀도를 지정함 . 부동형에서 주로 많이 사용F, N, h, l: 입력 크기 지정자type : 변환형식문자를 지정

Page 17: 제  3  장 전처리기와 입출력 함수

printf()• flags - : 문자와 숫자가 모두 왼쪽 맞춤 . 숫자보다도 문자열 출력에 많이 쓰임

• flags + : 문자나 문자열인 경우는 사용할 일이 없으며 주로 숫자에서 부호를 같이 출력하고 싶을 때 사용

• flags # : 10 진수보다는 16 진수를 출력할 때 많이 사용하며 특히 포인터 ( 주소 ) 를 출력하기 위하여 사용됨 . 출력되는 값이 주소라는 것을 명시하기 위하여 0x 를 추가하는 경우가 많은데 이때 # 을 추가하여 0x 를 대신함

• width : 출력의 폭을 지정하는데 , 출력되는 값보다 크게 잡으면 나머지는 공백으로 채워짐 .

• prec : 소수점 이하의 정밀도를 지정할 때 사용함 . 지정하지 않으면 소수점 이하 6 자리까지 출력하며 ‘ .f’ 를 사용하면 소수점 이하는 잘려나감 .

Page 18: 제  3  장 전처리기와 입출력 함수

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”);

[ 538][ 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]

Page 19: 제  3  장 전처리기와 입출력 함수

#include <stdio.h>

main(){

char *name[] = {“UNIX”, “Linux”, “Windows”};int 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]);

}

Page 20: 제  3  장 전처리기와 입출력 함수

scanf()

• 표준 입력 함수

• scan 과 formatted 의 합성어

• 문자열 입력은 자제하는 것이 좋음– 문자열 입력은 논리 에러를 유발하거나

사용법에 상당한 제약을 가져옴– 문자열 입력은 fgets() 사용하는 것이 좋음

Page 21: 제  3  장 전처리기와 입출력 함수

scanf()

#include <stdio.h>

main(){

int age;

printf("당신의 나이는 ? ");scanf("%d", &age);

printf("당신이 살아온 날은 %d일 입니다.", age * 365);}

Page 22: 제  3  장 전처리기와 입출력 함수

scanf()

• 주의사항1.숫자 ( 정수 , 부동형 상수 ) 를 입력 받을 때 '&' 기호를 잊지 말아야 함2.문자 하나를 입력 받을 때에도 '&' 기호를 사용해야 함3.문자열을 입력 받는데 사용하지 말아야 함

Page 23: 제  3  장 전처리기와 입출력 함수

scanf()

#include <stdio.h>

main(){

int imsi;

printf("당신의 나이는? ");scanf("%d", imsi);

printf("당신이 살아온 날은 %d이다.\n", imsi);}

숫자 ( 정수 , 부동형 상수 ) 를 입력 받을 때 '&' 기호를 잊지 말아야 함

Page 24: 제  3  장 전처리기와 입출력 함수

scanf()

#include <stdio.h>

main(){

char one, two;

printf("두 문자를 입력하시오.");scanf("%c%c", &one, &two);

printf("%c %c\n", one, two);}

문자 하나를 입력 받을 때에도 '&' 기호를 사용해야 함

Page 25: 제  3  장 전처리기와 입출력 함수

scanf()

문자열을 입력 받는데 사용하지 말아야 함

#include <stdio.h>

main(){

char name[512];

printf("이름을 입력하시오. ");scanf("%s", name);

puts(name);}