사실 앞에서 printf 함수와 scanf 함수에 대해서 개략적으로 얘기했기 때문에 이번 chapter는 reference(참고)로 봐주세요⭐
printf 함수
는 문자열을 출력하는 함수다.
그런데 C언어는 큰 따옴표를 사용해서 문자열을 표현한다.
따라서, 큰 따옴표로 묶인 문자열을 전달하면서 printf 함수를 호출하면, 전달된 문자열이 출력된다.
#include <stdio.h>
int main()
{
printf("I like programming \n");
printf("I love puppy! \n");
printf("I am so happy \n");
return 0;
}
문자열에 포함되는 특수문자는 작은 따옴표로 묶어서 독립된 문자상수로도 존재할 수 있다.
즉, 알파벳 문자와 마찬가지로 다음과 같이 표현하는 것도 가능하다.
char ch = '\n';
그렇다면 '특수문자' 혹은 '이스케이프 시퀀스(escape sequence)'가 필요헌 이유가 뭘까?
printf(“앞집강아지가말했다. “멍~! 멍~!” 정말귀엽다.”);
이런 문장을 출력할 때 문제가 발생한다. 앞 뒤로 큰 따옴표가 붙고 그 안에 또 큰 따옴표가 들어가있다.
때문에 큰 따옴표의 시작과 끝을 문자열의 시작과 끝으로 보는 컴퓨터가 오류를 발생시킨다.
특수문자를 문자열의 일부로 인식하기 위해 특수문자가 존재한다.
큰 따옴표 앞에 \
를 넣어주면 우리가 원하는 문장을 출력할 수 있다.
printf(“앞집강아지가말했다. \“멍~! 멍~!\”정말귀엽다.”);
\n
과 \"
만 기억해도 충분하다!
그리고 \f
와 \v
는 모니터 출력이 아닌 프린터 출력을 위해 정의된 특수문자다.
printf의 f는 formatted(서식이 지정된)을 의미한다.
따라서 printf라는 함수의 이름에는 '서식이 지정된 형태의 출력'이란 뜻이 담겨 있다.
이는 '출력양식이 만들어진 상태에서 출력을 진행한다.'는 의미도 들어가 있다.
이번에 '제 나이는 10진수로 12살, 16진수로 C살입니다.'를 출력해보자.
#include <stdio.h>
int main()
{
int MyAge = 12;
printf("제 나이는 10진수로 %d살,\n16진수로 %X살입니다.\n\n", MyAge, MyAge);
// %X라서 결과값의 알파벳 대문자
// %x로 입력했다면 결과값의 알파벳도 소문자!
return 0;
}
여기서 사용된 %d
와 %X
ㄴ를 서식문자라고 하는데 이를 이용해서 서식을 지정하게 된다.
printf 함수의 첫 번째 인자로 전달할 서식화된 문자열 안에는 총 5개의 서식문자가 존재한다. 총 몇 개의 인자를 printf 함수에 전달해야 우리가 원하는 출력을 얻을 수 있을까?
정답은 6개다. (출력할 문자열_1 + 서식문자에 넣을 인자_5 = 6)
8진수와 16진수를 출력하려면 %o
와 %x
를 사용하는데 양의 정수만 출력된다.
이는 8진수와 16진수는 음의 정수 표현에 거의 사용되지 않기 때문에 양의 정수만 출력되도록 제한하고 있다.
음의 정수를 출력하려면 %d
를 사용해야한다.
8진수를 8진수답게, 16진수를 16진수답게 표현하려면 서식 문자 사이에 #
을 이용해 출력하면 된다.
chapter 4에서 배웠던 데이터표현 위해 8진수는 앞에 '0'을 붙이고 16진수는 '0x'를 붙인 걸 생각하면된다.
#include <stdio.h>
int main()
{
int num1 = 7, num2 = 13;
printf("%o %#o\n", num1, num1);
printf("%x %#x\n\n", num2, num2);
return 0;
}
16진수의 경우 가급적 #
을 넣어 16진수라는 것을 알리는 것이 좋다.
#include <stdio.h>
int main()
{
printf("%f \n", 0.1234);
printf("%e \n", 0.1234); // e 표기법 기반의 출력
printf("%f \n", 0.12345678);
printf("%e \n\n", 0.12345678); // e 표기법 기반의 출력
return 0;
}
서식문자 %e
를 사용하면 e-01이 실수 뒤에 추가되어 표현되는 것을 알 수 있다.
이러한 출력의 형태를 e 표기법
이라 한다.
e 표기법
은 소수점 아래 몇째 자리에 있는지 뒤에 숫자가 알려준다.
다른 예제를 통해 %g
서식문자도 이해해보자.
#include <stdio.h>
int main()
{
double d1 = 1.23e-3; // 0.00123
double d2 = 1.23e-4; // 0.000123
double d3 = 1.23e-5; // 0.0000123
double d4 = 1.23e-6; // 0.00000123
printf("%g \n", d1); // %f 스타일 출력
printf("%g \n", d2); // %f 스타일 출력
printf("%g \n", d3); // %e 스타일 출력
printf("%g \n\n", d4); // %e 스타일 출력
return 0;
}
%g
는 일정 소수점 자리수가 늘어나면 e 표기법으로 표현한다.
물론 %e
냐 %E
냐의 차이와 %g
냐 %G
냐의 차이는 16진수 표현과 동일하게 e가 대문자인지 소문자인지 차이다.
#include <stdio.h>
int main()
{
printf("%s, %s, %s \n\n", "AAA", "BBB", "CCC");
return 0;
}
문자열에 대한 자세한 내용은 배열과 포인터를 공부할 때 얘기할 예정이다.
서식문자에는 출력의 필드를 지정하는 옵션을 추가할 수 있다.
예를 들어, %8d
는 필드폭을 8칸 확보하고, 오른쪽 정렬해서 출력을 진행한다.
%-8d
는 필드폭을 8칸 확보하고, 왼쪽 정렬해서 출력을 진행한다.
#include <stdio.h>
int main()
{
printf("%-8s %16s %5s \n", "이 름", "전공학과", "학년");
printf("%-8s %16s %5s \n", "김동수", "전자공학과", "3");
printf("%-8s %16s %5s \n", "이을수", "컴퓨터공학", "4");
printf("%-8s %16s %5s \n\n", "한선영", "국제경영학과", "2");
return 0;
}
필드 폭을 동일하게 지정했기 때문에 훨씬 깔끔하게 볼 수 있다.
scanf 함수도 printf 함수와 동일하게 서식문자를 사용하여 다양한 형태로 입력의 서식형태를 지정할 수 있다.
scanf 함수는 printf 함수의 상대적인 기능을 지닌다.
printf 함수는 출력에 사용되지만, scanf 함수는 입력에 사용된다.
따라서 scanf 함수의 호출을 위해서는 입력의 형식
, 입력의 장소
가 전달되어야 한다.
%d: 10진수 정수의 형태로 데이터를 입력 받는다.
%o: 8진수 양의 정수의 형태로 데이터를 입력 받는다.
%x: 16진수 양의 정수의 형태로 데이터를 입력 받는다.
#include <stdio.h>
int main()
{
int Num1, Num2, Num3;
printf("세 개의 정수 입력: ");
scanf_s("%d %o %x", &Num1, &Num2, &Num3);
printf("입력된 정수 10진수 출력: ");
printf("%d %d %d \n\n", Num1, Num2, Num3);
return 0;
}
printf 함수에서는 서식문자 3개 (%f
, %e
, %g
)가 있었고 각 의미가 달랐다.
scanf 함수에서는 'float형 데이터를 입력 받겠다.'라는 동일한 의미를 갖고 있다.
%lf: double 데이터 입력 받는다. → %f에 l이 추가된 형태
%Lf: long double 데이터 입력 받는다. → %f에 L이 추가된 형태
#include <stdio.h>
int main()
{
float number1;
double number2;
long double number3;
printf("실수 입력1 (e 표기법으로): "); // 1.1e-3 입력
scanf_s("%f", &number1);
printf("입력된 실수 %f \n", number1); // 0.001100으로 출력
printf("실수 입력2 (e 표기법으로): "); // 0.1e+2 입력
scanf_s("%lf", &number2);
printf("입력된 실수 %f \n", number2); // 10.000000으로 출력
printf("실수 입력3 (e 표기법으로): "); // 0.17e-4 입력
scanf_s("%Lf", &number3);
printf("입력된 실수 %Lf \n", number3); // 0.000017으로 출력
return 0;
}
실수를 입력할 땐 e 표기법을 사용해도 된다는 것을 알 수 있다.
서식문자 %s
는 printf 함수와 동일하게 scanf 함수에서도 문자열 데이터를 입력 받을 때 사용된다.
<Review>
printf 함수와 scanf 함수를 좀 더 폭 넓게 사용할 수 있는 방법에 대해 알아보는 시간이었다.
오늘은 내용이 라이트해서 좋았다~ 자료구조하러 뿅!✨