-
[C] 전처리와 입출력C 2023. 3. 17. 16:35
01 전처리
전처리기의 역할
- 컴파일(compile) 전, 전처리기(preprocessor)의 전처리(preprocess) 과정이 필요
- 컴파일 이전에 하는 작업, 처리 이후 전처리기가 생성한 소스를 컴파일
- 전처리 지시자인 #include로 헤더파일을 삽입
- #define에 의해 정의된 상수를 대체시키는 등
- 전처리 결과인 전처리 출력 파일을 만들어 컴파일러에게 보내느 작업을 수행
전처리 지시자(preprocess directives)
- 전처리 과정에서 처리되는 문장
- #include <헤더파일>
- 대표적인 헤더파일 stdio.h
- printf(), scanf(), putchar(), getchar() 등과 같은 입출력 함수의 정보가 정의
- 대표적인 헤더파일 stdio.h
전처리 지시자 #include와 헤더 파일
헤더파일 파일 이름 파일 내용 stdio.h STanDard Input Output(표준 입출력) 표준 입출력 함수와 상수 stdlib.h STanDard LIBrary(표준함수 주요 메모리 할당 함수와 상수 math.h math 수학 관련 함수와 상수 string.h string 문자열 관련 함수와 상수 time.h time 시간 관련 함수와 상수 ctype.h Character type 문자 관련 함수와 상수 limits.h limits 정수 상수 등 여러 상수 float.h float 부동소수에 관련된 각종 상수 전처리 지시자 #define
- 매크로 상수(macro constant)
- 전처리 지시자 #define은 매크로 상수를 정의하는 지시자
- #define에 의한 심볼릭 상수는 주로 대문자 이름으로 정의
- 전처리기(preprocessor)는 소스에서 정의된 매크로 상수를 모두 #define 지시자에서 정의된 문자열로 대체(replace)
#include <stdio.h> #define PI 3.14 int main(void) { double radius = 2.83; printf("원 면적: %f\n", radius * radius * PI); // PI가 3.14로 대체 printf("원 둘레: %f", 2 * radius * PI); // PI가 3.14로 대체 return 0; }
# output 원 면적: 25.147946 원 둘레: 17.772400
출력함수 printf()
- 함수 printf()
- 일련이 문자 및 값으로 서식을 지정하여 표준 출력인 명령 프롬프트 콘솔(console)에 다양한 변수와 상수를 출력하는 함수
- 첫 번째 인자인 형식문자열(format string)
- 일반문자와 이스케이프 문자 그리고 형식지정자(format specification)로 구성
- %d와 %s와 같이 %로 시작하는 형식지정자는 출력하려는 값의 위치에 배치
- 일반문자와 이스케이프 문자 그리고 형식지정자(format specification)로 구성
출력함수 printf() 다양한 형식지정자
- 형식지정자는 출력 내용의 자료형에 따라 %d, %i, %c, %s와 같이 %로 시작
- 형식지정자는 형식에 맞게 콘솔로 출력할 값이 표시
- 형식지정자는 출력 값의 목록과 순서대로 서로 일치해야 함
printf("%d %i %f %s", 3, 16, 3.4, "hello");
- 형식지정자 종류
형식지정자 출력 양식 %d %i %lld 정수 출력, 특히 %lld는 long long 자료형 출력에 사용 %f %lf 실수 출력 %c %C 문자 출력 %s 문자열 출력 형식지정자의 출력 폭 지정
- 출력 값의 가로 길이인 폭(width)도 지정이 가능
- %10d와 같이 %와 d 사이에 폭 길이인 10을 기술
- 정렬은 기본적으로 오른쪽
- 출력 폭을 잘 못 지정하여 출력 내용보다 좁으면 폭을 무시하고 원래대로 출력
printf에서의 다양한 형식 지정자
printf()에서 실수는 %f와 %lf 모두 사용 가능 #include <stdio.h> int main(void) { double width = 3.424, height = 2.718; int shape = 3; // 삼각형 또는 사각형 printf("가로: %f, 세로: %lf\n", width, height); printf("%d각형 면적: %8.2f\n", shape, (width * height) / 2); printf("%d각형 면적: %10.4f", shape+1, width * height); return 0; }
가로: 3.424000, 세로: 2.718000 3각형 면적: 4.65 4각형 면적: 9.3064
정수의 8진수 16진수 출력
- %o와 %x를 사용
- 020과 0x1a처럼 0과 0x 등을 표기하려면
- #을 중간에 삽입해 %#o와 %#x을 사용
#include <stdio.h> int main(void) { printf("%3o %3d %3x\n", 10, 10, 10); printf("%#3o %3d %#3x\n", 10, 10, 10); printf("%3o %3d %3X\n", 10, 10, 10); return 0; }
12 10 a 012 10 0xa 12 10 A
형식문자(type field characters) 종류
서식문자 자료형 출력양식 c char, int 문자 출력 d, i int 부호 있는 정수 출력으로, ld는 long int, long long int형 출력 o unsigned int 부호 없는 8진수로 출력 x, X unsigned int 부호 없는 16진수로 출력
x는 3ff와 같이 소문자 16진수로, X는 3FF와 같이 대문자로 출력, 기본으로 앞에 0이나 0x, 0X는 표시되지 않으나 #이 앞에 나오면 출력u unsigned int 부호 없는 10진수(unsigned decimal interger)로 출력 e, E double 기본적으로 m.ddddddExxx의 지수 형식 출력(정수 1자리와 소수점 이하 6자리, 지수승 3자리) 즉 123456.789이라면 1.234568e+005로 출력 f, lf double 소수 형식 출력으로 m.123456 처럼 기본으로 소수점 6자리가 출력되며 정밀도에 의해 지정 가능, lf는 long double 출력 g, G double 주어진 지수 형식의 실수를 e(E) 형식과 f 형식 중에서 짧은 형태(지수가 주어진 정밀도 이상이거나 -4보다 작으면 e나 E를 사용하고, 아니면 f를 사용)로 출력, G를 사용하면 E가 대문자로 출력 s char * 문자열에서 '\o'가 나올 때가지 출력되거나 정밀도에 의해 주어진 문자 수만큼 출력 p void * 주소 값을 16진수 형태로 출력 % 문자 % %를 출력 옵션지정 문자(flags) 종류
문자 기본(없으면) 의미 예외 설명 - 우측정렬 수는 지정된 폭에서 좌측정렬 %-10d + 음수일 때만 - 표시 결과가 부호가 있는 수이면 부호 +, - 를 표시 %+10d 0 0을 안 채움 우측정렬인 경우, 폭이 남으면 수 앞을 모두 0으로 채움 %010x
%-0 처럼 좌측정렬과 0 채움은 함께 기술해도 의미가 없음# 리딩 문자 0, 0x, 0X가 없음 서식 문자가 o(서식문자 octal 상세 출력 폭과 정렬 방법
- 정렬
- 기본이 오른쪽
- 폭 앞에 -를 붙여 %-8d로 지정하면 왼쪽으로 지정
- 부동소수에서 소수점 이하 자리수를 지정
- %[전체폭].[소수점이하폭]f와 같이 표시
- 형식지정자 %8d는 10진수를 8자리 폭에 출력한다. 지정한 출력 폭이 출력할 내용보다 넓으면 정렬은 기본적으로 오른쪽이다. 다음은 정수 7629를 %8d로 출력한 모습이다.
7 6 2 9 printf("%8d", 7629);
- 출력 폭을 지정하며 정렬을 왼쪽으로 지정하려면 %-8d처럼 폭 앞에 -를 삽입한다.
7 6 2 9 printf("%-8d", 7629);
- 형식지정자가 %10.3f이면 소수점을 포함하여 전체 폭은 10, 그 중에서 3은 소수점 이하 자리수로 출력하며, 다음은 정수 32.369를 %10.3f로 출력한 모습으로, 소수점도 전체 폭 10에 해당한다.
3 2 . 3 6 9 printf("%10.3f", 32.369);
- 또한 %10f는 전체 폭은 10이고 소수점 이하 자릿수는 기본으로 6자리수로 출력한다.
3 2 . 3 6 9 0 0 0 printf("%10f", 32.369);
#include <stdio.h> int main(void) { printf("%4d\n", 3); printf("%04d\n", 3); printf("%+04d\n", 3); printf("%+-4d\n\n", 3); printf("%#5o\n", 3); printf("%#5x\n", 3); printf("%#5X", 3); return 0; }
3 0003 +003 +3 03 0x3 0X3
문자열 출력에서의 출력폭 지정
- %[-][전체폭].[출력할 문자수]s
- 형식지정자 %10.3s는 전체폭이 10, 출력할 문자 수는 3개이므로 Hel까지 출력되며, 우측정렬이 기본이다.
H e l printf("%10.3s", Hello!);
- 만약 좌측정렬을 하려면 %-10.3를 하면 된다.
H e l printf("%-10.3s", Hello!);
- 형식지정자에서 주의할 것은 지정한 전체폭이 출력할 문자열의 수보다 작으면 무시하고, 원래 문자열의 폭만큼 모두 출력한다는 것이다.
H e l l o ! printf("%4s", Hello!);
- 또한 형식지정자의 전체폭과 정밀도는 형식지정자에 *를 이용한 후, 그에 대응하는 정수를 목록 값으로 지정할 수 있다. 다음은 *이 5으로 대체되어 %10.5s로 문자열 "Hello"를 출력한다.
H e l l o printf("%10.*s", 5, Hello!);
입력함수 scanf()
- 대표적인 입력 함수
- %d와 %c, %lf 등의 형식 지정자를 사용
- 반드시 변수 앞에 주소를 의미하는 &을 붙여 '&변수이름'으로 사용
- 입력 값이 저장되는 변수의 주소 위치를 찾는다는 의미
실수와 다양한 자료형의 입력
- 제어문자 %f와 %lf, %c
- printf()에서 실수의 출력을 위한 형식 지정자로 %f와 %lf를 모두 사용
- 입력 scanf()
- 저장될 자료형이 float이면 %f
- double이면 %lf로 구분해 사용
다양한 형식지정자
- 함수 scanf()에서 정수의 콘솔 입력 값을 8진수로 인지하려면
- %o를 사용
- %x는 16진수로 인지
문자 입력과 출력 함수 getchar()와 putchar()
- 함수 getchar()
- 문자 하나를 입력하는 함수
- 함수 putchar()
- 문자를 출력하기 위한 함수
- 헤더파일 stdio.h가 필요
'C' 카테고리의 다른 글
[c] 조건 (0) 2023.03.29 [C] 연산자① (1) 2023.03.22 [C] QUIZ (0) 2023.03.15 [C] C 프로그래밍 첫걸음 (4) 2023.03.08 [C] 자료형과 변수 (0) 2023.03.01