Upload
raven-barker
View
49
Download
8
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
제 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 ( X )– #define MAX 100 * 200 * 300 ( 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.");
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.
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
%% '%' 자체를출력한다 .
printf()• 서식 지정 문자
– 출력의 모양을 결정
• %[flags][width][.prec][F|N|h|l]typeflags : '-', '+', ' ', '#' 등이 있으며 숫자에 음수기호나 주소를 표시하는 역할을 함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”);
[ 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]
#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]);
}
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);}