C프로그래밍 기초 강좌 - 4장
자 3장에서 기본적인 C proramming의 소스코드를 알아보았습니다. 그럼 프로그래밍의 기초이며 무언가를 해볼 수 있는 출력에 대한 것과 첫 C프로그램을 만들어 보도록 하겠습니다.
가. 출력
기본적으로 C 언어는 기본적인 입출력 함수는 stdio.h (Standard Input/Output Header File)안에 들어있습니다. 그 중 기본적으로 사용하는 출력 함수는 우리가 3장에서 봤던 printf()함수입니다.
Printf 는 Print Formatting 의 약자이며 서식화된 출력을 하는 함수입니다. |
서식화된 문자열이란 어떠한 서식이 있으면 이 서식과 대응되는 뒤쪽의 인수를 대입하여 서식 문자열을 출력하게 됩니다. 즉 출력하기 전 서식과 인수를 대응시켜 Formatting하는 과정을 먼저 거치게 되며 뒤쪽의 인수는 서식의 개수만큼 오되 서식이 없으면 인수를 생략할 수 있습니다. 서식 및 인수가 존재하지 않는 printf()의 예제는 <3장 – 다> 의 printf()와 같은 형태를 취하게 됩니다.
Printf() 함수의 구성은 아래와 같이 표현되어집니다.
int printf(const char *format, arg1, arg2, arg3....);
(format : 서식문자열 | arg1, arg2, arg3... : 인수들)
서식문자열은 기본적인 베이스가 되는 서식문자열이 뒤의 인수를 이용하여 서식화된 출력을 시켜주게 됩니다.
예를 들어
위의 코드를 보면 5란 숫자가 %d와 대응되며 “화”이란 글자는 %s가 대응되며, 결과는
“오늘은 5일 화요일입니다.” 란 문장이 출력이 됩니다.
|
참고로 서식과 인수의 대응은 왼쪽부터 차례대로 대응됩니다. |
그럼 여기서 %d 나 %s 가 무엇인가 하는 의문이 생깁니다. 이 것들은 뒤의 인수에 대한 형식을 나타내는 문자입니다.
이 서식을 나타내는 문자는 여러가지 종류가 있는데 아래의 표에서 참조하시면 되겠습니다.
|
서식 |
의미 |
설명 |
|
%d or %i |
Decimal, Integer |
10진 정수 출력 |
|
%o |
Octal |
8진 정수로 출력 |
|
%x or %X |
heXadecimal |
16진수 정수로 출력(대문자 X를 쓰면 A~F까지의 숫자도 대문자로 출력된다.) |
|
%u |
Unsigned |
부호없는 10진 정수로 출력 |
|
%c |
Character |
1개의 문자를 출력 |
|
%s |
String |
문자열을 출력 |
|
%f |
Float |
고정소수점 형식의 실수 출력 |
|
%e or %E |
|
부동 소수점 형식의 실수 출력 |
|
%g or %G |
|
%e, %f 중 더 짧은 형식으로 출력 |
|
%p |
Pointer |
포인터의 번지값 출력 |
|
%n |
|
출력된 문자 개수를 포인터 변수에 대입 |
|
%% |
|
%문자 자체를 출력한다 |
이제까지 기본적인 출력함수인 printf()함수에 대해 알아봤다습니다. 이 이외에도 폭을 지정할 수 있는 서식이 존재하며, 정밀도, 크기 등 가장 기본적인 함수이면서 많은 기능들을 가지고 있는 함수로 할 수 있습니다.
----------------------------------------------------------------
이번엔 문자(char형)과 문자열(string)에 대한 출력함수를 알아보도록 하겠습니다.
C에선 Data type중에 character type와 string type가 있습니다. 그러나 C에서 문자열은 엄밀히 말하면 string type이 아닌 character array type입니다. 즉 character type가 연속적으로 나열되어있는 array type입니다. (C++에서는 string란 문자열을 지원하며, 베이직, 파스칼, 자바같은 언어도 별도의 문자열을 지원합니다.)
putc()
putc()함수는 문자 한개를 출력하는 함수입니다. putc()함수는 stdio.h 헤더안에 정의되어 있으며, 원형은
int putc(int c, FILE *stream);
으로 정의되어 있습니다. 이 함수의 기능은 Integer 를 입력받아 ASCII 코드에 대응하는 문자를 stream으로 출력하는 함수입니다. Stream 이란 흐름을 의미합니다. 우리가 어떠한 출력값을 출력장치, 즉 대표적으로 모니터나 프린터로 보낼때 순서대로 보내는데, 보내는 행위를 stream이라고 생각하시면 됩니다. 보통 표준 출력 장치로 보낼때에는 stdout를 써주시면 되며, 이 스트림은 모니터로 보내어져 화면에 출력되어집니다.
(<예제>
위의
예제는 putc()함수를
이용하여 정수값 65를
표준출력장치로 보내어 65에
대응하는 아스키 코드값 ‘A’를
출력하게 됩니다.
<출력화면>
putchar()
putch()함수는 화면에 한개의 문자를 출력하는 함수입니다. putc()는 stream 을 지정하여 모니터 혹은 프린터나 그 이외의 장치에 stream을 보내 출력하는 함수이나 putch()함수는 단지 stdout, 즉 화면에만 출력을 해주는 함수입니다. Console을 기준으로 현재 커서가 위치해 있는 곳에 출력을 해주며 개행은 해주지 않습니다.
putch()함수의 사용법은 위의 putc()함수와 동일하나 stream을 화면으로만 보내주기에 stream을 지정할 필요가 없이 표현할 문자만 지정해 주시면 됩니다.
int putchar(int c);
원형은 위와 같으며 stdio.h 에 정의되어 있는 매크로 함수입니다.(매크로함수에 대한 설명은 다음에..)
#define putchar(c) putc((c), stdout)
즉 putc(c, stdout)를 putchar(c)로 바꿔서 쓰시는 거라고 생각하시면 되며 위의 putc()함수와 같은 결과물이 출력됩니다.
puts()
puts()함수는 문자열을 화면에 출력해주는 함수입니다.. putchar()함수와 마찬가지로 stream이 stdout만으로 지정되어 있으며, 특징은 문자열을 출력후 자동으로 개행(줄바꿈)을 해주는 함수입니다. 문자열끝에 개행문자가 들어가 있다면 개행을 두번하게 됩니다.
원형은
int puts(const char *s);
이며 stdio.h 파일안에 정의되어 있습니다.
이며 실행결과는
입니다. 첫번째 puts()함수에서 자동개행이 되어 “Hello World”를 출력후 줄바꿈이 되었습니다. 그리고 두번째 puts()함수의 문자열 끝에 개행문자를 추가했으므로 개행이 두번 일어났습니다. 세번째 puts()함수는 중간에 개행문자를 넣어 “Hello” 문자열을 출력후에 개행을 하고 “World” 문자열이 출력되었습니다.
나. 출력을 이용한 첫 C 프로그램
원래 printf()함수를 자세히 설명할 목차였으나, 위에서 기본적인 것들은 설명을 언급했으니, 책에서 좀 보기 힘든 소스를 사용하여 C 언어 출력 프로그램을 사용하겠습니다.
이 소스는 자기자신의 소스를 화면에 출력하는 소스로 어떤 고수분들은 이러한.. 출력을 이용해 여러가지 문자로 이루어진 이모티콘을 출력하시는 분들도 계십니다(믿거나말거나)
자 그럼 소스를 우선 보겠습니다.
#include<stdio.h>
int main(void)
{
char src[256] = "#include<stdio.h>%cint main(void)%c{%c%cchar src[256]=%c%s%c;%c%cprintf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c";
printf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);
return 0;
}
우선 위의 코드를 분석해 보도록 하겠습니다. main()함수안에 보시면 char *src 변수가 있습니다. src의 특징은 메모리가 부족하지 않는한 공간에 대한 제약이 없으며, 문자를 입력할 경우 맨 뒤에 자동으로 끝을 표시해주는 ‘\0’문자를 대입해줍니다.
src의 문자열 안에 보시면 그대로 코드가 들어가있습니다. 틀린점은 서식문자 차이일뿐
입니다.
printf() 의 안을 보시면
printf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);
와 같이 표시되어 있습니다.
printf()함수의 첫번째 인자는 기본 베이스가 되는 서식 문자열입니다. 그러면 화면에
문자열 src의 내용인
|
#include<stdio.h>%cint main(void)%c{%c%cchar src[256]=%c%s%c;%c%cprintf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c |
이 출력이 되게 됩니다. 그러면 그 뒤의 인수를 살펴 보도록 합시다.
printf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);
밑줄이 쳐진 부분을 보시면 숫자와 중간에 src문자열이 들어가 있고 그다음에 계속 10이 들어가 있습니다.
ASCII Code 표를 찾아보시면 ‘10’이 의미하는 것은 줄바꿈 밑 바뀐 출의 첫번째로 커서를 이동하는 LF 로 나와있습니다. LF는 Line Feed 즉 그 줄의 다음줄로 이동하는 것을 의미합니다. ‘9’가 의미하는 것은 Tab를 의미합니다. 그리고 34는 쌍따옴표 ‘”’ 를 의미합니다.
printf()에서는 쌍따옴표는 안의 내용의 시작과 끝을 정하는 표식이기 때문에 그대로 써준다면
char src[256] = “#include<stdio.h>%cint main(void)%c{%c%cchar src[256]=”%s”;%c%cprintf(src, 10, 10, 10, 9, 34, src, 34, 10, 9, 10, 9, 10, 10);%c%creturn 0;%c}%c
char src[256] 변수안에 저장되는 문자열이 밑줄친 부분 전에서 끝나게 되는 거죠. 물론 컴파일러는 오류라고 문구를 띄웁니다.
그것을 방지하기 위해 %c 로 ASCII코드표의 쌍따옴표에 해당하는 값인 34를 넣어 출력할때 치완을 해주는 것이죠.
중간에 보시면 src가 다시 들어가 있습니다. 이것은 src자체를 직접 출력하여 char src[256]안에 내용을 넣어주는 코드를 만드는 것이지요.
이후는 위의 ASCII Code 와 서식문자열을 대응시키면 쉽게 알 수 있을꺼라 생각하고 작동하는 그림을 보도록 하겠습니다.
위와 같이 코드를 작성후 컴파일을 해보고 출력을 하도록 해보겠습니다.
위와 같이 소스가 출력되며 이 소스를 가지고 출력 stream을 파일로 돌려서
C:\>printf.exe > printf(1).c
이 의미는 printf.exe 파일이 출력하는 내용들을 printf(1).c로 저장하라는 의미입니다.
즉 ‘>’ 의미는 뾰족한 부분쪽으로 출력하는 내용을 보내라는 의미이며, ‘<’ 는 입력을 받는 의미라 할수 있겠습니다.
이상으로 좀 복잡하지만 printf()함수의 여러 기능과 종류들을 알아 보았으며, 이해하기 어려우실 겁니다. 물론 저도 이해하기 어려워서 많은 고생을 했으며, 아직까지 말로 표현할만한 실력은 안되지만 어떻게는 설명을 할려고 노력을 했습니다.
저정도의 소스를 이해하신다면 이미 C Programing 의 초급은 무난히 이해하실 꺼라 생긱이 되며 이만 강좌를 마치도록 하겠습니다.
이올린에 북마크하기
이올린에 추천하기


