C/C++에서의 대표적인 입출력함수 (Input/output functions, I/O functions)
printf() 함수
1. Syntax
printf(control-string, item1, item2, ...)
• control-string: 어떤 포멧으로 출력할 것인지를 지정하는 문자열 (포멧 문자열)
• 포멧 문자열은 각 항목마다 하나의 포멧 지정자를 가져야 함
• 포멧 문자열을 서로 구별되는 두 가지 정보를 가지고 있음
- 실제로 출력될 문자들
- 포멧 지정자
• 리턴값
- 자신이 출력한 문자의 수를 리턴함
- 에러가 발생한 경우에는 하나의 음수를 리턴함
- printf()의 리턴값은 주목적인 출력에 비해서 부수적인 것이라 잘 사용되지 않는다.
- printf() 리턴값의 한가지 용도는 출력 에러를 확인하는 것
2. 포멧 지정자 (format specifier)
포멧 지정자 | 상응하는 출력 데이터형 |
%a | 부동 소수점수, 16진수 (p-표기)(C-99) |
%A | 부동 소수점수, 16진수 (p-표기)(C-99) |
%c | 하나의 문자 |
%d / %i | 부호가 있는 10진 정수 |
%e | 부동소수점수, e-표기 |
%E | 부동소수점수, E-표기 |
%f | 부동소수점수, 10진수 표기 |
%o | 비부없는 8진 정수 |
%p | 포인터 |
%s | 문자열 |
%u | 부호가 없는 10진 정수 |
%x | 부호 없는 16진 정수 (16진 숫자 0f 사용) |
%X | 비부 없는 16진 정수, 16진 숫자 0F 사용 |
%% | 퍼센트 기호 출력 |
4. 포멧 변경자
- %와 포멧 문자 사이에 포멧 변경자를 삽입하면, 기본적인 포멧 지정을 변경할 수 있음
포멧 변경자 | 의미 |
1. 포멧 변경자를 사용할 때, 아래의 표에 나오는 포멧 변경자 순서를 따라야 한다. | |
플래그 | 5개의 플래그 (1) - a. 항목이 왼쪽 정렬 출력이 된다. (필드의 왼쪽으로부터 출력이 시작됨) b. "%-20s" (2) + a. 부호가 있는 수를 출력할 때, 양수이면, +부호를, 음수이면 -부호를 붙임 b. ex) "%+5.2f" (3) 스페이스 a. 부호가 있는 수를 출력할 때, 양수이면 부호없이 스페이스를 하나 붙이고, 음수이면 -를 붙임 b. ex) "% 6.2f" (4) 0 a. 수치형의 경우, 필드 너비에 남은 공간을 스페이스 대신 0으로 채운다. b. - 플래그가 있거나, 정수형에 정밀도가 지정되어 있으면, 이 플래그는 무시된다. |
숫자들 | - 최소 필드 너비 - 그 필드가 출력될 수나 문자열에 맞지 않으면, 더 넓은 필드 너비가 사용됨 - ex) "%4d" |
.숫자(들) | - 정밀도 - %e,%E,%f 포멧 지정자의 경우, 소수점 아래에 출력될 자리수 - %g, %G 포멧 지정자의 경우: 최대 유효 숫자의 자리수 - %s 포멧 지정자의 경우: 출력될 최대 문자의 수 - 정수형 포멧 지정자의 경우: 출력할 최소 자릿수 |
h | 정수형 포멧지정자와 함께 사용되어 short int형 또는 unsigned int형 값을 나타냄 |
hh | 정수형 포맷 지정자에 함께 사용되어 signed char 형 또는 unsigned char형 값을 나타냄 |
j | 정수형 포맷 지정자에 함께 사용되어 intmax_t형 또는 unitmax_t형 값을 나타냄 |
L | - 정수형 포맷 지정자에 함께 사용되어 long int형 또는 unsigned long int형 값을 나타냄 - 부동형소수점형 포맷 지정자에 함께 사용되어 long double형 값을 나타냄 |
LL | 정수형 포맷 지정자에 함께 사용되어 long long int형 또는 unsigned long long int형 값을 나타냄 |
t | 정수형 포맷 지정자에 함께 사용되어 ptrdiff_t형 값을 나타냄 |
z | - 정수형 포맷 지정자에 함께 사용되어 size_t형 값을 나타냄 - size_t: sizeof에 의해 리턴되는 데이터형 |
* | - 필드 너비와 관련된 변경자 |
Example) *변경자
#include <stdio.h>
int main(void){
unsigned width, precesion;
double weight = 25.23;
printf("write down field width and precesion\n");
scanf("%d %d", width, precesion);
printf("number: %*.*f\n", width, precesion, weight);
}
scanf() 함수
• scanf()의 경우, 입력한 문자열을 다양한 포멧의 데이터를 변환하여 다양한 포멧(정수, 부동소수점 문자, 문자열)으로 저장할 수 있기 때문에, 많이 사용되는 편
1) Syntax
syntax(control_string , data1, data2, ...)
• scanf() 함수는 입력을 읽기 시작한 후 첫번째 화이트 스페이스 (탭, 블랭크, 개행)등을 만나면 읽기를 멈춘다.
•일반적으로, scanf()는 전체 문구가 아니라 단어 하나를 문자열로 읽을 때, %s를 사용한다.
• 주의
- scanf()를 사용하여 기본적인 데이터(문자열 제외) 값을 읽는다면, 변수 앞에 &기호 를 사용해야 한다.
- scanf()를 사용하여 문자열을 읽어 문자 배열 안에 넣는다면, &기호를 사용하지 않는다.
• 리턴값: 성공적으로 읽은 항목의 수를 리턴한다.
- 읽은 항목이 없을 때에는 0값을 리턴함
- 파일의 끝이라고 알려진 조건을 만나면 EOF를 리턴함
program scanf_example.c
=============================================================
#include <stdio.h>
int main(void){
int age;
float height;
char name[30];
printf("write your age, height, and name in order;\n");
scanf("%d %f %s", &age, &height, name);
}
=============================================================
./scanf_example.c
write your age, height, and name in order;
12 172.3 chulsu kim
12 172.3 chulsu
- Note 1: int형 변수인 age와 float형인 height에 대해선 scanf() 부분에서 &를 사용했지만, 문자 배열인 name 변수에 대해선, &를 사용하지 않았다.
- Note 2: 화이트 스페이스를 기준으로 필드가 나누어지기 때문에, kim부분은 문자열로 name에 저장이 되지 못하고 버려졌다.
- Note 3: scanf()에서 사용자의 입력을 개별적인 필드로 나누기 위해 화이트 스페이스를 사용한다.
a. 만일, scanf()에서 화이트스페이스가 아닌 다른 구분자를 사용하고자 한다면 다음과 같이 변경해야 한다.
b. 포맷 문자열에 있는 하나의 스페이스는 다음에 입력될 항목 앞에 놓여있는 화이트 스페이스를 무시하라는 의미이다.
scanf("%d , %f , %s", &age, &height, name);
- 따라서, 위의 명령문은 아래의 입력라인들을 모두 동일하게 받아드린다.
1. 88,193.2, chulsu
2. 88, 193.2 , chulsu
3. 88 , 193.2, chulsu
2) scanf()의 포맷 지정자
포멧 지정자 | 의미 |
%c | 입력한 문자로 해석한다 |
%d | 입력을 부호 있는 10진 정수로 해석한다 |
%e, %f, %g, %a | 입력을 부동소수점수로 해석한다. a. printf()와의 차이점: - printf()에서는 double과 float형 모두 %f, %e, %E, %g, %G 사용할 수 있음 - scanf()에서는 float형만 %f, %e, %E, %g, %G 사용할 수 있음 - scanf()에서 double형을 사용하려고 하면, 앞에 l을 붙여야 함. (ex: %lf) |
%E, %F, %G, %A | 입력을 부동소수점수로 해석한다. a. printf()와의 차이점: - printf()에서는 double과 float형 모두 %f, %e, %E, %g, %G 사용할 수 있음 - scanf()에서는 float형만 %f, %e, %E, %g, %G 사용할 수 있음 - scanf()에서 double형을 사용하려고 하면, 앞에 l을 붙여야 함. (ex: %lf) |
%i | 입력을 부호 있는 10진 정수로 해석한다. |
%o | 입력을 부호있는 8진 정수로 해석한다. |
%p | 입력을 포인터(주소)로 해석한다. |
%s | 입력을 문자열로 해석한다. - 입력은 화이트 스페이스가 아닌 첫 문자로 시작하며, 다음 번 화이트 스페이스 앞까지의 모든 것을 포함 |
%u | 입력을 부호 없는 10진 정수로 해석한다 |
%x, %X | 입력을 부호 있는 16진 정수로 해석한다. |
getchar() & putchar() 함수
• 문자 입출력을 위해 특별히 설계된 한 쌍의 함수
• 해당 함수들은 문자만 전문적으로 다루기 때문에, 범용으로 사용되는 scanf()와 printf() 함수보다 빠르고 간결함
• 문자만 다르기 때문에 포맷 지정자가 필요없음
• 헤더파일: stdio.h
1. getchar() 함수
• scanf()와 달리 전달인자를 사용하지 않음
• 입력된 문자를 리턴함
ex) 아래의 두 명령문은 서로 동일한 효과를 지님 ch = getchar(); putchar(ch);
scanf("%c", &ch); printf("%c", ch);
Example)
- 스페이스가 아닌 문자들을 ASCII 코드에서 그 다음 순서의 문자로 바꾸어 출력하는 프로그램을 작성하라.
#include <stdio.h>
#define SPACE ' '
int main(void){
char ch;
while((ch = getchar()) != '\n'){
if (ch == SPACE) putchar(ch);
else putchar (ch + 1);
}
putchar(ch);
}
• Note 1) (ch = getchar()) != '\n'
-
'프로그래밍 언어 > C, C++의 기본적인 설명' 카테고리의 다른 글
[C/C++] 기본적인 파일 입출력 함수 (0) | 2022.03.07 |
---|---|
[표준 ANSI C 라이브러리] stdio.h (0) | 2022.03.04 |
[C/C++] 디버그, 신텍스 에러, 세만틱 에러 (0) | 2022.02.19 |
[C/C++] 문자/문자열 입출력 (0) | 2021.08.25 |
[C/C++] 힙(Heap), 스택(Stack) (0) | 2021.08.17 |
댓글