Chapter 3. 자료의 입출력
1. 스트림과 자료전송
- 스트림
· 연속된 데이터 바이트의 흐름
· 표준 스트림
◦ stdin : 표준 입력 스트림으로 입력장치로는 키보드가 있다.
◦ stdout : 표준 출력 스트림으로 출력장치로는 모니터가 있다.
◦ stderr : 표준 에러 스트림으로 출력장치로는 모니터가 있다.
- 버퍼
· 임시기억장소(임시저장공간)
· 입력버퍼 : stdin
· 출력버퍼 : stdout
· 변수가 아닌 일시적으로 저장될 데이터들은 버퍼에 저장된다.
· 입출력 데이터는 한 번에 하나씩 전송 되는 것이 아니라 버퍼에 저장되었다가 일정 순간에 입출력 된다.
· 버퍼는 임시저장장소로 데이터를 비우기 위해서는 fflush명령어를 써줘야한다.
◦ fflush(stdout); : 출력버퍼를 비워주는 함수
◦ fflush(stdin); : 입력버퍼 비워주는 함수
2. 출력 함수와 입력함수
- 출력함수와 입력함수를 사용하기 위해서는 stdio.h(standard input output stream)라는 표준 입출력 스트림을 소스 파일내에 포함해야한다.
- 그렇기 때문에 C언어로 프로그램을 만들때는 #include<stdio.h>를 써줘 stdio.h를 포함해줘야 한다.
- printf
int printf(const char *format [, argument]...); 형식문자열 구조 %[flags] [width] [.precision ] [{h | l | L}]type |
· 문자열(const char *format)을 출력장치에 출력해주는 함수
· 출력하고자 하는 내용은 문자열이기 때문에 큰따옴표(" ")안에 입력한다.
· 문자열을 입력할 때 특수 문자를 입력할 때는 특수 문자(Escape Sequence)와 서식 문자(Formatted Sequence)를 입력해야 한다.
· 특수 문자(Escape Sequence)
◦ 특수 문자는 \(백슬러시)또는 \로 시작된다.
문자 |
기능 |
\n |
다음줄로 이동(New Line) |
\r |
줄의 처음으로 이동(Carriage return) |
\b |
왼쪽으로 커서 이동(backspace) |
\\ |
백 슬러시(\) 문자 출력 |
\t |
탭 간격만큼 이동 |
\a |
내부(메인보드) 스피커를 통해 경고음 출력 |
\0 |
널(NULL) 문자 |
\" |
큰 따옴표(") 출력 |
※ 우리가 평소에 사용하는 Enter 같은 경우에는 \n과 \r을 동시에 사용하는 것과 같다.
· 서식 문자(Formatted Sequence)
◦ 서식 문자는 %(퍼센트)로 시작된다.
◦ 서식 문자가 들어갈 시 위에 인자(argument)가 필요하다.
◦ 서식문자는 각각의 필드별로 옵션을 지정(옵션지정자)할 수 있다.
◦ type 필드(field)
▹ 출력하는 값의 형식을 지정
▹ type 필드앞에는 h, l, L을 추가로 지정할 수있다.
▸ h : short형 출력
▸ l : long 출력
▸ L : long double형 출력
문자 |
기능 |
문자 |
기능 |
%c |
단일 문자 |
%x |
부호 없는 16진 정수, 소문자 사용 |
%d |
부호 있는 10진 정수 |
%X |
부호 없는 16진 정수, 대문자 사용 |
%i |
부호 있는 10진 정수, %d와 같다 |
%e |
e 표기법에 의한 실수 |
%f |
부호 있는 10진 실수 |
%E |
E 표기법에 의한 실수 |
%s |
문자열 |
%g |
값에 따라서 %f,%e 둘 중 하나를 선택 |
%o |
부호 없는 8진 정수 |
%G |
값에 따라서 %f,%E 둘 중 하나를 선택 |
%u |
부호 없는 10진 정수 |
%p |
포인터의 번지(값의 주소값) 출력 |
%% |
%기호 출력 |
|
|
◦ width 필드
▹ 출력하는 값의 폭(글자 수)을 지정
▹ 출력의 폭을 지정하는 경우에는 전체 폭의 오른쪽에 맞춰서 출력
▹ 실수를 출력하는 경우에는 소수점 이하 6자리를 기본적으로 출력
사용예 |
의미 |
출력결과 |
printf("%10d", 123); |
10진수(d)로 10글자(10) 출력 |
▯▯▯▯▯▯▯123 |
printf("%10x", 123); |
16진수(x)로 10글자(10) 출력 |
▯▯▯▯▯▯▯▯7b |
printf("%10e", 12.3456); |
지수표기(e)로 10글자(10)출력 |
1.234560e+001 |
printf("%10f, 12.3456); |
소수표기(f)로 10글자(10)출력 |
▯12.345600 |
printf("%10g, 12.3456); |
지수와 소수 중 간단한 것(g)으로 10글자(10) 출력 |
▯▯▯12.3456 |
printf("%10p", "abc"); |
16진수(p)로 주소 10글자(10) 출력 |
▯▯00426090 |
printf("%10s", "abc"); |
문자열(s) 10글자(10) 출력 |
▯▯▯▯▯▯▯abc |
◦ precision 필드
▹ 출력하는 값의 정밀도 지정
▹ 출력할 숫자 개수를 지정
▹ 실수 출력에 정밀도 지정 시 소수점 이하 자리수의 개수를 의미
사용 예 |
의미 |
출력결과 |
printf("%10.4d", 123); |
10진수(d)로 10글자(10) 숫자 4글자(.4) 출력 |
▯▯▯▯▯▯0123 |
printf("%10.4x", 123); |
16진수(x)로 10글자(10) 숫자 4글자(.4) 출력 |
▯▯▯▯▯▯007b |
printf("%10.4e", 12.3456); |
지수표기(e)로 10글자(10)출력 소수점 4째 자리(.4) 출력 |
1.2346e+001 |
printf("%10.4f, 12.3456); |
소수표기(f)로 10글자(10)출력 소수점 4째 자리(.4) 출력 |
▯▯▯12.3456 |
printf("%10.4g, 12.3456); |
지수와 소수 중 간단한 것(g)으로 10글자(10) .을 제외한 숫자 4개(.4) 출력 |
▯▯▯▯▯12.35 |
◦ flags 필드
▹ -, +, 0, 빈칸 #문자가 올 수 있다.
문자 |
의미 |
디폴트 값 |
사용예 |
출력결과 |
- |
전체 폭에 대해서 왼쪽으로 정렬 |
오른쪽으로 정렬 |
printf("%-10d",123); |
123▯▯▯▯▯▯ |
+ |
부호 있는 값에 대해 +/-를 출력 |
음수에 대해서만 -출력 |
printf("%+10d",123); |
▯▯▯▯▯▯ +123 |
0 |
정수의 폭에 맞춰 0으로 채운다 |
정수의 폭에 맞춰서 0으로 채운다 |
printf("%010d",123); |
0000000123 |
빈칸 |
부호 있는 값이 양수이면 빈칸을 앞에 붙여서 출력 |
빈칸 출력하지 않는다. |
printf("% 10d",123); |
▯▯▯▯▯▯▯ 123 |
# |
o,x,X와 함게 사용되면 0,0x,0X를 앞에 붙여서 출력 |
출력하지 않는다. |
printf("%#x",123); |
▯▯▯▯▯▯ 0x7b |
- scanf
int scanf(const char *format [, argument]...); 형식문자열 구조 % [*] [width] [{h | l | L}]type |
· 서식(*format)에 맞게 버퍼에서 데이터를 가져오는 함수
· 버퍼에서 데이터를 가져올 때 데이터가 없을시 커보드로부터 버퍼에 입력받아 저장한 후 가져온다.
· 서식에 서식 문자(formatted Sequence)가 변수를 필요로 할 때는 콤마(,) 뒤에 변수명을 입력해준다.
· 두개 이상의 변수 값을 입력받을 시에는 서식 문자 사이의 문자가 입력의 구분기호가 된다.
※ 입력함수를 두개 이상 연달아 쓸 때 버퍼를 비워주지 않으면 두 입력함수가 같은 값이 들어가기 때문에 fflush함수를 써줘야 한다.
· type 필드
◦ 입력받을 값의 유형을 지정
◦ printf의 type 필드와 유사
◦ 문자 : %c
◦ 정수
▹ 10진수 : %d, %i, %u
▹ 8진수 : %o
▹ 16진수 : %x, %X
◦ 실수 : %f, %e, %E, %g, %G
◦ 문자열 : %s
◦ double형 변수 : %lf
◦ long double형 변수 : %Lf
· width 필드
int a, b; scanf("%2d%3d", &a,&b); → 10진수 2자리를 a로 입력받고 3자리를 b로 입력받는다. |
◦ 입력받을 값의 폭을 지정
◦ * : 현재 입력을 무시
사용 예 |
의미 |
처리결과 |
scanf("%d %*d %d", &a, &b); |
10 20 30 |
a에 10, b에 30이 입력 |
scanf("%2d%3d", &a, &b); |
12345 |
a에 12.b에 345가 입력 |
scanf("%x %x", &a, &b); |
12 abc 또는0x12 0xabc |
a에 0x12, b에 0xabc가 입력 |
scanf("%f, %lf", &x, &y); |
12.34 56.78 |
x에 12.34, y에 56.78이 입력 |
scanf("%s %s", s1, s2); |
abc def |
s1에 abc, s2에 def가 입력 |
'C Langauage' 카테고리의 다른 글
Chapter 6. 배열(Array)과 문자열(String) (0) | 2015.08.05 |
---|---|
Chapter 5. 제어문 (0) | 2015.08.05 |
Chapter 4. 연산자(Operator) (0) | 2015.08.05 |
Chapter 2. 데이터형, 변수, 상수 (0) | 2015.08.05 |
Chapter 1. C언어 입문 (0) | 2015.08.05 |