Chapter 4. 표준 입출력 함수
Chaper 4. 표준 입출력 함수 4.1 표준 출력 함수 4.2 표준 입력 함수
printf( "형식 지정 제어 문자열", 인수1, 인수2, ... ); C 언어에서 표준 출력은 printf( ) 등의 출력 함수에 의해서 이루어진다. 4.1.1 printf() 함수 표준 출력 함수 printf()의 사용 형식은 다음과 같다. 4.1 표준 출력 함수 printf( "형식 지정 제어 문자열", 인수1, 인수2, ... ); printf() 함수는 출력되는 인수의 형식을 지정하는 형식 지정 제어 문자열(이제부터 간략하게 “제어 문자열”로 언급한다)과 인수 리스트로 구성되며, 인수의 출력 형식을 지정하는 "%d"나 "%f"와 같은 제어 문자는 반드시 이중 인용부호(" ") 내에 기술되어야 한다. 그리고 인수로는 상수, 변수 또는 식이 사용될 수 있으며, 인수가 2개 이상인 경우에는 컴머(,)로 인수들을 구분하여야 한다. 그러면 앞에서 설명한 사용 형식에 의해 printf() 함수가 실제로 사용되는 예를 살펴보기로 하자.
예제 4.1 printf() 함수 사용 예와 실행 결과 1 : /* filename : ch4-1.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int su1 = 5, su2 = 6, gop; 7 : 8 : gop = su1 * su2; 9 : printf("*** 연산 결과 ***\n"); ① 10 : printf("%d와 %d의 곱은 %d입니다.\n", su1, su2, gop); ② 11 : } *** 연산 결과 *** 5와 6의 곱은 30입니다. 예제 4.1 프로그램 설명 ① 여기에 사용된 printf() 함수에서는 인수가 지정되지 않았다. 이중 인용부호 내에 포함된 문자열 메시지의 내용만을 화면에 출력하려는 경우에는 9행처럼 인수를 생략해도 상관없다. ② 10행의 printf() 함수에서는 이중 인용부호 내의 제어 문자열에 문자열 메시지와 함께 "%d"라는 제어 문자가 함께 지정되어 있다. 이 제어 문자열에서는 3개의 "%d" 제어 문자를 포함하고 있으므로, 컴머로 구분된 인수도 3개(su1, su2, gop)이다. 여기서 각 인수들은 차례대로 제어 문자 "%d"의 위치에 대응되어 그 값이 출력될 것이다.
예제 4-1의 printf() 함수에서 사용되는 '\n'은 출력을 위한 커서(cursor)의 위치를 다음 행의 시작 위치로 이동시키는 기능을 가지는 제어 문자이다. 제어 문자 '\n'에서 n은 “new line”을 의미하고, 'n' 앞에 붙인 기호 '\'은 제어 문자 '\n'을 일반 영어 소문자 n과 구별하기 위하여 사용한 것이다. 그리고 제어 문자 '\n'은 '\'와 'n'이라는 2개의 문자가 결합된 것 같지만, '\n'은 내부적으로 하나의 코드 값을 가지는 단일 문자이다. ▷ 표 4.1 : ESCAPE 문자의 종류와 기능 ESCAPE 문자 기 능 내부 코드 (ASCII) 값 '\n' new line (새로운 줄로 이동) 10 '\r' carriage return (줄의 처음으로) 13 '\b' back space (한 문자 왼쪽으로) 8 '\t' tab (탭 크기만큼 이동) 9 '\f' form feed (프린트 용지 바꿈) 12 '\a' alarm (벨 소리 냄) 7
1) 형식 지정 제어 문자 printf() 함수를 이용하여 인수를 출력하는 경우, 인수의 값을 적절하게 표현하기 위해서는, '%'로 시작하는 형식 지정 제어 문자(이제부터 간략하게 “제어 문자”로 언급한다)를 사용하여야 한다. 다음의 표 4.2는 printf() 함수에서 인수를 출력할 때 사용하는 제어 문자의 종류와 이에 따른 출력 결과를 나타낸다. ▷ 표 4.2 : 출력 형식 지정 제어 문자의 종류와 출력 결과 제어 문자 출력 결과 %d 10진(Decimal) 정수 %o 8진(Octal) 정수 %x 16진(heXa-decimal) 정수 %u 부호없는(Unsigned) 10진 정수 %f 10진형 부동(Floating)소수점수 %e 지수형(Exponential) 부동소수점수 %c 단일 문자(Character) %s 문자열(String)
그리고, 다음의 표 4.3은 앞에서 설명한 제어 문자의 기능을 확장하기 위하여 사용하는 확장 기호의 종류와 기능을 나타낸다. ▷ 표 4.3 : 출력 형식 지정 제어 문자의 확장 기호 확장 기호 기능 사용 예 m 출력되는 인수의 필드 폭을 표시. %5d %3c - 인수의 값을 필드의 좌측 기준으로 출력. 우측에 남는 공간은 공백으로 채움. %-7d %-10c m.n 실수형 인수 출력시, 자리수를 표시. m : 소수점을 포함한 전체 자리수. n : 소수점 이하 자리수. %12.3f %-10.5f l(or L) 출력 인수가 정수인 경우 : long int 형 출력 인수가 실수인 경우 : double 형 %ld, %Ld %lf, %Lf 이와 같이 표 4.2와 표 4.3에서 설명한 제어 문자와 확장 문자를 적절하게 사용하면, 프로그램에서 처리된 결과를 프로그래머가 원하는 형식으로 출력할 수 있다. 그러면 이제부터 이 문자들을 사용하여 인수의 값을 출력하는 방법에 대하여 살펴보기로 하자.
■ 10진 정수의 출력 방법 제어 문자 "%d"는 인수를 10진 정수로 출력한다. 사용 형식 “%[-m]d”에서 “[ ]” 부분은 생략가능한 부분으로 확장 기호 '-'는 인수의 값을 필드의 좌측을 기준으로 출력할 때 사용하며, 'm'은 출력할 값의 폭(width)을 지정할 때 사용한다. 그러면 다음 예제를 통하여 제어 문자 "%d"의 사용 방법을 알아보자. 실행 결과에 나타난 _는 공백을 의미하며 실제 화면에 문자로 표시되지는 않는다. 예제 4.2 10진 정수의 출력 예와 실행 결과 1 : /* filename : ch4-2.c */ 2 : #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 su2 = 123456
예제 4.2 프로그램 설명 ① "%d"와 같이 출력할 인수 값의 폭을 지정하지 않으면, 인수 su1이 출력될 만큼의 자리만을 확보하여 출력한다. 여기에서 su1의 값이 “1234”이므로 4자리가 확보될 것이다. ② "%-6d"와 같이 확장 기호 '-'가 있으면, 인수 su1의 값을 지정된 6자리 필드의 좌측을 기준으로 출력한다. ③ "%7d"와 같이 확장 기호 '-'가 없으면, 필드 폭을 7자리로 확보해 두고 인수 su1의 값을 필드의 우측을 기준으로 출력한다. 10행, 11행과 같이 제어 문자열에서 지정한 필드의 폭이 출력할 값의 자리수 보다 큰 경우에는, 전체 필드에서 남은 자리를 공백(' ')으로 채운다. ④ 그러나, 13행에서와 같이 제어 문자열에서 지정한 필드의 폭이 출력할 값의 자리수 보다 작은 경우에는, 제어 문자열에서 지정한 필드의 폭을 무시하고 인수 su1의 값이 출력될 수 있는 만큼의 자리수를 확보하여 출력한다. su1의 값이 “1234”이므로 4자리가 확보될 것이다. ⑤ 자료형이 long 형(long int 형)인 경우에는 제어 문자 "%ld"를 사용하여야 한다. 여기서 'l'은 “long”을 의미한다. 만약 인수 su2를 "%d"로 지정하여 출력하면 오버플로우(overflow, =범람)가 발생할 것이다.
■ 부동소수점수의 출력 방법 제어 문자 "%f"는 인수를 부동소수점수(이제부터 “실수”로 언급한다)로 출력한다. 사용 형식 “%[-m.n]f”에서 “[ ]” 부분은 생략가능한 부분이다. 여기에서 'm'은 소수점을 포함한 전체 자리수를 나타내며, 'n'은 소수점 이하 자리수를 나타낸다. 다음의 예제를 통하여 제어 문자 "%f"의 사용 방법을 알아보기로 하자. 예제 4.3 실수의 출력 예와 실행 결과 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_
예제 4.3 프로그램 설명 ① 인수를 제어 문자 "%f"로 출력하면, printf() 함수는 기본적으로 소수점 이하 6자리까지 출력한다. 그리고 11행에서와 같이 인수의 소수부가 6자리를 넘는 경우에는, 소수점 이하 7째 자리에서 반올림하여 출력한다. 그런데, 실행 결과를 자세히 살펴보면 소수점 이하 6째 자리가 6행에서 정의한 su1의 값과는 다르다는 것을 발견할 수 있을 것이다. 이러한 결과는 컴파일러 종류에 따라 다르며, 차이가 나는 값 자체는 무시할 정도로 미세하다. 이 결과는 아날로그(analog)인 수치를 디지털(digital) 형식의 컴퓨터로 표현할 때 생기는 불가피한 에러라고 보아도 무방하다. ② 제어 문자열 "%6.2f"에서는 인수의 값을 소수점 이하 2째 자리까지 출력하도록 지정하였으므로, 소수점 이하 3째 자리에서 반올림된 값이 출력된다. ③ 제어 문자열 "%11.8f"처럼 확장 기호 '-'를 생략하면, 인수의 값이 지정된 필드의 우측을 기준으로 출력된다. ④ 그러나, "%-11.8f"와 같이 확장 기호 '-'를 사용하면, 인수의 값이 지정된 필드의 좌측을 기준으로 출력된다.
다음 예제를 통하여 8진 정수, 16진 정수의 출력 방법에 대하여 알아보자. ■ 8진 정수와 16진 정수의 출력 방법 다른 프로그래밍 언어가 10진 정수만을 주로 사용하는데 비하여, C 언어에서는 8진, 10진 그리고 16진 정수를 자유롭게 사용할 수 있다. 진법이 다른 이들 정수들은 서로 다른 제어 문자에 의해 표현되는데, 8진 정수를 출력하려는 경우에는 제어 문자 "%o"를 사용하여야 하며, 16진 정수를 출력하려는 경우에는 제어 문자 "%x"를 사용하여야 한다. 다음 예제를 통하여 8진 정수, 16진 정수의 출력 방법에 대하여 알아보자. 예제 4.4 8진 정수와 16진 정수의 출력 예와 실행 결과 1 : /* filename : ch4-4.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int su1 = 27, su2 = 053, su3 = 0xca, sum = 0; ① 7 : sum = su1 + su2 + su3; 8 : 9 : printf("sum = %d (10진수)\n", sum); ② 10 : printf("sum = %o ( 8진수)\n", sum); 11 : printf("sum = %x (16진수)\n", sum); 12 : } sum = 272 (10진수) sum = 420 ( 8진수) sum = 110 (16진수) 예제 4.4 프로그램 설명 ① int 형 변수 su1, su2, su3를 정의하고, 초기값으로 su1에는 10진 정수 “27”, su2에는 8진 정수 “053” 그리고 su3에는 16진 정수 “0xCA”를 대입하였다. ② 9, 10, 11행에서는 변수 su1, su2, su3의 합을 10진, 8진 그리고 16진 정수로 각각 출력하였다.
제어 문자 "%c"는 인수를 하나의 문자로 출력하고, "%s"는 인수를 문자열로 출력한다. ■ 문자와 문자열의 출력 방법 제어 문자 "%c"는 인수를 하나의 문자로 출력하고, "%s"는 인수를 문자열로 출력한다. 다음은 제어 문자 "%c"와 "%s"가 사용되는 예를 보여주는 프로그램이다. 예제 4.5 문자와 문자열의 출력 예와 실행 결과 1 : /* filename : ch4-5.c */ 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____
예제 4.5 프로그램 설명 ① 단일 인용부호 내의 문자형 상수 'A'를 char 형 변수 "ch"에, 그리고 이중 인용부호 내에 포함되어 있는 문자열 상수 "character string"을 char 형 배열 "str"의 초기값으로 대입하였다. char 형 배열에 대한 자세한 내용은 10장을 참조하기 바란다. ② 출력 인수 "ch"의 필드 폭을 3자리로 확보해 두고 필드의 우측을 기준으로 출력한다. ③ 제어 문자열에 확장 기호 '-'가 포함된 경우에는, 지정한 필드 폭 만큼의 자리수를 정해놓고 필드의 좌측을 기준으로 출력한다. 그리고 8행, 9행에서와 같이 지정된 필드의 폭이 출력될 인수 값의 자리수보다 큰 경우에는 나머지 자리수를 공백으로 채운다.
다음은 제어 문자 "%e"의 사용 예를 나타내는 프로그램이다. 예제 4.6 지수형 실수의 출력 예와 실행 결과 ■ 지수형 부동소수점수의 출력 방법 제어 문자 "%e"는 인수를 지수형 실수로 출력한다. 일반적으로 "%e"는 10진형 실수의 출력에 사용되는 "%f"에 비해 매우 크거나 매우 작은 실수를 출력할 때 사용한다. 다음은 제어 문자 "%e"의 사용 예를 나타내는 프로그램이다. 예제 4.6 지수형 실수의 출력 예와 실행 결과 1 : /* filename : ch4-6.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : float su = 1234567.89; 7 : 8 : printf("su = %e\n", su); ① 9 : printf("su = %9.4e\n", su); ② 10 : } < Turbo C 2.0 > su = 1.23457e+06 su = 1.235e+06 < Borland(Turbo) C++ > su = 1.234568e+06 su = 1.2346e+06 < Visual C++ > su = 1.234568e+006 su = 1.2346e+006
예제 4.6 프로그램 설명 ① 제어 문자 "%e"를 사용하여 실수를 지수형으로 출력하면, 기본적으로 소수점 이상 1자리와 소수점 이하 5자리로 화면에 표시된다. 이때, 출력되는 값의 소수부가 5자리를 넘으면, 소수점 이하 6째 자리에서 반올림되어 출력될 것이다. ② 그리고, 9행에서는 출력되는 인수의 전체 자리수를 9자리로, 소수점 이하 자리수를 4자리로 지정하여 출력하였다. 이때 소수점은 소수점 이하 자리수에 포함된다는 것에 주의하기 바란다.
제어 문자 "%u"는 인수를 부호없는 10진 정수로 출력한다. 다음은 제어 문자 "%u"의 사용 예를 나타내는 프로그램이다. ■ 부호없는 10진 정수의 출력 방법 제어 문자 "%u"는 인수를 부호없는 10진 정수로 출력한다. 다음은 제어 문자 "%u"의 사용 예를 나타내는 프로그램이다. 예제 4.7 부호없는 10진 정수의 출력 예와 실행 결과 1 : /* filename : ch4-7.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : unsigned su = 43210; 7 : 8 : printf("su = %d\n", su); ① 9 : printf("su = %u\n", su); ② 10 : } < Turbo C 2.0 / Borland(Turbo) C++ > su = -22326 su = 43210 < Visual C++ >
예제 4.7 프로그램 설명 ① "su"를 10진 정수로 출력하였다. 여기에서는 인수 "su"의 값이 정수형으로 나타낼 수 있는 최대값(32767)보다 크므로, 제어 문자 "%d"로 출력하면 오버플로우(overflow)가 발생하여 이상한 결과가 표시된다. ② 그러나, 9행에서와 같이 "su"를 부호없는 10진 정수를 의미하는 제어 문자 "%u"로 출력하면 오버플로우가 발생하지 않는다. 그 이유는 양수만 나타내는 부호없는 정수는 부호가 있는 정수에 비해 표현할 수 있는 양의 정수 범위가 약 2배 정도 크기 때문이다. 부호가 있는 일반 정수의 표현 범위는 -32768~32767이며, 부호없는 정수의 표현 범위는 0~65535이다.
4.1.2 putchar() 함수 C 언어에서 putchar() 함수는 단일 문자를 표준 출력 장치인 모니터 화면에 출력하는 기능을 제공한다. putchar() 함수의 사용 형식은 다음과 같다. putchar( 인수 ); putchar() 함수는 문자형 상수 또는 문자형 변수를 인수로 가지며, 인수에 해당하는 문자를 화면에 출력한다. 만약 인수가 정수인 경우에는, 그 정수값에 대응되는 ASCII 문자가 출력될 것이다. 다음은 putchar() 함수의 사용 예를 나타낸다.
Q K B 예제 4.8 putchar() 함수의 사용 예와 실행 결과 예제 4.8 프로그램 설명 1 : /* filename : ch4-8.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : char ch = 'Q'; 7 : 8 : putchar(ch); printf("\n"); ① 9 : putchar('K'); printf("\n"); ② 10 : putchar(66); printf("\n"); ③ 11 : } Q K B 예제 4.8 프로그램 설명 ① char 형 변수 "ch"에 저장된 단일 문자를 화면에 출력하였다. ② 문자형 상수 'K'를 화면에 출력하였다. ③ ASCII 코드 값이 “66”인 문자를 화면에 출력하였다.
scanf( "형식 지정 제어 문자열", 인수1, 인수2, ... ); 4.2 표준 입력 함수 C 언어에서 표준 입력은 scanf() 등의 입력 함수에 의해 이루어진다. 4.2.1 scanf() 함수 C 언어에서 사용되는 표준 입력 함수 scanf()의 사용 형식은 다음과 같다. scanf( "형식 지정 제어 문자열", 인수1, 인수2, ... ); scanf() 함수는 위의 사용 형식에서와 같이, 입력되는 자료의 형식을 지정하는 형식 지정 제어 문자열(이제부터 간략하게 “제어 문자열”로 언급한다)과 입력된 자료의 값이 대입되는 인수 리스트로 구성된다. scanf() 함수는 printf() 함수와 사용 방법이 거의 유사하며, printf() 함수와 같이 인수의 형식을 지정하는 "%d"나 "%f"와 같은 제어 문자를 반드시 이중 인용부호(" ") 내에 기술하여야 한다. 그리고, 인수가 2개 이상인 경우에는 컴머(,)로 인수들을 구분하여야 한다. 여기에서 scanf() 함수가 사용되는 예를 살펴보기로 하자.
예제 4.9 scanf() 함수의 사용 예와 실행 결과 정수 2개를 입력하세요... 56 78ꏮ 두 수의 합은 134 입니다. 1 : /* filename : ch4-9.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int num1, num2, hap; 7 : 8 : printf("정수 2개를 입력하세요... "); 9 : scanf("%d %d", &num1, &num2); ① 10 : hap = num1 + num2; 11 : printf("두 수의 합은 %d 입니다.", hap); 12 : } 정수 2개를 입력하세요... 56 78ꏮ 두 수의 합은 134 입니다. 예제 4.9 프로그램 설명 ① “scanf("%d %d", &num1, &num2);” 문장의 의미는 키보드를 통하여 이중 인용부호 내에서 지정한 10진 정수형(%d) 자료 두 개를 입력받아서, 그 값을 "num1"과 "num2"라는 인수에 각각 대입하라는 것이다. 여기에서 변수명 앞에 있는 &(ampersand, ‘앰퍼샌드’라고 읽음) 기호는 주소 연산자로서 "&num1"은 변수 "num1"이 위치하고 있는 주기억 장소의 주소를 의미한다. scanf() 함수의 인수로 사용되는 변수가 포인터형이 아닌 일반 변수인 경우에는 변수명 앞에 무조건 &를 붙인다고 기억해 두면 된다. 주소 연산자나 포인터형에 대해서는 11장을 참조하기 바란다.
1) 형식 지정 제어문자 scanf() 함수에 의해 입력되는 자료의 형식은 이중 인용부호 내에서 '%' 기호로 시작하는 제어 문자에 의해 결정된다. 다음의 표 4.4는 scanf() 함수에 의해 입력되는 자료의 형식을 지정하기 위하여 사용하는 제어 문자의 종류를 나타낸다. ▷ 표 4.4 : 입력 형식 지정 제어 문자의 종류 제어문자 입력 형식 %d 10진(Decimal) 정수 %o 8진(Octal) 정수 %x 16진(heXa-decimal) 정수 %u 부호없는(Unsigned) 10진 정수 %f 10진형 부동(Floating)소수점수 %e 지수형(Exponential) 부동소수점수 %c 단일 문자(Character) %s 문자열(String)
그리고 표 4.5는 위에서 설명한 제어 문자의 기능을 확장하기 위하여 사용되는 확장 기호를 나타낸다. ▷ 표 4.5 : 입력 형식 지정 제어 문자의 확장 기호 확장 기호 기능 사용 예 m 입력되는 자료의 필드 폭을 표시. %5d %3c l(or L) 입력 인수가 정수인 경우 : long int 형 입력 인수가 실수인 경우 : double 형 %ld %lf 이제부터 표 4.4와 표 4.5에서 언급한 제어 문자, 확장 문자를 사용하여 프로그램에서 필요한 자료를 입력받는 방법에 대하여 알아보기로 하자.
■ 10진 정수의 입력 방법 표준 입력 함수 scanf()를 통하여 10진 정수를 입력받기 위해서는, 제어 문자로 "%d"를 사용하여야 한다. 예제 4.10 10진 정수의 입력 예와 실행 결과 1 : /* filename : ch4-10.c */ 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
예제 4.10 프로그램 설명 ① scanf() 함수를 통해 임의의 자료를 입력받는 경우, 입력 자료에 관련된 메시지를 9행과 같이 printf() 함수로 먼저 표시하면 정확한 자료의 입력에 도움이 될 것이다. ② int 형 변수 "kor", "mat", "eng"의 평균값을 float 형으로 변환하기 위하여, cast 연산자 "(float)"를 사용하였다.
■ 부동소수점수의 입력 방법 표준 입력 함수 scanf()를 통하여 실수를 입력받기 위해서는, 제어 문자로 "%f"를 사용하여야 한다. 다음은 실수의 입력 방법을 보여주는 프로그램이다. 예제 4.11 실수의 입력 예와 실행 결과 1 : /* filename : ch4-11.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : float su; 7 : 8 : printf("실수를 하나 입력하세요... "); scanf("%f", &su); 9 : printf("su = %6.3f", su); ① 10 : } 실수를 하나 입력하세요... 12.3456ꏮ su = 12.346 예제 4.11 프로그램 설명 ① 8행에서 입력된 실수를 전체 6자리, 소수점 이하 3자리로 출력하였다. 따라서 입력된 실수는 소수점 이하 4째 자리에서 반올림되어 출력된다.
① 3자리의 영문자를 입력받아서, 인수 "ch1", "ch2", "ch3"에 각각 대입하였다. ■ 문자와 문자열의 입력 방법 scanf() 함수를 통하여 문자를 입력받기 위해서는, 제어 문자로 "%c"를 사용하여야 하며, 문자열을 입력받기 위해서는 제어 문자로 "%s"를 사용하여야 한다. 다음은 문자의 입력 방법을 보여주는 프로그램이다. 예제 4-12 문자의 입력 예와 실행 결과 1 : /* filename : ch4-12.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : char ch1, ch2, ch3; 7 : 8 : printf("이름의 첫 글자를 3자리의 영문자로 입력하세요... "); 9 : scanf("%c %c %c", &ch1, &ch2, &ch3); ① 10 : printf("나의 성은 %c%c%c 입니다.\n", ch1, ch2, ch3); ② 11 : printf("나의 성은 %c %c %c 입니다.\n", ch1, ch2, ch3); 12 : } 이름의 첫 글자를 3자리의 영문자로 입력하세요,... Kimꏮ 나의 성은 Kim 입니다. 나의 성은 K i m 입니다. 예제 4-12 프로그램 설명 ① 3자리의 영문자를 입력받아서, 인수 "ch1", "ch2", "ch3"에 각각 대입하였다. ② 인수 "ch1", "ch2", "ch3"에 저장되어 있는 문자들을 출력한다. 그러나 10행과 11행의 실행 결과처럼, 이중 인용부호 내에서 지정한 출력 형식에 따라 동일한 내용도 다르게 출력할 수 있다.
다음의 예제에서는 문자열을 입력하는 방법에 대하여 설명하고 있다 다음의 예제에서는 문자열을 입력하는 방법에 대하여 설명하고 있다. 이 예제를 실행시킬 때는 반드시 아래의 실행 결과를 미리 참조하기 바란다. 예제 4.13 문자열의 입력 예와 실행 결과 1 : /* filename : ch4-13.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : char name1[30], name2[30]; 7 : printf("이름을 입력하세요! "); scanf("%s", name1); ① 8 : printf(“이름을입력하세요! ");scanf("%s", name2); 9 : printf("나의 이름은 %s 입니다.\n", name1); 10: printf("나의 이름은 %s 입니다.\n", name2); ② 11: } 이름을 입력하세요! Hong,Gil-Dongꏮ 이름을 입력하세요! Hong Gil Dongꏮ 나의 이름은 Hong,Gil_Dong 입니다. 나의 이름은 Hong 입니다.
예제 4.13 프로그램 설명 ① scanf() 함수를 통하여 문자형 배열로 문자열을 입력받을 경우에는 변수명 앞에 '&'를 붙이지 않는다. C 언어에서 문자열은 1차원 배열로 취급되며, 배열명은 배열 첫 번째 원소의 주소를 나타낸다. 따라서 7행에서 배열명 "name1"은 "&name1[0]"을 나타내므로, scanf() 함수에서 인수가 배열인 경우에는 배열명 앞에 주소 연산자 '&'를 붙이지 않는다. 자세한 내용은 10, 11장을 참조하기 바란다. ② 10행의 실행 결과와 같이, 입력되는 문자열 사이에 공백이 있으면 첫 번째 나타나는 공백 이후의 문자열은 무시된다. 그러므로 scanf() 함수로 문자열을 입력할 경우에는, "Hong,Gil-Dong"과 같이 문자열 사이에 공백이 없도록 하여야 원하는 결과를 얻을 수 있을 것이다.
다음의 두 예제는 scanf() 함수 사용시 주의할 사항에 대하여 설명한다. 예제 4.14 scanf() 함수 사용시 주의 사항 (1) 1 : /* filename ch4-14.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int su1, su2, sum; 7 : 8 : printf("정수 두 개를 입력하세요... "); 9 : scanf("%d %d\n", &su1, &su2); ① 10 : sum = su1 + su2; 11 : printf("두 정수의 합은 %d 입니다.\n", sum); 12 : } 정수 두 개를 입력하세요... 2 3 4ꏮ 두 정수의 합은 5 입니다.
예제 4.14 프로그램 설명 ① 이 예제는 10진 정수 두 개를 입력받아서 합을 구한 후, 그 결과를 출력하는 내용으로 작성되어 있다. 이 프로그램에서는 9행의 scanf() 함수가 실행될 때, 지정된 대로 두 개의 정수를 입력하여도 프로그램은 제대로 실행되지 않고 커서가 새로운 입력을 기다리는 상태로 계속 대기한다. 이러한 상황은 표준 출력 함수 printf()에서 사용하는 ESCAPE 문자 '\n'을 표준 입력 함수 scanf()에서 사용하였기 때문이다. '\n'과 같은 ESCAPE 문자들은 printf()와 같은 출력 함수에서만 사용하도록 정의되었기 때문에 입력 함수인 scanf() 함수에서는, 비록 문법 에러를 발생시키지는 않지만, 제대로 동작하지 않으므로 사용하지 않도록 주의하여야 한다. 이 예제를 강제로 실행시키기 위해서는, 실행 결과에 나타나 있듯이, 의미 없는 값을 하나 더 추가로 입력하여야 한다.
예제 4.15 scanf() 함수 사용시 주의 사항 (2) 1 : /* filename ch4-15.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int su1, su2, sum; 7 : 8 : printf("정수 두 개를 입력하세요... "); 9 : scanf("%d %d ", &su1, &su2); ① 10 : sum = su1 + su2; 11 : printf("두 정수의 합은 %d 입니다.\n", sum); 12 : } 정수 두 개를 입력하세요... 4 5 6ꏮ 두 정수의 합은 9 입니다. 예제 4.15 프로그램 설명 ① 이 예제에서도 9행의 scanf() 함수가 실행될 때, 지정된 대로 두 개의 정수를 입력하여도 프로그램은 제대로 실행되지 않고 커서가 새로운 입력을 기다리는 상태로 계속 대기한다. 이러한 상황은 scanf() 함수의 제어 문자열을 둘러싸는 뒤쪽 이중 인용부호 앞에 위치한 공백 때문에 발생하였다. scanf("%d %d ", &su1, &su2); 결과적으로 scanf() 함수의 제어 문자열에서 공백을 함부로 사용하지 않도록 주의하여야 한다는 것이다. 이 예제를 강제로 실행시키기 위해서는, 실행 결과에 나타나 있듯이, 의미 없는 값을 하나 더 추가로 입력하여야 한다.
getchar() 함수는 인수가 없는 함수로서, 키보드로부터 입력받은 단일 문자를 int 형으로 반환하는 기능을 가지고 있다. C 언어에서 자주 사용되는 또 다른 입력 함수로는 getchar()가 있는데, getchar() 함수는 표준 입력 장치인 키보드로부터 단일 문자를 입력받을 때 주로 사용된다. getchar() 함수의 사용 형식은 다음과 같다. getchar() 함수는 인수가 없는 함수로서, 키보드로부터 입력받은 단일 문자를 int 형으로 반환하는 기능을 가지고 있다. 다음 예제를 통하여 getchar() 함수의 사용 방법을 알아보자. 예제 4.16 getchar() 함수의 사용 예와 실행 결과 1 : /* filename : ch4-16.c */ 2 : #include <stdio.h> ① 3 : 4 : main() 5 : { 6 : int ch; 7 : 8 : printf("임의의 문자를 입력하세요... "); ch = getchar(); ② 9 : printf("입력된 문자는 %c 입니다.", ch); 10 : } getchar(); 임의의 문자를 입력하세요... Aꏮ 입력된 문자는 A 입니다.
예제 4.16 프로그램 설명 ① C 언어에서 표준 입출력에 사용되는 모든 함수들은 표준 입출력 헤더 파일(standard input/output header file) “stdio.h”에 정의되어 있다. 그러므로 프로그램에서 표준 입출력 함수를 사용하는 경우에는 지시어 “#include”를 사용하여 stdio.h를 원시 프로그램에 포함시켜야 한다. 이 예제에서 2행의 문장이 기술되지 않으면, 컴파일 과정에서 다음과 같은 에러 메시지가 표시된다. Undefined Symbol '_getchar' in module ch4-16.c ② getchar() 함수에 의해 입력받은 단일 문자를 int 형 변수 "ch"에 저장한다. 여기에서 int 형 변수를 사용한 이유가 다소 의아스럽게 느껴지지 않는가? 문자를 다룰때는 char 형 변수가 어울릴 것 같지만, 수행 속도 등의 이유로 가장 일반적인 자료형인 int 형을 주로 사용한다는 것에 주의하기 바란다. 문자를 전용으로 처리하는 “getchar()” 함수조차도 반환값으로 int 형을 사용하는 것이 좋은 예가 될 것이다.
다음은 단일 문자를 입/출력하는 getchar()/putchar() 함수가 함께 사용된 예제이다. 예제 4.17 단일 문자의 입출력 예와 실행 결과 1 : /* filename : ch4-17.c */ 2 : #include <stdio.h> 3 : 4 : main() 5 : { 6 : int ch; 7 : 8 : printf("하나의 문자를 입력하세요... "); ch = getchar(); 9 : printf("입력된 문자를 출력합니다. "); putchar(ch); ① 10 : } 하나의 문자를 입력하세요... Hꏮ 입력된 문자를 출력합니다. H 예제 4.17 프로그램 설명 ① 8행의 getchar() 함수에 의해 입력받은 단일 문자를 putchar() 함수를 사용하여 화면으로 출력하였다.