'printf' 함수 정리
Escape Character
간단한 예시의 printf문을 살펴보자면,
`printf("앞집 강아지가 말했다. "멍! 멍!" 정말 귀엽다");` 라는 printf문의 경우는 올바른 printf문으로 볼 수 없다.
큰 따옴표가 여러개 존재하다보니, 어떤 부분을 출력해야 하는지 컴파일러가 제대로 인식할 수 없기 때문이다.
따라서, 올바르게 위의 예시를 출력하기 위해서는
`printf("앞집 강아지가 말했다. \"멍! 멍!\" 정말 귀엽다");`와 같이, 그대로 출력해야하는 큰 따옴표 앞에 back slash를 붙여주어야한다.
이렇게 \(back slash)와 특정 문자를 조합해서 사용하는 경우를 escape character라고 하는데, 대표적인 종류는 다음과 같다.
Escape Character | 의미하는 바 |
\a | 경고음 |
\b | 백스페이스 |
\f | 폼 피드(form feed) |
\n | 개행(new line) |
\r | 캐리지 리턴(carriage return) |
\t | 수평 탭 |
\v | 수직 탭 |
\' | 작은 따옴표 출력 |
\" | 큰 따옴표 출력 |
\? | 물음표 출력 |
\\ | back slash 출력 |
모두 다 알고 있으면 좋겠지만, 자주 쓰이는`\n, \t, \', \"` 정도는 반드시 숙지하고 있자
서식 문자
자주 사용되는 `%d, %f`와 같은 문자를 '서식 문자'라고 한다.
서식 문자의 종류는 다음과 같다.
서식 문자 | 출력 대상(자료형) | 출력 형태 |
%d | char, short, int | 부호 있는 10진수 정수 |
%ld | long | 부호 있는 10진수 정수 |
%lld | long long | 부호 있는 10진수 정수 |
%u | unsigned int | 부호 없는 10진수 정수(양수만) |
%o | unsigned int | 부호 없는 8진수 정수(양수만) |
%x, %X | unsigned int | 부호 없는 16진수 정수(양수만) |
%f | float, double | 10진수 방식의 부동소수점 실수 |
%Lf | long double | 10진수 방식의 부동소수점 실수 |
%e, %E | float, double | e또는 E 방식의 부동소수점 실수 |
%g, %G | float, double | 값에 따라 %f와 %e 사이에서 적절한 것 선택 |
%c | char, short, int | 값에 대응하는 문자 |
%s | char* | 문자열 |
%p | void* | 포인터의 주소 값 |
추가적으로, `%o, %x. %X`에서 #을 삽입하면 8진수 앞에는 '0' , 16진수 앞에는 '0x'가 추가로 붙는다.
#include <stdio.h>
int main(void)
{
int num1=7, num2=13;
printf("%o %#o \n", num1, num1); // 7 07
printf("%x %#x \n", num2, num2); // d 0xd
return 0;
}
`%f`, `%e`의 차이는 다음과 같다.
#include <stdio.h>
int main(void)
{
printf("%f \n", 0.1234); // 0.123400
printf("%e \n", 0.1234); // 1.234000e-01
printf("%f \n", 0.12345678); // 0.123457
printf("%e \n", 0.12345678); // 1.234568e-01
return 0;
}
cf) $1.0 \times 10^{-20} = 1.0e-20$
`%g`는 실수의 형태에 따라서 `%f`와 `%e`사이에서 적절한 형태로 출력한다
(`%g`와 `%G`차이는 e표기법의 e의 대소문자 여부이다.)
#include <stdio.h>
int main(void)
{
double d1=1.23e-3;
double d2=1.23e-4;
double d3=1.23e-6;
double d4=1.23e-5;
printf("%g \n", d1); // 0.00123
printf("%g \n", d2); // 0.000123
printf("%g \n", d3); // 1.23e-05
printf("%g \n", d4); // 1.23e-06
// 일정 수준 이상 소수 부분이 길어지는 경우 e표기법을 사용하는 것으로 추측할 수 있음
return 0;
}
서식 문자를 사용해, 출력되는 문자의 폭을 지정해서 출력하는 것도 가능하다.
#include <stdio.h>
int main(void)
{
printf("%-8s %14s %5s \n", "이 름", "전공학과", "학년");
printf("%-8s %14s %5s \n", "김동수", "전자공학", "3");
printf("%-8s %14s %5s \n", "이을수", "컴퓨터공학", "2");
printf("%-8s %14s %5s \n", "한선영", "미술교육학", "4");
/*
이 름 전공학과 학년
김동수 전자공학 3
이을수 컴퓨터공학 2
한선영 미술교육학 4
*/
return 0;
}
예시로, `%8d`의 경우에는 8칸을 확보하고 오른쪽으로 정렬해 출력하는 것이고, `%-8d`는 8칸을 확보하고 왼쪽으로 정렬해 출력하는 것으로 정리할 수 있다.
'scanf' 함수 정리
문자의 입력에 사용하는 'scanf'함수에서 필요한 정보는 두가지이다
- 입력의 형식
- 어떤 타입의 데이터를 입력받을 것인가
- 서식 문자 사용(ex : `%d`)
- 서식 문자의 사용은 printf함수에 사용되는 서식 문자와 유사하다
- 입력의 장소
- 어느 메모리 공간에 입력 데이터를 저장할 것인가
- 메모리 포인터 사용(ex : `&num1`)
#include <stdio.h>
int main(void)
{
int num1, num2, num3;
printf("세 개의 정수 입력: ");
scanf("%d %o %x", &num1, &num2, &num3);
// 세 개의 정수 입력: 12 12 12
printf("입력된 정수 10진수 출력: ");
printf("%d %d %d \n", num1, num2, num3);
// 입력된 정수 10진수 출력: 12 10 18
return 0;
}
서식 문자의 사용에서 `printf`함수와 `scanf`함수의 다른 점이라면,
`printf`에서는 %f, %e, %g의 의미가 각각 달랐지만, `scanf`에서는 셋 다 'float형 데이터를 입력 받겠다'라는 동일한 의미를 가진다.
추가적으로, 실수형 데이터에 대해서는 `printf`와 `scanf`의 서식 문자 사용의 차이가 존재하는데,
`printf`에서의 서식문자 | `scanf`에서의 서식문자 | |
float | %f | %f |
double | %f | %lf |
long double | %Lf | %LF |
`printf`는 float와 double을 서식 문자 내에서 구분하지 않지만, `scanf`는 각각 다른 서식 문자를 갖는다고 암기하면 좋을 것 같다.
#include <stdio.h>
int main(void)
{
float num1;
double num2;
long double num3;
printf("실수 입력1(e 표기법으로): ");
scanf("%f", &num1); // float 입력 : %f
printf("입력된 실수 %f \n", num1); // float 출력 : %f
printf("실수 입력2(e 표기법으로): ");
scanf("%lf", &num2); // double 입력 : %lf
printf("입력된 실수 %f \n", num2); // double 출력 : %f
printf("실수 입력3(e 표기법으로): ");
scanf("%Lf", &num3); // long double 입력 : %Lf
printf("입력된 실수 %Lf \n", num3); // long double 출력 : %Lf
return 0;
}
또한, 실수의 입력과정에서 'e 표기법'도 사용 가능하다.
'공부 > C언어' 카테고리의 다른 글
C언어 TIL (241007) (0) | 2024.10.07 |
---|---|
C언어 - (6) : 반복문 (0) | 2024.10.07 |
C언어 - (4) : 자료형/형 변환 (3) | 2024.10.03 |
C언어 - (3) : 자료형 별 데이터의 표현 방식 / 비트 연산자 (2) | 2024.09.11 |
C언어 - (2) : 변수 / 연산자 (0) | 2024.09.09 |