chapter 05. 입출력 함수
printf함수 제대로 사용하기 printf함수는 출력할 데이터를 괄호 안에 넣어주는데 이것을 전달인자라고 한다. 전달인자의 수는 출력되는 값에 따라 가변적이지만 첫번째는 반드시 문자열을 사용해야 한다.
문자열을 그대로 화면에 출력하는 경우에 사용한다. ▶ 전달인자가 문자열 하나인 경우 문자열을 그대로 화면에 출력하는 경우에 사용한다. printf(“C언어는 1972년 데니스리치가 개발하였습니다.”); C언어는 1972년 데니스리치가 개발하였습니다. 서식문자를 사용하면 다양한 형태로 출력할 수 있다. printf(“C언어는\n1972년\n데니스리치가 개발하였습니다.”); C언어는 1972년 데니스리치가 개발하였습니다.
▶ 다양한 서식문자 서식문자에는 줄바꿈문자 외에도 여러 가지가 있다. 의미 기능 \n newline 출력 위치를 다음 줄의 첫번째 칸으로 옮긴다. \t tab 출력 위치를 다음 탭 위치로 옮긴다. \r carriage return 출력 위치를 현재 줄의 첫번째 칸으로 옮긴다. \b backspace 출력 위치를 한 칸 뒤로 옮긴다. \a alert 경보음을 낸다(삑 소리가 난다). 큰 따옴표나 백슬래시 자체를 출력할 때도 백슬래시를 사용한다.
▶ 문자열 외에 출력할 데이터가 있는 경우 단순한 문자열 외에 출력할 데이터가 있는 경우 출력할 데이터의 개수에 맞게 변환문자열을 사용한다.
자료형에 따른 변환문자열의 사용은 다음과 같다. ▶ 변환문자열 정리 자료형에 따른 변환문자열의 사용은 다음과 같다. 구분 변환문자열 출력 형태 대상 자료형 정수형 %d 부호 있는 10진수 signed형의 정수형 변수, 상수 %u 부호 없는 10진수 unsigned형의 정수형 변수, 상수 %o 부호 없는 8진수 signed, unsigned 구분 없이 정수형 데이터를 각 진법에 맞게 출력 %x 부호 없는 16진수 실수형 %lf 부호 있는 소수점 형태 실수형 변수, 상수 %le 부호 있는 지수 형태 문자형 %c 하나의 문자 char형 변수, 문자상수 문자열 %s char형 배열의 이름, 문자열상수
▶ 다양한 변환문자열을 사용한 예제 #include <stdio.h> int main() { char ch='A'; char name[80]="황금박쥐"; int in=10; double db=16.8; printf("정수형 상수의 출력 : %d\n", -10); printf("정수형 변수의 출력 : %d\n", in); printf("정수형 수식의 출력 : %d\n", in/3); printf("실수형 상수를 소수점 형태로 출력 : %lf\n", 2.5); printf("실수형 변수를 지수 형태로 출력 : %le\n", db); printf("실수형 수식을 소수점 형태로 출력 : %lf\n", db/4); printf("문자상수의 출력 : %c\n", 'F'); printf("문자변수의 출력 : %c\n", ch); printf("문자 배열의 출력 : %s\n", name); printf("문자열상수의 출력 : %s\n", "날아라 태극호"); return 0; } 출력 형태 -10 10 3 2.500000 1.680000e+001 4.200000 F A 황금박쥐 날아라 태극호
변환문자열의 정확한 사용법 컴파일러는 변환문자열과 출력할 데이터가 일치하는지 확인하지 않는다. 따라서 자료형에 맞게 정확한 변환문자열을 사용해야 한다.
%d와 %u는 출력할 데이터를 각각 다르게 해석한다. 정수값의 각 범위에 맞는 적절한 변환문자열은 다음과 같다.
▶ 정수형과 문자형 변환문자열의 선택(%d, %c) 문자상수와 그에 해당하는 아스키코드값은 크기가 같으므로 어떤 변환문자열을 사용하느냐에 따라 정수값이 출력되거나 문자가 출력된다. 특정 아스키코드값에 해당하는 문자를 확인하는 코드 int a; // char형 변수를 사용해도 가능하다. printf(“아스키코드값을 입력하세요 : ”); scanf(“%d”, &a); printf(“아스키문자는 %c입니다.\n”, a); 아스키코드값을 입력하세요 : 97 (엔터) 아스키문자는 a입니다. %문자를 출력할 때는 %기호를 두 번 사용한다. printf(“당신은 나의 100%% 여인입니다.”);
세련된 출력을 지원하는 변환문자열의 옵션 필드옵션은 화면에 출력할 자릿수를 확보하고 오른쪽에 정렬하여 출력한다. 실수값을 출력할 때는 필드옵션에 소수점 이하의 자릿수를 지정할 수 있다. 플래그옵션은 필드옵션과 함께 사용하여 출력 형식에 변화를 준다.
▶ 필드옵션의 여러 가지 사용 예 #include <stdio.h> int main() { printf("12345678901234567890\n"); printf("%10c\n", 'A'); printf("%10d\n", 128); printf("%10lf\n", 3.1415926); printf("%10le\n", 3.1415926); printf("%10.3lf\n", 3.1415926); printf("%10.4s\n", "Love is"); printf("%5lf\n", 3.1415926); return 0; } 출력 형태 12345678901234567890 A 128 3.141593 3.141593e+000 3.142 Love
▶ 여러 가지 플래그 옵션 필드옵션을 사용하고 왼쪽에 맞추어 출력할 때는 ‘-’플래그를 사용한다. ‘0’플래그는 확보된 공간에서 남는 왼쪽공간을 모두 0으로 채운다. ‘+’플래그는 부호를 함께 출력한다. ‘#’플래그는 8진수와 16진수를 출력할 때 접두어를 붙여준다. 출력 형태 printf("12345678901234567890\n"); printf(“%-10c%c\n”, ‘A’, ‘B’); printf(“%010d\n”, 1971); printf(“%+d\n”, 128); printf(“%#x\n”, 2005); printf(“%#010x\n”, 0x7d5); 12345678901234567890 A B 0000001971 +128 0x7d5 0x000007d5
scanf함수의 첫번째 전달인자는 변환문자열이며 두 번째 전달인자부터 입력 받을 변수를 차례로 나열한다. scanf(“%d %c\n”, &age, &blood_type); 불필요한 문자!!
▶ scanf함수의 기본적인 사용법 입력에 사용되는 변환문자열은 기본적으로 printf함수와 같다. 구분 변환문자열 입력 형태 입력되는 변수의 자료형 정수형 %d, %u 10진수 char, short, int, long형 변수 %o 8진수 %x 16진수 실수형 %lf, %le 소수점 또는 지수형 double형 변수 문자형 %c 하나의 문자 char형 변수 문자열 %s 하나의 문자열 char 배열 scanf함수는 값을 저장할 변수의 위치를 알아야 하므로 변수명에 ‘&’를 붙여야 한다(단, 배열명에는 붙이지 않는다).
▶ scanf함수는 변환문자열을 정확히 사용해야 한다. scanf함수는 입력 데이터의 구분을 화이트스페이스(스페이스, 엔터, 탭)으로 한다(%d, %lf, %s변환문자열). scanf(“%d%d”, &a, &b); 10 20 (엔터) 공백으로 데이터를 구분 %c변환문자열은 화이트스페이스도 하나의 데이터로 입력 받는다. scanf(“%c%c”, &a, &b); x y (엔터) 공백을 데이터로 입력 화이트스페이스를 구분문자로 사용하기 위해서는 %c변환문자열 앞에 공백을 사용한다. scanf(“%c %c”, &a, &b); 공백을 사용하면 b에 y를 입력 받게 된다.