본문 바로가기
c언어

c언어 printf() 출력에 대하여 알아보기

by 개발자 L 2023. 2. 12.
반응형

c언어 printf() 출력에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 c언어의 출력 함수인 printf()에 대하여 좀 더 자세히 알아보도록 하겠습니다.

우리는 지금까지 pritnf()로 항상 값을 출력을 해왔습니다.

그 이유는 printf()가 표준 출력 스트림이기 때문이죠.

그리고 이 printf()를 이용해서 매우 정밀하고 세밀하게 출력을 제어도 할 수 있습니다.

그래서 이번 포스팅에서는 그러한 것들을 좀 더 알아보고자 합니다.

그럼 시작하도록 하겠습니다.

 

1. 형식 제어 문자열

다들 아시다시피 printf()를 이용할 때 오는 가장 첫 번째 매개 변수인 format은 '형식 제어 문자열'이라고 알고 있을 겁니다.

그리고 여기에 들어가는 문자열 안에서 '%'로 지정을 해주는 문자를 '형식 지정자'라 합니다.

그리고 아래는 형식 제어 문자열의 기본적인 구조입니다.

printf("%-100.2f", value);

여기에 들어있는 제어 문자열의 구성은 이렇습니다.

  • 플래그(flag)
  • 필드폭
  • 정밀도
  • 형식

이 중에서 정말 중요하게 알아야 하는 것은 형식입니다.

제일 뒤에 있는 f가 바로 그 형식인데,

여기에서 f는 자료형을 실수형으로 지정하겠다는 형식 지정자입니다.

사실상 이게 제일 큰 부분을 차지하고,

그다음에 value인 변수를 적절하게 맞춰주기만 하면 출력이 됩니다.

그 외적인 부분들은 전부 선택 사항입니다.

 

1 - 1. 플래그(flag)

플래그는 아래의 표와 같은 기능을 합니다.

기호 의미 기본값
- 출력값 왼쪽 정렬 오른쪽 정렬
+ 결과 값 출력 시 항상 +와 -의 부호 붙임 음수일 때만 - 붙임
0 출력값 앞에 공백 대신 0으로 채움.
단, -와 0이 동시에 있거나, 정수 출력인 경우 0은 무시됨.
채우지 않음
blank(' ') 출력값 앞에 양수나 0인 경우에는 부호 대신 공백 출력하고,
음수일 경우는 -가 붙여지고, + 플래그가 앞에 있으면 무시
공백 출력 안 함
# 8진수 출력 시에는 출력값 앞에 0을 붙이고,
16진수 출력 시에는 0x를 붙임
붙이지 않음

이렇습니다.

그러면 이를 예로 들어서 출력이 되는 게 어떤 식으로 되는지 보여드리도록 하겠습니다.

출력 문장 출력 결과 설명
printf("%d", 123); 123 기본 출력
printf("%010d", 123); 0000000123 빈칸 대신 0을 채움
printf("% d", 123);  123 양수일 경우 공백을 앞에 출력
printf("%+d", 123); +123 양수이면 + 출력
printf("%d", -123); -123 음수 기본 출력
printf("%#o", 010); 010 8진수 형태 보존해서 출력
printf("%#x", 0x10;) 0x10 16진수 형태 보존해서 출력

이렇게 쓸 수 있습니다.

반응형

 

1 - 2. 필드폭(width)과 정밀도(precision)

우리는 출력을 할 때 데이터가 출력이 되는 필드의 크기를 지정을 할 수 있습니다.

필드의 폭은 형식 지정자 사이에 들어가며,

예를 들어서 '%10d'라고 쓴다면, 문자의 크기가 10이 됩니다.

그래서 필드의 크기보다 출력되는 문자의 크기가 작다면 출력이 되는 문자는 오른쪽 정렬이 되어 출력이 됩니다.

그리고 당연히 출력되는 문자의 크기가 필드보다 크다면 필드의 폭은 자동으로 넓어지도록 설정이 되어 있고,

+와 - 역시 필드 내에서 문자로써 자리를 차지합니다.

그러면 몇 가지 예시를 들어보도록 하겠습니다.

출력 문장 출력 결과 설명
printf("%10d", 123);        123 폭 10, 우측 정렬
printf("%-10d", 123); 123        폭 10, 좌측 정렬
printf("%10d", -123);       -123 폭 10, 우측 정렬
printf("%-10d", -123); -123       폭 10, 좌측 정렬
printf("%10s", "abc");        abc 폭 10, 우측 정렬
printf("%-10s", "abc"); abc        폭 10, 좌측 정렬

이건 정수형과 문자형 및 문자열 자료형의 경우입니다.

하지만 우리가 쓰는 자료형 중에 '% e', 그리고 '% f' 등의 경우는 실수형 자료형이죠?
이럴 경우에는 기본 출력 필드의 폭도 정할 수 있고,

실수는 소수인 경우도 있기 때문에 소수점 이하 출력 범위도 정할 수 있습니다.

몇 가지 예시를 보여드리도록 하겠습니다.

출력 문장 출력 결과 설명
printf("%f", 1.23456789); 1.234568 실수형 자료형 기본 출력(소수점 이하 6자리)
printf("%10.3f", 1.23456789);      1.235 필드폭 10, 소수점 이하 3자리 출력, 우측 정렬
printf("%-10.3f", 1.23456789); 1.235      필드폭 10, 소수점 이하 3자리 출력, 좌측 정렬
printf("%.3f", 1.23456789); 1.235      소수점 이하 3자리 출력

 

1 - 3. 형식

제일 중요한 형식입니다.

우리가 어떤 자료형을 입력하고 출력을 할 때 그 형식에 맞는 형식 지정자를 지정해서 출력을 해줘야 합니다.

그래서 그 지정자가 맞지 않으면 에러가 나거나 이상한 값이 나올 수 있기 때문에 잘 지정을 해줘야 합니다.

형식 지정자는 아래의 표와 같습니다.

형식 지정자 설명 출력 예시
%d 부호 있는 10진수 형식으로 출력 255
%i 부호 있는 10진수 형식으로 출력 255
%u 부호 없는 10진수 형식으로 출력 255
%o 부호 없는 8진수 형식으로 출력 377
%x 부호 없는 16진수 형식으로 출력하되, 소문자 출력 fe
%X 부호 없는 16진수 형식으로 출력하되, 대문자 출력 FE
%f 소수점 고정 표기 형식으로 출력 1.23456
%e 지수 표기 형식으로 출력, 지수부를 소문자 e로 표시 1.23456e+2
%E 지수 표기 형식으로 출력, 지수부를 대문자 E로 표시 1.23456E+2
%g %e 형식과 %f 형식 중 더 짧은 형식으로 출력 1.23456
%G %E 형식과 %f 형식 중 더 짧은 형식으로 출력 1.23456
%p 포인터 형식으로 출력 0027FDD0
%c 문자 형식으로 출력 a
%s 문자열 형식으로 출력 abc

이렇습니다.

그리고 여기서 보실 수 있듯이 실수 표현 방식은 두 가지입니다.

이 중에서 '% f'의 경우는 단순히 정수부와 소수부를 나누어 표기하는 방법이고,

'% e'의 경우는 가수부와 지수부로 분리를 하여 표현하는 과학적 표기법입니다.

이렇게 표현을 하게 되면 매우 긴 소수를 훨씬 간편하게 표현을 할 수 있습니다.

제가 몇 가지 예시를 들어보도록 하겠습니다.

출력 문장 출력 결과 설명
printf("%f\n", 1.23456789); 1.234568 실수 기본 표기
printf("%e\n", 1.23456789); 1.234568e+000 지수 기본 표기
printf("%10.3e\n", 1.23456789); 1.235e+000 지수 표기법
printf("%-10.3f\n", 1.23456789); 1.235e+000 지수 표기법

 

여기까지 printf() 출력에 대하여 알아보았는데요,

다음 포스팅에서는 scanf()를 이용한 입력에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사합니다~

반응형

댓글