Presentation is loading. Please wait.

Presentation is loading. Please wait.

쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.

Similar presentations


Presentation on theme: "쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express."— Presentation transcript:

1 쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express

2 스트림의 개념 스트림(stream): 입력과 출력을 바이트(byte)들의 흐름으로 생각하는 것

3 스트림과 파일 스트림은 구체적으로 FILE 구조체를 통하여 구현 FILE은 stdio.h에 정의되어 있다.
struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;

4 표준 입출력 스트림 표준 입출력 스트림(standard input/output stream): 필수적인 몇 개의 스트림
이름 스트림 연결 장치 stdin 표준 입력 스트림 키보드 stdout 표준 출력 스트림 모니터의 화면 stderr 표준 에러 스트림 표준 입출력 스트림(standard input/output stream): 필수적인 몇 개의 스트림 프로그램 실행 시에 자동으로 만들어지고 프로그램 종료 시에 자동으로 없어진다. 스트림의 최대 개수는 512개 3개의 표준 입출력 스트림이 첫 부분을 차지 stdin은 표준 입력 스트림 stdout은 표준 출력 스트림 stderr은 에러를 따로 출력하기 위하여 만들어진 스트림

5 입출력 함수의 분류 사용하는 스트림에 따른 분류 표준 입출력 스트림을 사용하여 입출력을 하는 함수
스트림 형식 표준 스트림 일반 스트림 설명 형식이 없는 입출력(문자 형태) getchar() fgetc(FILE *f,...) 문자 입력 함수 putchar() fputc(FILE *f,...) 문자 출력 함수 gets() fgets(FILE *f,...) 문자열 입력 함수 puts() fputs(FILE *f,...) 문자열 출력 함수 형식이 있는 입출력(정수, 실수,..) printf() fprintf(FILE *f,...) 형식화된 출력 함수 scanf() fscanf(FILE *f,...) 형식화된 입력 함수 사용하는 스트림에 따른 분류 표준 입출력 스트림을 사용하여 입출력을 하는 함수 스트림을 구체적으로 명시해 주어야 하는 입출력 함수 데이터의 형식에 따른 분류 getchar()나 putchar()처럼 문자 형태의 데이터를 받아들이는 입출력 printf()나 scanf()처럼 구체적인 형식을 지정할 수 있는 입출력

6 printf()를 이용한 출력 형식 제어 문자열의 구조 % 기호 형식 제어 문자열의 시작 플래그(flag)
int printf(char *format, ...); 형식 제어 문자열의 구조 % 기호 형식 제어 문자열의 시작 플래그(flag) 출력의 정렬과 부호 출력, 공백 문자 출력, 소수점, 8진수와 16진수 접두사 출력 필드폭(width)과 정밀도(precision) 데이터가 출력되는 필드의 크기 정밀도는 소수점 이하 자릿수의 개수가 된다. %[플래그] [필드폭] [.정밀도] [{h | l | L}] 형식

7 필드폭 필드폭(field width) 데이터가 출력되는 필드의 크기 #include <stdio.h>
int main(void) { printf("%6d %6d\n", 1, -1); printf("%6d %6d\n", 12, -12); printf("%6d %6d\n", 123, -123); printf("%6d %6d\n", 1234, -1234); printf("%6d %6d\n", 12345, ); printf("%6d %6d\n", , ); printf("%6d %6d\n", , ); } 1 -1 12 -12

8 정밀도 정밀도(precision) 정수인 경우, 출력할 숫자의 개수 실수인 경우, 소수점 이하의 자릿수의 개수
#include <stdio.h> int main(void) { printf("%.5d %.8d\n", 123, 123); printf("%.6f\n", ); printf("%.6e\n", ); printf("%.6g\n", ); printf("%.6s\n", "Hello World !"); } e-001 Hello

9 플래그 기호 의미 기본값 - 출력 필드에서 출력값을 왼쪽 정렬한다. 오른쪽 정렬된다. +
결과 값을 출력할 때 항상 +와 -의 부호를 붙인다. 음수일 때만 - 부호를 붙인다. 출력값 앞에 공백 문자 대신에 0으로 채운다. -와 0이 동시에 있으면 0은 무시된다. 만약 정수 출력의 경우, 정밀도가 지정되면 역시 0은 무시된다(예를 들어서 %08.5). 채우지 않는다. blank(‘ ’) 출력값 앞에 양수나 영인 경우에는 부호대신 공백을 출력한다. 음수일 때는 -가 붙여진다. + 플래그가 있으면 무시된다. 공백을 출력하지 않는다. # 8진수 출력 시에는 출력값 앞에 0을 붙이고 16진수 출력 시에는 0x를 붙인다. 붙이지 않는다.

10 예제 #include <stdio.h> int main(void) {
printf(" \n"); printf("| 형식지정자 | 36인경우| 인경우|\n"); printf("|%%15d |%15d |%15d |\n", 36, -36); printf("|%%-15d |%-15d |%-15d |\n", 36, -36); printf("|%%+15d |%+15d |%+15d |\n", 36, -36); printf("|%%015d |%015d |%015d |\n", 36, -36); printf("|%% 15d |% 15d |% 15d |\n", 36, -36); printf("|%%- 15d |%- 15d |%- 15d |\n", 36, -36); printf("|%%#x |%#x |%#x |\n", 36, -36); } | 형식지정자 | 36인 경우 | -36인 경우 | |%15d | 36 | -36 | |%-15d |36 |-36 | |%+15d | +36 | -36 | |%015d | | | |% 15d | 36 | -36 | |%- 15d | 36 |-36 | |%#x |0x24 |0xffffffdc |

11 정수출력 형식 지정자 설명 출력예 %d 부호있는 10진수 형식으로 출력 255 %i %u 부호없는 10진수 형식으로 출력 %o
부호없는 8진수 형식으로 출력 377 %x 부호없는 16진수 형식으로 출력, 소문자로 표기 fe %X 부호없는 16진수 형식으로 출력, 대문자로 표기 FE | 형식지정자| 36인경우 | -36인경우| | %d | 36 | -36 | | %i | 36 | -36 | | %hd | 36 | -36 | | %ld | 36 | -36 | | %o | 44 | | | %u | 36 | | | %x | 24 | ffffffdc | | 형식지정자 | 36인 경우 | -36인 경우 | | %15d | 36 | -36 | | %015d | | | | % 15d | 36 | -36 | | % 015d | | | | %-15d | 36 | -36 | | %- 15d | 36 | -36 | | %15.4d | 0036 | | | %-15.4d | 0036 | |

12 실수출력 형식 지정자 의미 출력 예 %f 소수점 고정 표기 형식으로 출력 123.456 %e
%g %e형식과 %f 형식 중 더 짧은 형식으로 출력 %G %E형식과 %f 형식 중 더 짧은 형식으로 출력 | 형식지정자 | 인 경우 | 인 경우 | | %15.2f | | | | %015.2f | | | | % 15.2f | | | | %+15.4f | | | | % 015.2f | | | | %-15.2f | | | | %- 15.2f | | | | %-15.4f | | | | 형식지정자 | 인 경우 | 인 경우 | | %15.2e | 2.36e+001 | -2.36e+001 | | %015.2e | e+001 | e+001 | | % 15.2e | 2.36e+001 | -2.36e+001 | | %+15.4e | e+001 | e+001 | | % 015.2e | e+001 | e+001 | | %-15.2e | 2.36e+001 | -2.36e+001 | | %- 15.2e | 2.36e+001 | -2.36e+001 | | %-15.4e | | e+001 |

13 문자와 문자열 출력 형식 지정자 의미 출력 예 %c 문자 출력 c %s 문자열 출력 Hello World!
| 형식지정자 | 'b'인 경우 | | %c | b | %15c | b | %015c | b | %-15c | b 제어 문자 의미 \a 벨소리(경고) \b 백스페이스 \n 새로운 라인(new line) \t 수평탭 \\ 백슬래시 \? 의문부호 \' 홑 따옴표 \f 폼피드(form feed) \" 이중 따옴표 \r 캐리지 리턴(carrage return) | 형식지정자 | "abcdefg"인 경우 | %s | abcdefg | %15s | abcdefg | %15.3s | abc | %015s | abcdefg | %-15s | abcdefg

14 scanf()를 이용한 입력 문자열 형태의 입력을 사용자가 원하는 형식으로 변환한다.

15 scanf()의 기본 * 현재 입력을 무시하라는 의미 파일에서 하나의 특정한 열만 읽을 때 유용 필드폭
%[*] [필드폭] [{h | l | L}] 형식 * 현재 입력을 무시하라는 의미 파일에서 하나의 특정한 열만 읽을 때 유용 필드폭 필드폭 만큼의 문자를 읽어서 값으로 변환 공백 문자로 입력 값을 분리하지 않고서도 여러 개의 값들을 읽을 수 있다. 크기 지정 h가 정수형인 경우, short형으로 변환 h가 float형 앞에 붙으면 double형으로 변환 L은 long double형으로 변환

16 정수 입력 분류 형식 지정자 설명 정수형 %d 입력값을 int형으로 변환, 앞에 0이 붙으면 8진수로 가정, 앞에 0x가 붙으면 16진수로 가정한다. %u 부호없는 정수 형식으로 입력 %o 입력을 8진수로 가정하고 정수로 변환 %x 입력을 16진수로 가정하고 정수로 변환 #include <stdio.h> int main(void) { int d, o, x; scanf("%d %o %x", &d, &o, &x); printf("d=%d o=%d x=%d\n", d, o, x); return 0; } 10 d=10 o=8 x=16

17 실수 입력 분류 형식 지정자 설명 정수형 %d 입력값을 int형으로 변환, 앞에 0이 붙으면 8진수로 가정, 앞에 0x가 붙으면 16진수로 가정한다. %u 부호없는 정수 형식으로 입력 %o 입력을 8진수로 가정하고 정수로 변환 %x 입력을 16진수로 가정하고 정수로 변환 #include <stdio.h> int main(void) { int d, o, x; scanf("%d %o %x", &d, &o, &x); printf("d=%d o=%d x=%d\n", d, o, x); return 0; } 10 d=10 o=8 x=16

18 문자와 문자열 입력 분류 형식 지정자 설명 문자형 %c char형으로 입력받음 %s
공백 문자가 아닌 문자부터 공백 문자가 나올 때까지를 문자열로 변환하여 입력받음. %[abc] 대괄호 안에 있는 문자 a,b,c로만 이루어진 문자열을 읽어 들인다. %[^abc] 대괄호 안에 있는 문자 a,b,c만을 제외하고 다른 문자들로 이루어진 문자열을 읽어 들인다. %[0-9] 0에서 9까지의 범위에 있는 문자들로 이루어진 문자열을 읽어 들인다.

19 문자와 문자열 읽기

20 scanf6.c #include <stdio.h> int main(void) { char c;
char s[80], t[80]; printf("스페이스로 분리된 문자열을 입력하시오:"); scanf("%s%c%s", s, &c, t); printf("입력된 첫번째 문자열=%s\n", s); printf("입력된 문자=%c\n", c); printf("입력된 두번째 문자열=%s\n", t); return 0; } 스페이스로 분리된 문자열을 입력하시오:Hello World 입력된 첫번째 문자열=Hello 입력된 문자= 입력된 두번째 문자열=World

21 문자집합으로 읽기 #include <stdio.h> int main(void) { char s[80];
printf("문자열을 입력하시오:"); scanf("%[abc]", s); printf("입력된 문자열=%s\n", s); return 0; } 문자열을 입력하시오:abcdef 입력된 문자열=abc

22 문자집합으로 읽기 #include <stdio.h> int main(void) { char s[80];
printf("문자열을 입력하시오:"); scanf("%[a-z]", s); // 알파벳 소문자(a-z)로 구성된 문자열만 입력 printf("입력된 문자열=%s\n", s); return 0; } 문자열을 입력하시오:abcdefghijklmnOPQRSTUVWXYZ 입력된 문자열=abcdefghijklmn

23 특정 문자를 무시 #include <stdio.h> int main(void) {
int year, month, day; printf("날짜를 입력하시오: "); scanf("%d%*d%*d", &year, &month, &day); printf("입력된 날짜는 %d년 %d월 %d일입니다.\n", year, month, day); return 0; } 날짜를 입력하시오: 입력된 날짜는 2007년 9월 1일입니다.

24 scanf() 사용시 주의점 입력값을 저장할 변수의 주소를 전달 int i; scanf("%d", i); // 오류!!
배열의 이름은 배열을 가리키는 포인터 int str[80]; scanf("%s", str); // 올바름 scanf("%s", &str); // 오류!! 충분한 공간을 확보 scanf("%s", str); // 입력된 문자의 개수가 79를 초과하면 치명적인 오류 발생 scanf()의 형식 제어 문자열의 끝에 줄바꿈 문자 '\n'을 사용하는 것은 해당 문자가 반드시 입력되어야 한다는 의미 scanf("%d\n", &i);// 잘못됨!!

25 라이브러리 함수 memset() void *memset(void *dest, int c, size_t count);
#include <memory.h> #include <stdio.h> int main( void ) { char buffer[] = "This is a test of the memset function“; printf( "Before: %s\n", buffer ); memset( buffer, '*', 4 ); printf( "After: %s\n", buffer ); return 0; } Before: This is a test of the memset function After: **** is a test of the memset function

26 라이브러리 함수 memcpy() void *memcpy(void *dest, const void *src, size_t count); #include <memory.h> #include <string.h> #include <stdio.h> char str1[7] = "aabbcc" int main( void ) { printf( "The string: %s\n", str1 ); memcpy( str1 + 2, str1, 4 ); printf( "New string: %s\n", str1 ); strcpy( str1, sizeof(str1), "aabbcc" ); // 문자열을 다시 초기화한다. memmove( str1 + 2, str1, 4 ); return 0; } The string: aabbcc New string: aaaabb

27 라이브러리 함수 memcpy() int memcmp(const void *buf1, const void *buf2, size_t count); #include <string.h> #include <stdio.h> int main( void ) { char first[] = " " char second[] = " " int result; printf( "Compare '%.19s' to '%.19s':\n", first, second ); result = memcmp( first, second, 19 ); if( result < 0 ) printf( "First is less than second.\n" ); else if( result == 0 ) printf( "First is equal to second.\n" ); else printf( "First is greater than second.\n" ); } Compare ' ' to ' ': First is equal to second.

28 라이브러리 함수 exit() exit()는 프로그램을 종료
atexit()는 exit()가 호출되는 경우에 수행되는 함수들을 등록 #include <stdlib.h> #include <stdio.h> void fn1( void ), fn2( void ); int main( void ) { atexit( fn1 ); atexit( fn2 ); printf( "프로그램이 종료되었습니다.\n" ); } void fn1() printf( "여기서 메모리 할당을 해제합니다.\n" ); void fn2() printf( "여기서 종료 안내 메시지를 내보냅니다.\n" ); 프로그램이 종료되었습니다. 여기서 종료 안내 메시지를 내보냅니다. 여기서 메모리 할당을 해제합니다.

29 라이브러리 함수 qsort() 퀵정렬을 수행하는 라이브러리 함수
void qsort(void *base,size_t num,size_t width,int (*compare)(const void *, const void *) compare( (void *) elem1, (void *) elem2 ); 반환값 설명 < 0 elem1이 elem2보다 작으면 elem1이 elem2과 같으면 > 0 elem1이 elem2보다 크면

30 라이브러리 함수 qsort() #include <stdlib.h> #include <string.h>
#include <stdio.h> // int compare( const void *arg1, const void *arg2 ) { if( *(double *)arg1 > *(double *)arg2 ) return 1; else if( *(double *)arg1 == *(double *)arg2 ) return 0; else return -1; } int main(void) int i; double list[5] = {2.1, 0.9, 1.6, 3.8, 1.2}; qsort( (void *)list, (size_t)5, sizeof(double), compare ); for(i=0;i<5;i++) printf("%f ", list[i]); return 0;

31 Q & A


Download ppt "쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express."

Similar presentations


Ads by Google