『Lena's by ☆볶기!!』: Restart !!

Rorolena
[C/C++] 6. printf와 scanf
[printf 함수]

1. printf 함수는 문자열을 출력하는 함수이다.
printf 함수는 문자열을 출력하는 함수입니다.
그런데 C언어는 큰 따옴표를 사용해서 문자열을 표현합니다.
따라서 큰 따옴표로 묶인 문자열을 전달하면서 printf 함수를 호출하면
전달된 문자열이 모니터상에 출력됩니다.

사용은 다음과 같이합니다.
printf("I like programing\n");

2. 특수문자의 출력이 필요한 이유
문자열에 포함되는 특수문자는 작은 따옴표로 묶어서 독립된 문자상수로도 존재할 수 있습니다.
즉, 알파벳 문자와 마찬가지로 다음과 같이 표현 하는 것도 가능합니다.

char ch='\n';

그렇다면 특수문자 혹은 이스케이프 스퀀스라 불리는
문자들이 필요한 이유를 다음 문장을 통해 알아봅시다.

printf("앞집 강아지가 말했다, "멍~! 멍~!" 정말 귀엽다.");

우리가 바라는 출력결과는
앞집 강아지가 말했다, "멍~! 멍~!" 정말 귀엽다.
이지만 사실 위의 문장은 컴파일 에러를 일으킵니다.

컴파일러는 다음과같이 인식하기 때문입니다.
"앞집 강아지가 말했다, " //문자열
명~! 명~! //???
" 정말 귀엽다." //문자열
이러한 연유들 때문에 특수문자가 필요하게 되었습니다.

3. 특수문자의 종류
다음과 같은 특수 문자들이 있습니다.

특수문자

의미하는 바

\a 경고음
\b 백스페이스(backspace)
\f 폼피드(form feed)
\n 개 행(new line)
\r 캐리지 리턴(carriage return)
\t 수평 탭
\v 수직 탭
\' 작은 따옴표 출력
\" 큰 따옴표 출력
\? 물음표 출력
\\ 역슬래쉬 출력

이중 \f와 \v는 모니터 출력이 아닌 프린터 출력을 위해 정의된
특수문자이기 때문에 모너티의 출력에 사용 하면, 이상한 문자가 출력됩니다.

4. printf 함수의 서식지정
printf란 서식이 지정된 형태의 출력함수 입니다.
따라서 이를 바꾸어 말하면 다음과 같이 말할수 있습니다.
"출력양식이 만들어진 상태에서 출력을 진행한다."

그럼 printf를 어찌 사용하는 지 다음 예를 통해 보겠습니다.

int myAge = 12;
printf("제 나이는 10진수로 %d살, 16진수로 %X살입니다. \n", myAge, myAge);

위의 예제에서 살펴 볼점은 먼저
서식문자가 2개 printf에 전달인자는 3개 라는 것입니다.
만약 절달 인자가 부족하면 정상적이지 않은 결과가 출력됩니다.

다음으로 %X인대 이를 대문자로 작성하면 출력이 대문자로
소문자로 작성하면 출력이 소문자로 출력됩니다.

5. 서식문자의 종류와 그 의미

서식문자 출력 대상(자료형) 출력 형태
%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 * 포인터의 주소 값

6. 정
수의 출력을 위한 서식문자들: %d, %u, %o, %x
%d, %u, %o, %x는 정수를 표현하기 위한 서식문자들 인대
예제를 통해 간단하게 확인하고 넘어가도록 합시다.

int num1=7, num2=13;
printf("^%o %#o \n", num1, num1);
printf("^%x %#x \n", num2, num2);

위 예제에서 보이듯이 10진수외에 출력할 경우 출력된 내용이
10진수가 아님을 알리기 위해서 가급적 서식문자에 #을 포함시키는 것이 좋습니다.

7. 실수의 출력을 위한 서식문자들: %f, %e, %g
다음 실수 예제를 보도록 합시다.

printf("%f \n", 0.1234);
printf("%e \n", 0.1234);
printf("%f \n", 0.12345678);
printf("%e \n", 0.12345678);

위 예제중 서식문자 %e를 사용했을 때의 출력결과를 확인할 필요가 있습니다.

1.234000e-001
1.234568e-001

이러한 출력의 형태를 가리켜 e표기법 이라 하며
이는 지수형태의 출력을 표현한 것입니다.

그럼 다음의 숫자가 있다고 가정하고 이를 지수로 표현한다면
0.00000000000000000001
1.0x 10^-20

그런데 이를 프로그램상에서는 지수를 표현할수 없기때문에 다음과같이 작성합니다.
1.0e-20

그럼 이를 이용해 다음 예제를 확인해봅시다.

double d1=1.23e-3;
double d2=1.23e-4;
double d3=1.23e-5;
double d4=1.23e-6;

printf("%g \n", d1);
printf("%g \n", d2);
printf("%g \n", d3);
printf("%g \n", d4);

위의 예제를 통해 할수 있는 사실은 다음과 같습니다.
"%g는 소수점 이하의 자릿수가 늘어나면 e표기법으로 출력을 하는구나!"

8. %s를 이용한 문자열의 출력
%s에서의 s는 string의 약자로서 문자열의
출력을 지시하기 위한 서식문자에 사용됩니다.

자세한 사항은 후에 설명하니 여기서는
간단한 사용법만 살펴 보도록 하겠습니다.

printf("%s, %s, %s \n", "AAA", "BBB", "CCC");

9. 필드 폭을 지정하여 정돈된 출력 보이기
서식문자에는 출력의 필드 폭을 지정하는 옵션을 추가할 수 있습니다.
printf 함수는 명령 프롬프트상에 출력하기 떄문에, 보기 좋은 출력을 위해서
필드의 폭을 지정하는 것도 필요한대 다음과 같습니다.

- %8d 필드 폭을 8칸 확보하고, 오른쪽 절렬해서 출력을 진행한다.
- %-8 필드 폭을 8칸 확보하고, 왼쪽 정렬해서 출력을 진행한다.

[scanf 함수]
scanf 함수의 기본적인 사용법에 대해서는 앞서 자세히 설명하였으므로
여기서는 입력을 위한 서식 지정 방법만 설명하도록 하겠습니다.

1. 정수 기반의 입력형태 정의하기
scanf 함수는 printf 함수의 상대적인 기능을 지닙니다.
printf 함수는 출력에 사용되지만 scanf 함수는 입력에 사용됩니다.
따라서 scanf 함수의 호출을 위해서는 다음 두 가지 정보가 전달되어야 합니다.

- 입력의 형식 어떻게 받아들일 건가?
- 입력의 장소 어디에 저장할것인가?

이 중에서 입력이 형식을 지정할 때도 printf 함수와 마찬가지로 서식문자를 사용합니다.
scanf 함수의 관점에서 서식문자의 의미는 다음과 같습니다.

%d 10진수 정수의 데이터 입력
%o 8진수 양의정수 테이터 입력
%x 16진수 양의정수 데이터 입력

다음 예제를 통해 확인해 보도록합시다.

inr num1, num2, num3
printf("세 개의 정수 입력: ");
scanf("%d %o %x", &num1, &num2, &num3);
printf("입력된 정수 10진수 출력: ");
printf("%d %d %d \n", num1, num2, num3);

2. 실
수 기반의 입력형태 정의하기
printf 함수에서는 서식문자 %f, %e, %g의 으미가 각각 달랐습니다.
그러나 scanf 함수에서는 float형 데이터를 입력 받겠다는
동일한 의미를 담고 있습니다.

그럼 double형 데이터는 어떻게 입력 받아야 하는가는
다음과같이 작성할수 있습니다.

%lf double
%Lf long double