본문 바로가기
C언어

C언어 기초 3. printf() 함수

by algosketch 2019. 8. 4.
  • printf()

1) printf()

 본 글에 앞서 Hello, World! 를 출력하는 코드를 살펴봤었다. 이번에는 그 코드 중 printf()에 관하여 설명하고자 한다.

 printf()는 소괄호() 안에 있는 문자열을 모니터 상에 출력해준다.(100% 정확한 표현은 아니다.) 문자열은 "" 사이에 채워넣을 수 있다. "Hello, World!"는 Hello, World!를 문자열로 나타낸 것이다. 마찬가지로 "123"과 같이 숫자도 문자열로 표현할 수 있다. 전 글에서 한 가지 빼 먹은 글이 있는데 원래는 printf("Hello, World!\n"); 이렇게 작성하려고 했었다. C언어를 처음 공부하는 입장이라면 무엇이 바뀌었는지 쉽게 눈에 들어올 것이다. '\n'가 추가됐다. 이 문자는 '\n'가 한 문자이다. 이름은 이스케이프 시퀀스(escape sequence)인데 사실 이름은 별로 중요하지 않다. 그냥 간단히 말하자면 개행 문자이다. 기존의 printf("Hello, World!");와 printf("Hello, World!\n");를 각각 세 번씩 출력하면 (각각 output1, output2)

output1
Hello, World!Hello, World!Hello, World!

 

output2

Hello, World!

Hello, World!

Hello, World!

 

 이렇게 출력된다. 키보드로 따지면 '\n'는 엔터 한 번과 같다. 그리고 \는 원화 문자로 보이지만 백슬래시(/의 반대방향)와 같다. 실제로 IDE(Visual Studio, dev C++등)에 따라 \를 눌러도 백슬래시가 입력되기도 한다.

 Hello, World!를 출력할 때는 아무 문제 없었다. 만약 Hello, "\orld"와 같은 문자열을 출력하려면 어떻게 해야할까? "Hello, "\orld""이렇게 하면 될 것 같기도 하다. 하지만 문자열 "Hello, "와 문자열""를 인식하고 \orld는 에러로 남는다. 이와 같이 특별한 역할을 하는 특수한 문자를 출력하고 싶을 때는 앞에 백슬래시(\)를 하나 붙여주면 된다. 여기서 출력하고 싶은 특수 문자는 "와 \가 있다. 그래서 다음과 같이 코드를 작성하면 정상 출력된다.

#include <stdio.h>

int main() {
    printf("Hello, \"\\orld!\"\n");
    
    return 0;
}

 실제로는 \를 입력했지만 tistory의 코드블록 에디터는 백슬래시로 입력되는 모양이다. 그리고 이번에는 코드 전체를 올렸지만 이후에는 부분 코드를 올릴 예정이다.

 C언어에는 서식문자라는 것이 존재한다. %d %lf 같은 건데, 문자열 중간에 숫자를 출력할 수 있도록 도와준다. 물론 "123"로도 숫자는 출력된다. 하지만 다음과 같은 방법으로도 숫자를 출력할 수 있다.

printf("1. Hello, World\n");
printf("%d. Hello, World\n", 1);
printf("%d %d", 1, 2);
output

1. Hello, World

1. Hello, World

1 2

 

 문자열 안에 %d를 삽입하고 "뒤에 숫자를 추가해 주면 그 숫자가 %d 위치에 출력된다. 여러 숫자를 출력할 때에는 출력하려는 숫자의 개수만큼 %d를 입력하고 "뒤에는 콤마(,)로 구분한다. %d는 정수에 대응하고 %lf는 실수에 대응한다.

 이제 코드를 작성하기 시작했으니 독자 여러분은 여러 가지 버그를 만나게 될 예정이다. 이것은 실력에 상관없이 누구나 만날 수밖에 없다. 발생하는 에러는 두 가지로 구분할 수 있다. 컴파일 에러(Compile Error)와 런타임 에러(Runtime Error)이다. 하나 더 추가하자면 로직 에러(Logic Error)도 있겠다. 컴파일 에러는 컴파일 도중에 발생하는 에러이다. 문법이 틀렸을 경우 발생한다. 빨간 줄로 표시가 되기도 하고 안 되는 것도 많다. 런타임 에러는 프로그램은 실행 되나 실행 도중 프로그램이 중단되는 경우이다. 주로 포인터(나중에 공부한다.)를 다룰 때 런타임 에러가 빈번하게 발생한다. 로직 에러는 컴파일 에러도 안 뜨고 잘 실행되지만 원하는 결과가 나오지 않는 경우이다. 이 경우는 코드 설계를 잘못 한 경우이다.