컴퓨터프로그래밍 Computer Programming
04 전처리와입출력
목차 1. 전처리 2. 출력함수 printf() 3. 입력함수 scanf() 3
1. 전처리
전처리개요 전처리기역할 컴파일 compile 전에전처리기 preprocessor 의전처리 preprocess 과정이필요 결과인전처리출력파일을만들어컴파일러에게보내는작업을수행 전처리지시자preprocess directives #include, #define 과같은전처리지시자는항상 # 으로시작 마지막에세미콜론 ; 이없는등일반 C 언어문장과는구별 조건지시자로 #if, #elif, #else, #endif, #ifdef, #ifndef, #undef 등 5
전처리지시자 #include 헤더파일 #include <stdio.h> #include, #define 등 자료형의재정의 typedef, 함수원형 prototype 정의등과같은문장이있는텍스트파일 대표적인헤더파일, 확장자 *.h stdio.h 헤더파일직접보기 6
전처리지시자 #include 7
전처리지시자 #define 매크로상수 전처리기 preprocessor 는소스에서정의된매크로상수를모두 #define 지시자에서정의된문자열로대체 (replace) #define identifier_name [value ] #define 에정의된 identifier_name 은전처리기에의해모두 value 로대체되어컴파일 #define 은정수, 실수또는문자열등의상수를 KPOP, PI, PRT 등의이름으로정의 PI 라는매크로상수 전처리과정에서모두 3.14 라는실수로값이바뀐소스로컴파일 단매크로상수는문자열내부또는주석부분에서는대체되지않음 8
전처리지시자 #define 9
Source Code #01: advancemacro.c #define 에서그활용도를높이기위한방안이함수와같이인자 parameter 를이용하는방법 10
인자를사용한매크로 11
인자를사용한매크로주의점 매크로를구성하는모든인자와외부에괄호를이용 12
인자를사용한매크로주의점 기호상수에서매크로이름과시작괄호사이에는공백이올수없음 13
Lab #01: 문자열출력을위한매크로정의 다음정보를이용하여매크로 myprint(x) 를정의해인자인문자열 x 를한행에출력하는프로그램작성 출력 전처리지시자 #define 으로인자가있는매크로 myprint(x) 를정의 매크로로출력하기 출력함수로출력하기 14
2. 출력함수 printf()
printf() 의인자 형식문자열과출력할목록으로구분 형식문자열에서 %d 와같이 % 로시작하는형식지정자순서대로서식화하여그위치에출력 16
함수 printf() 의첫번째인자인형식문자열 (format string) 일반문자와이스케이프문자 이스케이프문자는 \" 와 \ 같이 \ 로시작하는문자 형식지정자 format specification 로구성 %d 와 %s 와같이 % 로시작하는형식지정자 형식지정자 %d 위치에바로 20이라는정수가출력 이스케이프문자 \" 는문자 " 이그대로출력 17
함수 printf() 에서정수출력을위한형식지정자 정수의십진수출력을위한형식지정자는 %d와 %i 8진수로출력하려면 %o를이용 앞부분에숫자 0 이붙는출력을하려면 %#o 를이용 소문자의십육진수로출력하려면 %x 와대문자로출력하려면 %X 를이용 16 진수앞에 0x 또는 0X 를붙여출력하려면 # 을삽입하여 %#x 와 %#X 를이용 함수 printf() 반환값은출력한문자수이며, 오류가발생하면음수를반환 18
함수 printf() 에서정수출력을위한형식지정자 19
실수를위한출력 %f 실수의간단한출력을위한형식지정자는 %f 형식지정자 %f는실수를기본적으로 3.400000와같이소수점 6자리까지출력 함수 printf() 에서실수출력으로 %f와함께 %lf도사용 출력폭의지정 출력필드폭이출력내용의폭보다넓으면정렬은기본이오른쪽, 필요하면왼쪽으로지정 20
폭과정렬형식지정자 21
형식지정자정리 % 로시작하는형식지정자는 % 와서식문자 d 사이 %[flags][width].[precision]{h l}d 와같이여러종류의지정자가가능 정수를위한형식지정자 d 바로앞에 short 을의미하는 h 와 long 을의미하는 l, 그리고 long long 을의미하는 ll 이가능 실수를위한형식지정자 f 바로앞은 double 을의미하는 l 이가능하나, %f 와 %lf 는차이가없음 옵션 [flags] 로는정렬, 부호표시등을지정 옵션 [width].[precision] 으로출력부분의전체폭과소수점이하자릿수폭을지정 22
형식지정자정리 23
형식문자 type field characters 종류 24
옵션지정문자 flags 종류 25
Source Code #02: specification.c %[flags][width].[precision]{h l}d %[flags][width].[precision]o %[flags][width].[precision]x %[flags][width].[precision]f 26
정수의다양한출력 27
Source Code #03: stringprint.c 문자열형식지정자 %s 와인자로기술 %[ 전체폭 ].[ 출력문자수 ]s 28
문자열의다양한출력 29
Lab #02: 정수와실수, 문자와문자열의출력 개인의성별과이름, 나이, 성적등개인정보출력프로그램 결과 자료형 int 형인나이와 double 형성적평균평점등을출력 성별, 나이, 몸무게, 평균평점을다음과같이출력 성별 : M 이름 : 홍길동 나이 : 30 몸무게 : 92.489 평균평점 (GPA): 4.210 30
3. 입력함수 scanf()
함수 scanf() 대표적인입력함수이고 %s 와 %d 같은동일한형식지정자를사용 scan 이라는단어는스캐너와같이어떠한자료를훑어복사하거나, 유심히살펴본다는의미 표준입력으로부터여러종류의자료값을훑어주소연산자 & 가붙은변수목록에저장 첫번째인자는형식문자열format string 형식지정자 format specification 는 %d, %c, %lf, %f 와같이 % 로시작 두번째인자부터는키보드입력값이복사저장되는입력변수목록 변수이름앞에반드시주소연산자 & 를붙여나열 반환유형은 int 로 표준입력으로변수에저장된입력개수를반환, 다음문장의반환값은 3 scanf("%d", &year) 주소연산식인 &year 로사용 year 로기술하면입력값이저장될주소를찾지못해오류가발생 32
함수 scanf() 33
Source Code #04: scanf.c 지정된형식지정자에맞게키보드로적당한값을입력한후 [Enter] 키를누르기전까지는실행을멈춰사용자의입력을기다림 만일년, 월, 일을 2018-6-29 과같이중간에 를넣어입력받으려면함수 scanf("%d - %d - %d", ) 처럼형식문자열에입력형식을명시 여러입력값을구분해주는구분자 separator -, /, 콤마 (,) 등을사용할수있는데, 입력된구분자는형식만체크하고저장하지않음 34
정수입력 지정된형식지정자에맞게키보드로적당한값을입력한후 [Enter] 키를누르기전까지는실행을멈춰사용자의입력을기다림 35
정수입력 만일년, 월, 일을 2017-4-29 과같이중간에 를넣어입력받으려면함수 scanf("%d - %d - %d", ) 처럼형식문자열에입력형식을명시 여러입력값을구분해주는구분자 separator -, /, 콤마 (,) 등을사용할수있는데, 입력된구분자는형식만체크하고저장하지않음 36
제어문자 %f 와 %lf, %c 입력자료를실수 float 형변수에저장 : 형식지정자 %f 를사용 실수 double 형변수에저장 : 형식지정자 %lf 를사용 입력자료를문자 char형변수에저장 : 제어문자 %c를사용 출력 printf() 에서실수의출력을위한형식지정자 %f 와 %lf 를모두사용가능 37
버퍼 buffer 함수 scanf() 는입력에임시저장장소 [Enter] 키가원하지않는문자변수에저장되어원래의도한문자는입력에성공못하는일이발생 버퍼 입력과출력과같은자료의흐름에서바로처리하지않고중간에임시로사용하는저장공간 입력이나출력을바로수행하지않고버퍼에저장하다가버퍼가모두차거나특정한명령에의해버퍼에있는내용을입력또는출력 38
Source Code #05: floatcharscan.c 39
실수와문자입력 두번의 scanf() 호출로, 콘솔에서실수 234.5 하나를입력한후 [Enter] 키를누르고다음줄에문자 A 를입력하여변수 ch 에저장 입력버퍼에는 [Enter] 키가남아있어, 두번째 scanf() 에서 char 형변수 ch 에는순서대로 [Enter] 인문자 \n 가저장되고, 실제문자 A 는저장되지않는문제가발생 이러한문제를해결하는방법은두가지 첫번째는버퍼에남아있는 [Enter] 키를함수 fflush(stdin) 를호출하여없애버리는방법 두번째는문자를입력받는형식지정자 %c 앞에 " 공백문자를넣어 " 형식문자열을 " %c" 로지정 아직입력버퍼에남아있는 [Enter] 키가 %c 앞에공백문자로인식되어무시되고, 이어커서위치에입력되는 A 가변수 ch 에저장 40
실수와문자입력 41
Source Code #06: radixscan.c 42
다양한형식지정자 함수 scanf() 에서정수의콘솔입력값 8진수로인지하려면 %0를사용 %x는 16진수로인지 다음은함수 scanf() 에서이용되는다양한형식지정자 43
함수 scanf() 의형식지정자 44
Source Code #07: putchar.c 45
함수 getchar() 와 putchar() 문자의입출력함수 함수 getchar() 는영문 get character 의의미로문자하나를입력하는매크로함수 putchar() 는 put character 로반대로출력하기위한매크로함수 이함수를이용하려면헤더파일 stdio.h 가필요 함수 getchar() 는인자없이함수를호출 입력된문자값을자료형 char나정수형으로선언된변수에저장 char a = getchar(); 함수호출 putchar( a ) 인자인 a 를출력하는함수로사용 46
함수 getchar() 와 putchar() 47
Lab #03: 십진수, 팔진수, 십육진수인세정수를입력받아적절히출력 십진수, 팔진수, 십육진수인세정수를입력받아다음조건을만족하도록적절히출력되는프로그램 세정수를 십진수 팔진수 십육진수 의형식으로입력 입력과출력 세개의정수를각각다음과같이입력하세요. 십진수 - 팔진수 - 십육진수 100-65 - f3 입력한수는다음과같습니다. 100-65 - f3 100-53 - 243 48
49