Notice
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Today
Total
관리 메뉴

Study Note

[C/C++ Syntax] #007 입출력(Input & Output) 본문

- 프로그래밍 언어(Programming Language)/C\C++

[C/C++ Syntax] #007 입출력(Input & Output)

mymir 2021. 1. 5. 06:13

여기까지 학습을 하면서 프로그램의 결과를 확인하기 위해 출력함수 printf()를 사용했었습니다. 어느정도 소개하지 않고 넘어가기엔 직관적으로 받아들여지지 않을 수 있는 형식이 있기에 이번 글에서는 이와 같은 입출력을 담당하는 키워드의 사용 구조에 대해서만 간략하게 소개하고 넘어가도록 하겠습니다.

 

 

 

printf()


printf()는 표준 입출력 라이브러리에 포함되어 있는 함수로, C언어에서 많은 부분의 출력을 담당하는 함수이며 형식을 지정하는 입력을 합니다. 여기서 형식을 지정한다라는 말은 단순히 문자나 문자열을 출력하는 것이 아니라 수 등의 데이터도 출력할 수 있기에 어떤 데이터를 선택하여 출력할지 그 형식을 지정하여 출력한다라는 의미를 갖는 말입니다. 이 함수의 구조를 면밀하게 분석하기 위해선 상위 개념이 요구되므로 간단하게 사용 구조를 설명하면 다음과 같습니다.

 

printf("출력할 문자열", 문자열에 속할 데이터들..)

// ex
int x = 1, y = 2;
printf("%d + %d = %d", x, y, x + y); // 1 + 2 = 3

 

이렇게 기본 하나의 출력 문자열이 필요하고 상황에 따라 문자열에 속할 데이터를 형식지정자(format specifier)로 대응시켜 표현합니다. 형식지정자는 다음과 같습니다.

형식지정자 기능
%d 부호 있는 10진 정수
%ld, %lld 부호 있는 10진 정수(long, long long)
%u 부호 없는 10진 정수
%o 부호 없는 8진 정수
%x, %X 부호 없는 16진 정수(소문자, 대문자)
%f 10진수 표기법의 실수(float)
%lf 10진수 표기법의 실수(double)
%e, %E 지수 표기법의 실수(소문자, 대문자)
%g, %G 실수 길이에 따라 %f 혹은 %e 중 선택
%c 문자(chracter)
%s 문자열(string)
%p 주소
%% 문자 '%'

 

이 뿐만 아니라 숫자를 사용하여 출력 데이터의 칸 수를 원하는 만큼 정할 수 있고, +, -를 사용하여 오른쪽, 왼쪽 정렬을 할 수 있습니다. 이를 모두 사용한 예시는 다음과 같습니다.

printf("start|%10d|end\n", 123);
printf("start|%-10d|end\n", 123);
/*
start|       123|end
start|123       |end
*/

 

그리고 출력을 조절하는 방법 중 제어문자(escape sequence)를 이용한 방법도 있습니다. 제어문자는 char형 데이터로 \n도 제어문자중 하나입니다. 그 종류와 각 기능은 다음과 같습니다.

제어 문자 이름 기능
\0 null 문자 0 문자열의 끝
\a 경고 7 경고음 발생
\b backspace 8 커서를 현재 위치에서 한 글자 뒤로 이동
\t 수평 탭(horizontal tab) 9 커서의 위치를 현재 라인에 설정된 다음 탭 위치로 이동
\n 줄 바꿈(newline) 10 커서를 다음 라인의 시작으로 이동
\v 수직 탭(verical tab) 11 커서의 위치를 설정된 다음 수직 탭 위치로 이동
\f form feed 12 주로 프린터에서 강제로 다음 페이지로 넘길 때 사용
\r carriage return 13 커서를 현재 라인의 시작 위치로 이동
\' 큰 따옴표 34 키워드가 아닌 문자로의 큰 따옴표
\" 작은 따옴표 39 키워드가 아닌 문자로의 작은 따옴표
back slash 92 키워드가 아닌 문자로의 역슬래쉬

 

 

 

scanf()? scanf_s()?


scanf()도 표준 입출력 라이브러리에 포함된 함수로, C언어에서 많은 부분의 입력을 담당하는 함수이며 printf()와 마찬가지로 형식을 지정하는 출력을 합니다. 그런데 scanf()는 실제로 사용하기엔 buffer overrun이란 문제에 취약하기 때문에 이를 보완한 scanf_s()라는 함수를 표준으로하여 사용합니다.

 

scanf_s("저장될 변수의 형식지정자", &저장될 변수, sizeof(저장될 변수));

//ex
int x = 1;
printf("%d", x); // 1
scanf_s("%d", &x); // 3을 입력한다고 가정, sizeof 생략가능
printf("%d", x); // 3

 

여기서 scanf_s()의 두 번째 인자에서 &를 생략하지 않도록 주의하여 사용해야 합니다.

 

 

사실 위의 printf()와 scanf_s()의 사용은 제약이 많은 편이라 C++에선 cin, cout이란 객체를 이용해 입출력을 수행합니다.(물론 C++에서도 printf()와 scanf_s()의 사용이 가능합니다.)

 

 

cout


cout은 C++의 표준 템플릿 라이브러리 iostream에 포함된 출력 객체로 이후에 배울 연산자 오버로딩(overloading)을 통해 만들어진 출력 연산자 <<와 함께 사용되며 사용 형식은 다음과 같습니다.

// 단일 데이터 출력
cout << 출력 데이터;
// 다중 데이터 출력
cout << 출력 데이터1 << 출력 데이터2;

//ex
cout << 1 << ", " << 2 << endl; // 1, 2
// endl은 줄바꿈을 의미

 

 

 

cin


cin또한 iostream에 포함된 입력 객체로 입력 연산자 >>와 함께 사용되며 사용 형식은 다음과 같습니다.

// 단일 입력
cin >> 입력 데이터;
// 다중 입력
cin >> 입력 데이터1 >> 입력 데이터2;

//ex
int a;
char b;
cin >> a >> b; // 1과 abc를 입력
cout << a << ", " << b << endl; // 1, abc

 

이렇게 cout과 cin은 형식지정자를 사용하지 않고 비교적 자유롭게 데이터의 입출력이 가능하기 때문에 앞으론 필요한 경우를 제외하곤 cout과 cin를 주로 사용하도록 하겠습니다.

Comments