printf함수와 scanf함수

마블현·2024년 3월 18일

C언어

목록 보기
7/17

printf 함수

printf함수는 문자열을 출력하는 함수이다. 큰 따옴표로 묶인 문자열을 전달하면서 printf 함수를 호출하면, 전달된 문자열이 모니터상에 출력된다.

int main(void)
{
	printf("I like programming \n");
    return 0;
}

그리고 문자열을 보면 \n이 삽입되어 있음을 알 수 있는데, 이를 가리켜 '특수문자'라고 한다.

특수문자의 출력이 필요한 이유

특수문자 혹은 이스케이프 시퀀스라 불리는 문자들이 필요한 이유는 무엇일까?

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

큰 따옴표의 시작과 끝을 문자열의 시작과 끝으로 보기 때문에 printf 함수 내에 삽입된 내용은 다음과 같이 해석이 된다.

" 앞집 강아지가 말했다." >> 하나의 문자열
멍! 멍! >> ?
"정말 귀엽다." >> 하나의 문자열

따라서 컴파일을 하면 여러 개의 에러가 발생한다.
이러한 유형의 문제를 해결하기 위해 문자열의 일부로 큰 따옴표를 포함시킬 수 있는 특수문자가 존재하는 것이다.

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

이렇게 큰 따옴표 자체의 출력을 원하는 경우에는 큰 따옴표 앞에 \를 붙여준다.

특수문자의 종류

  • \a: 경고음
  • \b: 백스페이스
  • \f: 폼 피드
  • \n: 개 행(new line)
  • \t: 수평 탭
  • \v: 수직 탭
  • \': 작은 따옴표 출력
  • \": 큰 따옴표 출력
  • \?: 물음펴 출력
  • \\: 역슬래쉬 출력

printf 함수의 서식 지정

printf의 f는 formatted(서식이 지정된)을 의미한다. 따라서 printf는 서식이 지정된 형태의 출력이라는 뜻이 담겨있다. 출력양식이 만들어진 상태에서 출력을 진행한다는 것이다.

int main(void)
{
	int myAge = 12;
    printf("제 나이는 10진수로 %d살, 16진수로 %X살입니다. \n", myAge, myAge);
    return 0;
}
[실행결과]
제 나이는 10진수로 12살, 16진수로 C살입니다.

%d는 데이터를 10진수 정수의 형태로 출력한다는 의미이며, %X는 데이터를 16진수로 출력하되 알파벳은 대문자로 출력한다는 의미이다.
이렇듯 printf 함수를 이용해서 서식화 된 출력을 할 수 있는 이유는, 문자열 안에 서식문자를 포함할 수 있기 때문이다.

또한 printf 함수의 첫 번째 인자는 우리가 지정한 서식화된 문자열이다. 그 문자열 안에는 두 개의 서식문자가 포함되어있고, 이 서식문자의 출력대상이 두 번째 인자와 세 번째 인자이다. 즉, 첫 번째 서식문자의 출력대상이 두 번째 인자를 통해서 전달되며, 두 번째 서식문자의 출력대상이 세 번째 인자를 통해 전달된다.

이것이 printf 함수의 서식문자와 출력의 대상이 되는 데이터의 관계이다.

서식문자의 종류

  • %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진수)
  • %c의 출력 대상: char, short, int (값에 대응하는 문자)
  • %s의 출력 대상: char * (문자열)
  • %p의 출력 대상: void * (포인터의 주소 값)

정수의 출력을 위한 서식문자: %d, %u, %o, %x

8진수와 16진수의 출력에 사용되는 %o와 %x를 이용해서는 양의 정수만 출력이 가능하다. 따라서 음의 정수를 출력하려면 반드시 %d를 사용해야 한다.

8진수와 16진수는 음의 정수 표현에 거의 사용되지 않는 표현법이라 양의 정수만 출력이 가능하도록 제한하고 있다.

%#o, %#x를 사용하면 8진수를 8진수처럼, 16진수를 16진수처럼 표현할 수 있다.

int main(void)
{
	int num1 = 7;
    printf("%o, %#o \n", num1, num1);
    printf("%x %#x \n", num1, num1);
    return 0;
}
[실행결과]
7 07
d 0xd

실수의 출력을 위한 서식문자: %f, %e, %g

int main(void)
{
	printf("%f \n", 0.1234);
    printf("%e \n", 0.1234);	//e 표기법 기반의 출력
    printf("%f \n", 0.12345678);
    printf("%e \n", 0.12345678);	//e 표기법 기반의 출력
    return 0;
}
[실행결과]
0.123400
1.234000e-001
0.123457
1.234568e-001

e표기법은 지수형태의 출력을 표현한 것이다. 프로그램상에서는 지수를 표현할 수 없기 때문에, e표기법을 사용하는 것이다.

%g는 소수점 이하의 자릿수가 늘어나면 e표기법으로 출력한다.
서식문자 %g는 실수의 형태에 따라서 %f와 %e 사이에서 적절한 형태의 출력을 진행한다.

%s를 이용한 문자열의 출력

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

int main(void)
{
	printf("%s %s %s \n", "AAA", "BBB", "CCC");
    return 0;
}
[실행결과]
AAA BBB CCC

필드 폭을 지정하여 정돈된 출력 보이기

서식문자에는 출력의 필드 폭을 지정하는 옵션을 추가할 수 있다. printf 함수는 명령 프롬포트상에서 출력하기 때문에, 보기 좋은 출력을 위해서 필드의 폭을 지정하는 것도 필요하다.

  • %nd: 필드 폭을 n칸 확보하고, 오른쪽 정렬해서 출력을 진행
  • %-nd: 필드 폭을 n칸 확보하고, 왼쪽 정렬해서 출력을 진행

이렇듯 서식문자 사이에 들어가는 숫자를 기준으로 필드 폭이 결정되고, 출력의 형태는 기본적으로 오른쪽 정렬이기 때문에 -를 추가 삽입하면 왼쪽 정렬이 된다.


scanf 함수

정수 기반의 입력형태 정의

scanf 함수의 호출을 위해서는 입력의 형식과 입력의 장소 두 가지의 정보가 전달되어야 한다. 입력의 형식을 지정할 때도 pirntf함수와 마찬가지로 서식문자를 사용한다.

  • %d: 10진수 정수의 형태로 데이터를 입력 받는다.
  • %o: 8진수 양의 정수 형태로 데이터를 입력 받는다.
  • %x: 16진수 양의 정수 형태로 데이터를 입력 받는다.

실수 기반의 입력형태 정의

scanf 함수에서는 %f, %e, %g의 의미 모두 float형 데이터를 입력 받겠다는 의미이다.
double형은 %lf, long double형은 %Lf의 서식문자를 사용한다.

실수의 입력과정에서는 e표기법이 사용 가능하며, 서식문자 %s는 문자열의 입력에 사용된다.

profile
고수로 나아가는 중

0개의 댓글