printf는 출력을 위한 함수이다. 우리가 정의하지 않았음에도 사용할 수 있기 때문에 printf는 표준함수라는 것을 알 수 있다. printf 함수를 사용해 다양한 타입의 데이터를 출력할 수 있다.
#include <stdio.h>
int main(void) {
printf("Hello 2023\n");
printf("%d\n", 2023);
printf("%d %d\n", 10, 20);
return 0;
}
Hello 2023
2023
10 20
위의 예제를 보자. printf 함수로 문자열, 정수 등 다양한 형태의 데이터를 출력할 수 있다.
👉🏻printf는 첫 번째 인자로 전달된 문자열을 출력하는 함수이다.
C언어에서는 큰 따옴표로 문자열을 나타낸다.
그렇다면 여기서 %d는 무슨 의미일까?
이러한 문자를 서식문자(conversion specifier)라고 하는데, 출력의 형태를 지정하는 역할을 한다. 예제를 보면 printf 함수에 두 개, 세 개의 인자를 , 로 구분하여 전달하고 있다. 첫 번째 인자 뒤의 인자들이 바로 출력의 대상이다. %d는 10진수 정수의 출력을 의미한다. 서식문자들은 문자열 내의 다양한 위치에 들어갈 수 있다.
\n는 이스케이프 시퀀스로 개행을 의미한다. \n로 끝나는 문장 뒤에는 다음 줄로 넘어가는 것을 확인할 수 있다.
printf함수에서 f는 formatted이다. printf가 지정된 형식으로 출력을 하는 함수임을 알 수 있다.
서식을 지정할 때 사용하는 서식문자의 종류는 아래와 같다.
이 때, 8진수와 16진수의 표기법으로 출력하고 싶을 때 #을 넣어 %#o, %#x, %#X을 서식문자로 지정해주면 된다.
%g는 실수의 소수점 이하 자리수가 길어지면 알아서 %e 표기법으로 출력한다.
❗필드 폭 지정하여 출력하기
폭의 너비를 사이에 표기하고, 오른쪽 정렬이 디폴트이므로 왼쪽 정렬을 하고 싶은 경우 숫자 앞에 -를 붙여준다.
예를 들어,
%10d : 필드 폭을 10칸으로 두고 오른쪽 정렬하여 출력
%-10d : 필드 폭을 10칸으로 두고 왼쪽 정렬하여 출력
특수문자인 Escape Sequence는 언제 사용되고 왜 있는 것일까? 명시적으로 알려주지 않으면 혼동되는 경우, 또는 특수한 경우에 사용된다.
예를 들어 printf함수는 문자열을 인자로 받아 출력하는 함수이며 문자열은 큰 따옴표로 표현하는데, 문장 내에서 큰 따옴표를 출력해야 하는 경우 문자열의 시작과 끝을 의미하는 것인지 큰 따옴표가 문자열 내에 있는 것인지 알 수 없어 오류가 발생한다. 이 경우 출력하려는 문자열 내 큰 따옴표에 \를 붙여 \"로 써주면 된다.
이 외에도 여러 이스케이프 시퀀스가 존재한다.
📍\a : 경고음
📍\b : backspace(백스페이스)
📍\n : 개행
📍\r : 캐리지 리턴
📍\t : 수평 탭
📍\v : 수직 탭
📍\" : 큰 따옴표 출력
📍\' : 작은 따옴표 출력
📍\? : 물음표 출력
📍\ : 역슬래쉬 출력
scanf는 데이터를 입력받기 위한 함수이다. 키보드로부터 다양한 타입의 데이터를 입력받을 수 있다.
다만, 이 때 visual studio 2019를 사용하는 경우 다음과 같은 오류가 발생하였다. 코드에서는 오류가 없으나 컴파일 후 실행하려고 하면 발생하는 오류이다.
scanf를 사용하면 안전하지 않으니 scanf_s를 사용하거나 _CRT_SECURE_NO_WARNINGS를 사용하라는 의미이다. 왜 scanf를 사용할 수 없는 것일까? scanf가 받아들일 수 있는 데이터의 크기보다 더 많은 양이 들어오는 버퍼오버플로우가 발생할 수 있기 때문이다. scanf_s를 사용하는 것은 비효율적인 것 같고, 코드 맨 앞에 #define _CRT_SECURE_NO_WARNINGS를 적는 방법도 있으나 나는 프로젝트 속성에 들어가서
SDL 검사 부분을 아니요로 변경한 후 적용해주었다.
보안 검사를 하지 않도록 했다. 권장되는 추가 검사이므로 반드시 할 필요는 없다. SDL 검사를 아니오로 바꾸어주면 scanf문제는 해결된다.
이제 아래 예시를 보자.
#include <stdio.h>
int main(void) {
int num;
scanf("%d", &num); // 키보드에 입력한 정수를 변수 num에 저장
return 0;
}
printf함수와 매우 유사해보인다. 첫 번째 인자로 문자열을 받고, 그 이하의 인자에 값을 저장할 변수가 위치한다. 그런데 다른 점이 있다. 변수 앞에 '&'연산자가 붙는다. 이후 나올 포인터와 관련된 내용이므로 이후 살펴보겠다.
printf에서 출력 형태를 지정한 것처럼 scanf도 입력형태를 지정할 수 있다. 또한 여러개의 값을 같이 입력받을 수 있는데, 공백을 기준으로 데이터를 구분하기 때문에 각 입력값 사이에 스페이스바, 탭, 엔터키 중 하나를 입력해주어야 한다.
printf처럼 scanf도 입력의 형식이 지정된다. scanf의 서식문자는 printf와는 조금 다르다. %f, %e, %g 모두 float타입의 데이터를 입력받을 때 사용한다. double은 %lf, long double은 %Lf를 사용한다.
데이터를 입력받을 때 결정해야 할 것
📍입력 장소
📍입력 형식