printf 함수의 기본
1. printf 는 출력을 위한 함수
- 특수 문자 출력이 가능하다.
\a alert 경고음(비프음) 소리
\b 백스페이스 backspace
\f 폼 피드 form feed
\n 개행 new line
\r 캐리지 리턴 carriage return 줄의 맨 처음으로 이동
\t 수평탭 tab 만큼 이동
\v 수직탭
\\ 백슬래시 \
\' 작은 따옴표
\" 큰따옴표
- 특수 문자 출력 예
앞집 강아지가 말했다. "멍! 멍! 귀엽다."
- printf 함수는 서식 지정이 가능하다
* f는 formatted 를 의미
* 서식지정 : 출력의 형태를 지정한다는 것을 의미. 문자열 안의 숫자 삽입
#include <stdio.h>
int main(void)
{
int age=12;
printf("10진수로 %d살이고 16진수로 %x살 입니다.", age, age);
return 0;
}
%c 단일 문자, 문자가 아닌 숫자가 들어오는 경우 아스키코드값이라고 인식하여 아스키코드값인 숫자를 문자로 바꿔 출력함
%d 부호있는 10진 정수
%s 문자열
%f 부호 있는 1진 실수
- 필드 폭을 지정하여 출력 가능
%8d 필드 폭을 8칸 확보하고 오른쪽 정렬해서 출력하라.
%-8d 필드 폭을 8칸 확보하고 왼쪽 정렬해서 출력하라.
%+8d 필드 폭을 8칸 확보하고 오른쪽 정렬한 상태에서 양수는+, 음수는 –를 붙여서 출력하라.
2. 예
/* printf01.c */
#include <stdio.h>
int main(void)
{
printf("Hello Everybody \n");
printf("%d \n", 1234);
printf("%d %d \n", 10, 20);
return 0;
}
#include <stdio.h> 3 : 4 : main() 5 : { 6 : int su1 = 1234; long su2 = 123456; 7 : /* long은 long int와 의미가 같다. */ 8 : 9 : printf("su1 = %d\n", su1); ① 10 : printf("su1 = %-6d\n", su1); ② 11 : printf("su1 = %7d\n", su1); ③ 12 : 13 : printf("su1 = %3d\n", su1); ④ 14 : printf("su2 = %ld\n", su2); ⑤ 15 : /* ld는 long 형 10진 정수형을 의미한다 */ 16 : } |
su1 = 1234 su1 = 1234__ su1 = ___1234 su1 = 1234 su2 = 123456 |
제어 문자 "%f"는 인수를 부동소수점수(이제부터 “실수”로 언급한다)로 출력한다. 사용 형식 “%[-m.n]f”에서 “[ ]” 부분은 생략가능한 부분이다. 여기에서 'm'은 소수점을 포함한 전체 자리수를 나타내며, 'n'은 소수점 이하 자리수를 나타낸다.
다음의 예제를 통하여 제어 문자 "%f"의 사용 방법을 알아보기로 하자.
1 : /* filename : ch4-3.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : float su1 = 123.456; 7 : float su2 = 12.3456789; 8 : double su3 = 1.23456789; 9 : 10 : printf("su1 = %f\n", su1); ① 11 : printf("su2 = %f\n", su2); 12 : printf("su1 = %6.2f\n", su1); ② 13 : printf("su3 = %11.8f\n", su3); ③ 14 : printf("su3 = %-11.8f\n", su3); ④ 15 : } |
su1 = 123.456001 su2 = 12.345679 su1 = 123.46 su3 = _1.23456789 su3 = 1.23456789_ |
① 인수를 제어 문자 "%f"로 출력하면, printf() 함수는 기본적으로 소수점 이하 6자리까지 출력한다. 그리고 11행에서와 같이 인수의 소수부가 6자리를 넘는 경우에는, 소수점 이하 7째 자리에서 반올림하여 출력한다.
그런데, 실행 결과를 자세히 살펴보면 소수점 이하 6째 자리가 6행에서 정의한 su1의 값과는 다르다는 것을 발견할 수 있을 것이다. 이러한 결과는 컴파일러 종류에 따라 다르며, 차이가 나는 값 자체는 무시할 정도로 미세하다. 이 결과는 아날로그(analog)인 수치를 디지털(digital) 형식의 컴퓨터로 표현할 때 생기는 불가피한 에러라고 보아도 무방하다.
② 제어 문자열 "%6.2f"에서는 인수의 값을 소수점 이하 2째 자리까지 출력하도록 지정하였으므로, 소수점 이하 3째 자리에서 반올림된 값이 출력된다.
③ 제어 문자열 "%11.8f"처럼 확장 기호 '-'를 생략하면, 인수의 값이 지정된 필드의 우측을 기준으로 출력된다.
④ 그러나, "%-11.8f"와 같이 확장 기호 '-'를 사용하면, 인수의 값이 지정된 필드의 좌측을 기준으로 출력된다.
■ 문자와 문자열의 출력 방법
제어 문자 "%c"는 인수를 하나의 문자로 출력하고, "%s"는 인수를 문자열로 출력한다.
다음은 제어 문자 "%c"와 "%s"가 사용되는 예를 보여주는 프로그램이다.
2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : char ch ='A', str[20] = "character string"; ① 7 : 8 : printf("문자 = %3c\n", ch); ② 9 : printf("문자열 = %-20s\n", str); ③ 10 : } |
문자 = __A 문자열 = character string____ |
① 단일 인용부호 내의 문자형 상수 'A'를 char 형 변수 "ch"에, 그리고 이중 인용부호 내에 포함되어 있는 문자열 상수 "character string"을 char 형 배열 "str"의 초기값으로 대입하였다. char 형 배열에 대한 자세한 내용은 10장을 참조하기 바란다.
② 출력 인수 "ch"의 필드 폭을 3자리로 확보해 두고 필드의 우측을 기준으로 출력한다.
③ 제어 문자열에 확장 기호 '-'가 포함된 경우에는, 지정한 필드 폭 만큼의 자리수를 정해놓고 필드의 좌측을 기준으로 출력한다.
그리고 8행, 9행에서와 같이 지정된 필드의 폭이 출력될 인수 값의 자리수보다 큰 경우에는 나머지 자리수를 공백으로 채운다.
2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int kor, mat, eng, number; 7 : float average; 8 : 9 : printf("학번을 입력하세요... "); 10 : scanf("%d", &number); ① 11 : printf("3과목 성적을 입력하세요... "); 12 : scanf("%d %d %d", &kor, &mat, &eng); 13 : average = (float) (kor + mat + eng) / 3.0; ② 14 : printf("학번 %d : 성적 평균 = %4.1f\n", number, average); 15 : } |
학번을 입력하세요... 1123ꏮ 3과목 성적을 입력하세요... 94 87 91ꏮ 학번 1123 : 성적 평균 = 90.7 |