Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 11– 표준 함수(2) Outline 11.1 저수준 파일 입출력 함수 11.2 문자열과 자료 변환 함수

Similar presentations


Presentation on theme: "Chapter 11– 표준 함수(2) Outline 11.1 저수준 파일 입출력 함수 11.2 문자열과 자료 변환 함수"— Presentation transcript:

1 Chapter 11– 표준 함수(2) Outline 11.1 저수준 파일 입출력 함수 11.2 문자열과 자료 변환 함수
저수준 파일 입출력 함수 문자열과 자료 변환 함수 문자열 조작 함수 메모리 관리 함수 11.5 기타 함수 요약 11.7 예제

2 11.1 저수준 파일 입출력(I/O) 함수 저수준 I/O 함수 = 비 버퍼형 I/O 함수 = UNIX-like I/O 함수
원래 UNIX 운영체제가 시스템 호출(system call)로 제공되던 기본적인 함수들 중 I/O 관련 함수들 이 함수들은 open()이나 creat()가 반환하는 file descriptor를 사용한다. [참고] 10장의 버퍼형 I/O함수들은 fopen이 반환하는 FILE 포인터를 사용하였다. 표 11.1 UNIX 류의 비버퍼형 입출력 함수 함 수 명 기 능 read()         write()         open()         close()         lseek()         unlink()         creat() 자료의 버퍼를 판독         자료의 버퍼를 기록         디스크 파일을 개방         디스크 파일을 종결         파일에서 지정된 바이트를 탐색         디렉토리로부터 파일을 제거         파일을 생성

3 <file을 비버퍼형으로 열기/닫기>
저수준 파일 입출력(I/O) 함수 <file을 비버퍼형으로 열기/닫기> int open(char *filename, int rwmode) int close(int fd) (예 11.1) open()의 사용 int fd; if ((fd = open(“test”, 1)) == -1) { c = printf(“cannot open file\n”); exit(1); } “test”란 디스크 file을 1번 모드(즉 쓰기용)로 열고 있다. 반환된 값 fd는 file descriptor라 하며 프로세스마다 0번부터 순서대로 배정된다. 표준입력,표준출력, 표준에러가 자동으로 열릴 때 0,1,2번이 배정되므로 프로그램에서는 통상 3번부터 배정된다. rwmode는 표 11.2와 같이 매크로를 사용한다. O_RDONLY, O_WRONLY, O_RDWR는 통상 0, 1, 2와 같다.

4 11.1 저수준 파일 입출력(I/O) 함수 표 11.2 모드 선택 상수 상 수 의 미 O_RDONLY O_WRONLY
상 수 의 미 O_RDONLY O_WRONLY O_RDWR O_APPEND O_CREAT O_EXCL O_TRUNC O_BINARY O_TEXT 읽기 위해 파일을 개방 쓰기 위해 파일을 개방 읽고 쓰기 위해 파일을 개방 매번 쓰기 연산 전에 파일 포인터를 파일의 끝으로 재위치 새로운 파일을 생성하고 읽기 위해 개방. 이 플래그는 지정한 파일이 이미 존재한다면 효과가 없다. open()은 이 플래그가 사용될 때 세 번째 인수를 요구한다. 지정한 파일이 이미 존재한다면 에러값을 반환. O_CREAT 설정시에만 동시에 적용 가능하다. 현존하는 파일을 길이 0으로 절삭하고 개방, 파일은 기록 허용이 되어야 하며, 파일의 내용은 파괴됨 2진 모드로 파일을 개방 텍스트 모드로 파일을 개방

5 <새로운 file의 생성/제거>
저수준 파일 입출력(I/O) 함수 <새로운 file의 생성/제거> int creat(char *filename, int access) int unlink(char *filename) creat는 filename이란 file을 생성하고 쓰기 용으로 열어 file descriptor까지 반환한다. unlink는 해당 file을 제거한다. access는 접근권한으로 file의 소유자(owner), 소유자의 그룹(group), 다른 사람들(other)에게 각각 3비트를 부여하여 접근권한을 통제함.

6 11.1 저수준 파일 입출력(I/O) 함수 예를 들어 access가 0751이면,
소유자에게 7(즉 2진법 111)로 읽기,쓰기,수행하기 권한을 줌 그룹에는 5(즉 2진법 101)로 읽기, 수행하기 권한을 줌. 다른 사람들에게는 1(즉 2진법 001)로 수행하기 권한만을 줌 UNIX에서 <sys/stat.h>를 포함하면 S_IREAD는 소유자의 읽기권한(0400), S_IWRITE는 소유자의 쓰기권한(0200)으로 사용됨 DOS에서는 <sys\stat.h>와 <io.h>를 포함시켜야 함

7 <file에 쓰기/file에서 읽기>
저수준 파일 입출력(I/O) 함수 <file에 쓰기/file에서 읽기> int write(int fd, void *buf, unsigned size) int read(int fd, void *buf, unsigned size) fd는 open 이나 creat의 반환값을 사용해야 한다. open시 쓰기 가능한 모드로 열었거나 creat로 열었으면 write가 가능. open시 읽기 가능한 모드로 열었으면 read가 가능하다. write는 buf에 있는size개 문자를 fd번 file로 출력한다. 출력이 성공하면, 반환값은 출력된 문자수로 size와 같다. 실패시는 –1이반환. read는 fd번 file에서 size개의 문자를 buf로 읽어 들인다. 반환값은 읽혀 들인 문자 수로 일반적으로 size와 같다. 그러나 file의 끝 부분에서는 size 개보다 작은 수의 문자가 읽혀 들일 수가 있다. 특히 file의 끝에서 read를 시도하면 0이 반환된다. 실패시는 –1이 반환.

8 11.1 저수준 파일 입출력(I/O) 함수 (예 11.2) creat(), write(), close() 사용
file소유자가 읽고 쓰도록 file을 생성하였다. /* File : prog11-2.c creat(), write(), close()의 사용 */ #include <sys/stat.h> int main(void) { int fd; char *buf = “century 21 started\n”; if ((fd = creat(“tmp.dat”, S_IREAD | S_IWRITE)) < 0) { printf(“creat failed\n”); exit(1); } write(fd, buf, strlen(buf)); close(fd); 14 } (예 11.2) output $ cc –o prog11-2 prog11-2.c $ prog11-2 $ cat tmp.dat century 21 started

9 11.1 저수준 파일 입출력(I/O) 함수 write()와 read()의 기본 개념
그림 11.1 저수준(비버퍼형) file I/O

10 11.1 저수준 파일 입출력(I/O) 함수 (예 11.3) read(), write() 사용
- 표준입력(file descriptor 0번)에서 표준출력(file descriptor 1번)으로 file을 복사하는 프로그램이다. 0번, 1번, 2번은 사용자가 open하지 않아도 자동으로 open되어있다. 표준입력에서 512개씩 표준출력으로 복사하는 프로그램이다. 읽혀 들인 문자 수 n은 통상 512이나 마지막 블록에서는 512보다 작을 수도 있다. /* File : prog11-3.c write(), read()의 사용 */ #define BUFSIZE 512 int main(void) /* file 의 복사 */ { char buf[BUFSIZE]; int n; while ((n = read(0, buf, BUFSIZE)) > 0) write(1, buf, n); 10 } (예 11.3)

11 <file의 임의 위치로 이동>
저수준 파일 입출력(I/O) 함수 <file의 임의 위치로 이동> long lseek(int fd, long offset, int mode) lseek는 고수준 함수 fseek의 저수준 함수 버젼이다. fd는 open 이나 creat의 반환값을 사용해야 한다. mode는 0,1,2를 가질 수 있는데, 0은 file 맨 앞, 1은 현재 위치, 2는 file의 맨 뒤를 나타낸다. offset는 모드기준으로 몇 바이트 위치인가를 결정한다. 가령 80이면 앞으로 80바이트, -80이면 뒤로 80바이트 지점을 나타낸다. lseek로는 자료의 이동은 일어나지 않는다. lseek 후에 read/write를 사용해야 자료가 이동된다.

12 11.1 저수준 파일 입출력(I/O) 함수 /* 파일 디스크립터가 fd번인 파일에서 일고 쓰는 위치를 다음 위치로 이동 */
lseek(fd, 0L, 0); /* 파일 맨 앞으로 이동 */ lseek(fd, 80L, 0); /* 파일 맨 앞에서 80바이트 위치로 이동 */ lseek(fd, 80L, 1); /* 파일 현 위치에서 80바이트 앞으로 이동 */ lseek(fd, -80L, 1); /* 파일 현 위치에서 80바이트 뒤로 이동 */ lseek(fd, 0L, 2); /* 파일 맨 뒤로 이동 */ lseek(fd, -80L, 2); /* 파일 맨 뒤에서 80바이트 뒤로 이동 */

13 <문자열/줄 단위 쓰기/읽기>
문자열과 자료 변환 함수 <문자열/줄 단위 쓰기/읽기> int sprintf(char *s, char *format, . . .); /* string printf */ int sscanf(const char *s, const char *format, . . .); /* string scanf */ sprintf는 첫 인수가 가리키는 버퍼로 출력이 된다. sscanf는 첫 인수가 가리키는 버퍼에서 입력을 받는다.

14 11.2 문자열과 자료 변환 함수 (예 11.5) sscanf()와 sprintf()의 사용 예 (예 11.5)
문자열과 자료 변환 함수 (예 11.5) sscanf()와 sprintf()의 사용 예 (예 11.5) sscanf()와 sprintf() output /* File : prog11-5.c sscanf()와 sprintf()의 사용 예 */ #include <stdio.h> int main(void) { char istr[] = “century 21 millennium 2”, ostr[80], tmp1[80], tmp2[80]; int cent, mill; 8 sscanf(istr, “%s%d%s%d”, tmp1, &cent, tmp2, &mill); sprintf(ostr, “%s %d %s %d\n”, tmp2, mill, tmp1, cent); printf(“%s”, ostr); 12 } millennium 2 century 21

15 11.2 문자열과 자료 변환 함수 double atof(const char *str) /* ASCII to float */
문자열과 자료 변환 함수 <stdio.h>의 자료변환 함수 - 문자열을 받아 float, int, long형으로 바꾸는 함수들 double atof(const char *str) /* ASCII to float */ int atoi(const char *str) /* ASCII to int */ long atol(const char *str) /* ASCII to long */ (예 11.6) 자료 변환의 예 (예 11.6) 자료 변환 output char str1[] = “123DOLLAR”, str2[] = “123456”; printf(“%d %ld\n”, atoi(str1), atol(str2));

16 - 이 함수들을 사용하려면 <string.h>를 포함하여야 한다.
문자열 조작 함수 표 문자열 조작 표준 함수 - 이 함수들을 사용하려면 <string.h>를 포함하여야 한다. 함수명 기 능 strcat() strchr() strcmp() strcpy() strcspn() strdup() strerror() stricmp() strlen() strlwr() strncat() 문자열의 연결 지정 문자의 탐색(최초로 발견된 위치) 문자열의 비교 문자열의 복사 키 리스트의 탐색 문자열을 히프(heep) 영역으로 복사 에러 메시지의 생성 대소문자를 구별하지 않고 문자열을 비교 문자열의 길이 소문자 문자열로의 변환 지정 길이로 문자열을 연결

17 11.3 문자열 조작 함수 표 11.5 문자열 조작 표준 함수 함수명 기 능 strncmp() strncpy()
문자열 조작 함수 표 문자열 조작 표준 함수 함수명 기 능 strncmp() strncpy() strnicmp() strnset() strpbrk() strrchr() strrev() strset() strspn() strstr() strtok() strupr() 지정 길이로 문자열을 비교 지정 길이로 문자열을 복사 지정 길이로 대소문자를 구별하지 않고 문자열을 비교 지정 길이로 문자열을 설정 키 리스트의 탐색 지정 문자의 탐색(최후로 발견된 위치) 문자열의 반전 문자의 설정 문자열의 탐색 토큰을 추출 대문자 문자열로의 변환

18 11.3 문자열 조작 함수 char *strcpy(d, s) /* 포인터 d 반환 */
문자열 조작 함수 <문자열의 복사> char *strcpy(d, s) /* 포인터 d 반환 */ char *strncpy(d, s, n) /* 포인터 d 반환 */ char *d; /* 문자열이 복사되는 배열(destination) */ char *s; /* 복사하는 문자열(source) */ int n; /* 복사하는 최대 길이 */ - 문자열 s를 배열 d로 복사한다. - strncpy는 최대 n문자까지 복사한다. - 문자열s가 n자가 안되면 ‘\0’으로 채운다. - d는 복사할 문자열의 길이+1을 확보해야 함

19 (예 11.7)strcpy(), strncpy()
문자열 조작 함수 (예 11.7)strcpy(), strncpy() /* (1) */ x = strcpy(s1, s2); (예 11.7)(1)

20 (예 11.7 계속)strcpy(), strncpy()
문자열 조작 함수 (예 11.7 계속)strcpy(), strncpy() /* (2) */ x = strncpy(s1, s2, 4); (예 11.7)(2)

21 (예 11.7 계속)strcpy(), strncpy()
문자열 조작 함수 (예 11.7 계속)strcpy(), strncpy() /* (3) */ x = strncpy(s1, s2, 5); (예 11.7)(3)

22 11.3 문자열 조작 함수 char *strcat(d, s) /* 포인터 d 반환 */
문자열 조작 함수 <문자열의 연결> char *strcat(d, s) /* 포인터 d 반환 */ char *strncat(d, s, n) /* 포인터 d 반환 */ char *d; /* 문자열이 복사되는 배열(destination) */ const char *s; /* 연결하는 문자열(source) */ int n; /* 연결하는 문자열의 최대 길이 */ - 문자열 s를 배열 d뒤에 추가한다. - strncat는 최대 n문자까지 추가한다. - d는 충분한 공간을 확보하고 있어야 함

23 (예 11.8)strcat(), strncat()
문자열 조작 함수 (예 11.8)strcat(), strncat() /* (1) */ x = strcat(buf, “XYZ”); (예 11.8)(1)

24 (예 11.8 계속)strcat(), strncat()
문자열 조작 함수 (예 11.8 계속)strcat(), strncat() /* (2) */ x = strncat(buf, “XYZW”, 3); (예 11.8)(2)

25 (예 11.8 계속)strcat(), strncat()
문자열 조작 함수 (예 11.8 계속)strcat(), strncat() /* (3) */ x = strncat(buf, “XYZW”, 10); (예 11.8)(3)

26 11.3 문자열 조작 함수 char *strchr(s, c) char *strrchr(s, c)
문자열 조작 함수 <특정 문자의 위치> char *strchr(s, c) char *strrchr(s, c) const char *s; /* 탐색되는 문자열 */ char *c; /* 키 문자 */ - strchr은 문자열 s에서 문자 c가 처음 발견된 위치를 반환 - strrchr은 문자열 s에서 문자 c가 최후로 발견된 위치 반환 - 함수명을 index(), rindex()로 부르는 시스템도 있다. - 실패시 NULL 반환

27 11.3 문자열 조작 함수 (예 11.9)strchr()의 사용 (예 11.9) 함수 strchr char *s, *p;
문자열 조작 함수 (예 11.9)strchr()의 사용 char *s, *p; s = “hello C world”; p = strchr(s, ‘w’); (예 11.9) 함수 strchr

28 11.3 문자열 조작 함수 int strcmp(s1, s2) int strncmp(s1, s2, n)
문자열 조작 함수 <문자열끼리의 비교> int strcmp(s1, s2) int strncmp(s1, s2, n) char *s1, *s2; /* 비교하는 문자열 */ unsigned n; /* 비교하는 길이 */ - s1, s2가 가리키는 문자열을 앞에서 1문자씩 사전 순서(lexical order)로 비교한다. - s1 > s2이면 양수를 반환 - s1과 s2가 같으면 0을 반환 - s1 < s2이면 음수를 반환 - strncmp는 n개 문자까지만 비교

29 (예 11.10)strcmp(), strncmp()의 사용
문자열 조작 함수 (예 11.10)strcmp(), strncmp()의 사용 (예 11.10) 함수 strcmp 와 strncmp char s1[] = “CENT”, s2[] = “CENTURY”, s3[] = “century”; /* (1) */ x = strcmp(s1, s2); /* x 값으로 음수가 저장됨 */ /* (2) */ x = strncmp(s1, s2, 4); /* x 값으로 0이 저장됨 */

30 11.3 문자열 조작 함수 unsigned strcspn(s1, s2) unsigned strspn(s1, s2)
문자열 조작 함수 <키 리스트의 탐색> unsigned strcspn(s1, s2) unsigned strspn(s1, s2) char *s1; /* 탐색될 문자열 */ char *s2; /* 키 리스트 */ - strcspn은 s2의 키 리스트 중 어느 1문자가 s1속에서 최초로 발견된 위치를 반환 - strspn은 s2의 키 리스트에 없는 문자가 s1속에서 최초로 발견된 위치를 반환 - s1의 첫 위치를 0으로 한다.

31 (예 11.11)strcspn(), strspn()의 사용
문자열 조작 함수 (예 11.11)strcspn(), strspn()의 사용 (예 11.11) 함수 strcspn 와 strspn /* (1) */ x = strcspn(“hello ms-C”, “-w”); /* x 값은 8이 된다. */ /* (2) */ x = strspn(“candy”, “abc”); /* x 값은 2가 된다. */

32 11.3 문자열 조작 함수 unsigned strlen(str) char *str; /* 문자열 */
문자열 조작 함수 <문자열의 길이> - 문자열 str의 길이(단 ‘\0’는 제외)를 반환 unsigned strlen(str) char *str; /* 문자열 */ (예 11.12) 함수 strlen (예 11.12)strlen()의 사용 x = strlen(“century”); /* x 값은 7이 된다. */

33 11.3 문자열 조작 함수 char *strpbrk(s1, s2) char *s1; /* 탐색될 문자열 */
문자열 조작 함수 <탈출 문자 발견> - s2의 키 리스트 중 어느 한 문자가 s1에서 최초로 발견된 위치를 포인터로 반환. char *strpbrk(s1, s2) char *s1; /* 탐색될 문자열 */ char *s2; /* 키 리스트 */

34 11.3 문자열 조작 함수 (예 11.13)strpbrk()의 사용 (예 11.13) 함수 strpbrk
문자열 조작 함수 (예 11.13)strpbrk()의 사용 (예 11.13) 함수 strpbrk char *s, *p; p = “hello C world”; s = strpbrk(s, “wc”);

35 11.3 문자열 조작 함수 char *strtok(s1, s2) char *s1; /* 탐색될 문자열 */
문자열 조작 함수 <토큰 얻기> char *strtok(s1, s2) char *s1; /* 탐색될 문자열 */ char *s2; /* 분리자(delimeter) 들 */ - s2의 각 문자를 분리자로 하여 s1에서 토큰을 추출한다. - 첫 호출 시 최초의 토큰 포인터가 반환 - 다음 호출에는 s1 대신 NULL을 지정하면, 다음 토큰 포인터가 반환 - strtok()이 NULL 반환시까지 반복하면 s1 내의 모든 토큰을 찾을 수 있다.

36 11.3 문자열 조작 함수 (예 11.14)strtok()의 사용 여기서 공백문자 및 –를 분리자로 삼고 있다.
문자열 조작 함수 (예 11.14)strtok()의 사용 여기서 공백문자 및 –를 분리자로 삼고 있다. (예 11.14) 함수 strtok output char *tok; tok = strtok(“Welcome to C-language world”, “ –”); while (tok != NULL) { printf(“%s\n”, tok); tok = strtok(NULL, “ -”); } Welcome to C language world

37 11.4 메모리 관리 함수 표 11.6 메모리 관리 표준 함수 함수명 기 능 brk() calloc() free()
메모리 관리 함수 표 11.6 메모리 관리 표준 함수 함수명 기 능 brk() calloc() free() malloc() realloc() sbrk() 자료 세그먼트(segment) 영역의 변경 0으로 초기화(clear)된 메모리 할당 메모리 블록의 해제 메모리의 할당 메모리의 재할당 저수준 메모리 할당

38 11.4 메모리 관리 함수 그림 11.3 메모리 영역(Turbo-C의 경우) - 정적 변수, 외부 변수는 정적 영역에 둔다.
메모리 관리 함수 - 정적 변수, 외부 변수는 정적 영역에 둔다. - 자동변수는 스택 영역에 둔다. - 사용되는 스택 영역과 히프 영역은 동작시 가변적이다. 사용자 프로그램 영역 하위 주소 전역 변수 정적 영역 히프 영역(heap area) 스택 영역 상위 주소 그림 11.3 메모리 영역(Turbo-C의 경우)

39 11.4 메모리 관리 함수 void *calloc(n, size) /* clear allocation */
메모리 관리 함수 void *calloc(n, size) /* clear allocation */ unsigned n; /* 원소의 수 */ unsigned size; /* 원소의 바이트 수 */ n * size바이트를 (히프영역에서) 확보하고 그 주소를 반환한다. 모두 0으로 clear한다. 할당에 실패시 NULL을 반환한다. (예 11.15) 함수 calloc()의 사용 실수자료 100개의 메모리를 확보하고 모든 원소를 0으로 함 void *calloc(); float *fptr; fptr = (float *) calloc(100, sizeof(float)); (예 11.15) 함수 calloc

40 11.4 메모리 관리 함수 void *malloc(n, size) /* 메모리의 동적 획득 */
메모리 관리 함수 void *malloc(n, size) /* 메모리의 동적 획득 */ unsigned size; /* 할당된 메모리 바이트 수 */ size바이트를 (히프영역에서) 확보하고 그 주소를 반환한다. 할당에 실패시 NULL을 반환한다. (예 11.16) malloc()의 사용 char *name[100], *malloc(); /* 메모리의 동적 획득 */ int i, num = 0; while (1) { /* 무한 루프 */ if ((name[num] = malloc(20)) == NULL) { printf(“memory overflow\n”); break; } if (gets(name[num]) == NULL) num++; for (i = 0; < num - 1; i++) puts(name[j]); (예 11.16) 함수 malloc

41 11.4 메모리 관리 함수 (예 11.16 계속) malloc()의 사용
메모리 관리 함수 (예 계속) malloc()의 사용 malloc(20) 호츨시마다 히프영역에서 20바이트씩 할당되어 그 포인터가 name[0], name[1], name[2]등에 배정됨 (예 11.16) malloc의 사용

42 11.4 메모리 관리 함수 void *realloc(block, newsize) /* 메모리의 동적 재 할당 */
메모리 관리 함수 void *realloc(block, newsize) /* 메모리의 동적 재 할당 */ void *block; /* 이전의 메모리 블록 포인터 */ unsigned newsize; /* 새 메모리 의 바이트 수 */ block이 가리키는 메모리 블록의 크기를 newsize로 바꾼다. 현재 block 메모리의 내용은 새로운 영역으로 복사되고, 새로운 영역의 주소가 반환된다. newsize는 보통 현재 block의 크기보다 크게 사용하지만, 그 크기를 줄이는데도 사용될 수 있다.

43 11.4 메모리 관리 함수 (예 11.17) realloc()의 사용 (예 11.17) 함수 realloc
메모리 관리 함수 (예 11.17) realloc()의 사용 char *p, *q; /* 메모리의 동적 획득 */ p = malloc(10); q = realloc(p, 30); (예 11.17) 함수 realloc

44 11.4 메모리 관리 함수 void *free(block) char *block; /* 메모리 블록 포인터 */
메모리 관리 함수 void *free(block) char *block; /* 메모리 블록 포인터 */ calloc(), malloc(), realloc()으로 할당된 메모리 반납

45 11.4 메모리 관리 함수 int brk(endds) void *endds; /* 자료 세그멘트 플래그 값 */
메모리 관리 함수 <자료 세그멘트의 영역 변경> int brk(endds) void *endds; /* 자료 세그멘트 플래그 값 */ void *sbrk(n) int n; /* 메모리의 증감(+면 증가, -면 감소) */ brk()는 자료 세그멘트의 플래그 값을 endds로 변경한다. sbrk()는 지정한 n만큼 상대적으로 증감한다. 그림 11.4 메모리 풀 영역 (Turbo C)

46 11.5 기타 함수 int is~(c) int c; /* 검사하는 문자 */ <문자 검사>
기타 함수 <문자 검사> int is~(c) int c; /* 검사하는 문자 */ (예 11.18) is 매크로의 사용 ASCII코드로 isspace함수값이 참인 문자들의 코드들을 출력 /* File : prog11-18.c is 매크로의 사용 */ #include <stdio.h> #include <ctype.h> int main(void) { int c; for (i = 0; i <= 255; i++) if (isspace(i)) printf(“%02x ”, i); printf(“\n”); 12 } (예 11.18) is 매크로 output 09 0a 0b 0c 0d 20

47 11.5 기타 함수 표 11.8 문자 종류 검사의 매크로 문자 검사 매크로 기 능 isalpha(c) isalnum(c)
기타 함수 표 11.8 문자 종류 검사의 매크로 문자 검사 매크로 기 능 isalpha(c) isalnum(c) isascii(c) iscntrl(c) isdigit(c) isgraph(c) islower(c) isprint(c) ispunct(c) ispace(c) isupper(c) isxdigit(c) 문자 c가 영문자('A'~'Z', 'a'~'z')이면 참(true) 문자 c가 영문자 숫자('A'~'Z', 'a'~'z', '0'~'9')이면 참 문자 c가 ASCII 코드(0~0x7f)이면 참 문자 c가 제어 코드(0~0x1f, 0x7f)이면 참 문자 c가 10진 숫자('0'~'9')이면 참 문자 c가 가시 문자(공백 제외),  즉 0x2l~0x7e이면 참 문자 c가 소문자('a'~'z')이면 참 문자 c가 인쇄 가능 문자(0x20~0x7e이면 참 문자 c가 구두점(0x2l~0x40, 0x56~0x60, 0x7b~0x7e)이면 참 문자 c가 공백(0x09~0x0d, 0x20)이면 참 문자 c가 대문자('A'~'Z')이면 참 문자 c가 16진 숫자('0'~'9', 'A'~'F', 'a'~'f')이면 참

48 11.5 기타 함수 int to~(c) int c; /* 변환하는 문자 */ <문자 변환>
기타 함수 <문자 변환> int to~(c) int c; /* 변환하는 문자 */ (예 11.19) to 매크로의 사용 toupper는 소문자는 대문자로 바꾸어 반환하고, 그 외 문자는 그대로 반환한다. (예 11.19) to 매크로 /* File : prog11-19.c to 매크로의 사용 */ #include <stdio.h> #include <ctype.h> int main(void) /* 소문자를 대문자로 변환 */ { int c; while ((c = getchar()) != EOF) putchar(toupper(c)); }

49 11.5 기타 함수 표 11.9 문자 변환 매크로 문자 변환 매크로 반환값 toascii(c) tolower(c)
기타 함수 표 11.9 문자 변환 매크로 문자 변환 매크로 반환값 toascii(c) tolower(c) toupper(c) c의 ASCII 값 c가 대문자이면 해당 소문자, 기타의 경우는 c c가 소문자이면 해당 대문자, 기타의 경우는 c

50 11.5 기타 함수 <수치 연산 함수> - 원시 프로그램에 <math.h>를 포함시켜야 한다.
기타 함수 <수치 연산 함수> - 원시 프로그램에 <math.h>를 포함시켜야 한다. - 링크 시 수학 라이브러리(lm)를 연결해야 함 (예 11.20) 로그, 제곱근, 지수, 멱(power)의 계산 /* File : prog11-20.c 로그, 제곱근, 지수, 멱(power)의 계산 */ #include <stdio.h> #include <math.h> int main(void) { double x; printf(“%10s%10s%10s%15s%20s\n”, “x”, “log(x)”, “sqrt(x)”, “exp(x)”, “pow(10.0, x)”); for (x = 1; x <= 10; x++) printf(“%10.5f%10.5f%10.5f%15.5f%20.5f\n”, x, log(x), sqrt(x), exp(x), pow(10.0, x)); 13 } (예 11.20) 수치 연산

51 11.5 기타 함수 (예 11.20 계속) 로그, 제곱근, 지수, 멱(power)의 계산 (예 11.20 계속) 수치 연산
기타 함수 (예 계속) 로그, 제곱근, 지수, 멱(power)의 계산 $ cc –lm –o prog11-20 prog11-20.c $ prog11-20 x log(x) sqrt(x) exp(x) pow(10.0, x) (예 계속) 수치 연산 output

52 11.5 기타 함수 표 11.10 수치 연산 표준 함수 종류 함수 기능 인수형 함수형 산술 exp(x) log(x)
기타 함수 표 수치 연산 표준 함수 종류 함수 기능 인수형 함수형 산술 exp(x) log(x) log10(x) sqrt(x) pow(x, y) 지수 ex 자연 로그 loge x 상용 로그 log10x 제곱근 xy 모두 double 모두 double 삼각 sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) atan2(y, x) sinh(x) cosh(x) tanh(x) sine, x 단위: radian cosine, x 단위: radian tangent, x 단위; radian arcsine, -π/2~π/2의 값이 반환됨 arccosine, 0~π의 값이 반환됨 arctangent, -π/2~π의 값이 반환됨 arctangent(y/x), -π~π의 값이 반환됨 hyperbolic sine hyperbolic cosine hyperbolic tangent

53 11.5 기타 함수 표 11.10 수치 연산 표준 함수(계속) 종류 함수 기능 인수형 함수형 절대값 abs(k) cabs(z)
기타 함수 표 수치 연산 표준 함수(계속) 종류 함수 기능 인수형 함수형 절대값 abs(k) cabs(z) 정수 k의 절대값 복소수 z의 절대값 int complex double 각종 변환 ceil(x) floor(x) fmod(x, y) modf(x, p) 실수 x보다 작지 않은 최소의 정수(double) 실수 x보다 크지 않은 최대의 정수(double) 실수 x를 실수 y로 나눈 나머지 x의 소수부를 함수값으로 반환하고, 정수부를 p로 반환 x는 double p는 double* 난수 rand() srand() 0~32767(int 형, 양수값 최대)의 정수 난수 난수열의 개시점을 설정. 재개시의 경우 seed는 1이 됨 void

54 11.5 기타 함수 <프로세스 제어 표준 함수> 프로세스 = 동작하기 시작하여 아직 종료되지 않은 프로그램
기타 함수 <프로세스 제어 표준 함수> 함수명 기능 abort execXX exit/_exit system 프로세스를 비정상 종료시킴 아들 프로세스의 실행, 아빠 프로세스 로 반환하지 않는다. XX로는 l, le, lp, lpe, ve, vp, vpe가 있음. 프로세스의 종료 운영체제 명령어의 실행, 아빠 프로세스로 반환함 프로세스 = 동작하기 시작하여 아직 종료되지 않은 프로그램 디스크에 저장된 실행가능한 file은 프로세스가 아니다.

55 기타 함수 그림 11.5 프로세스 생성과 종료

56 11.5 기타 함수 void abort() void exit(status) void _exit(status)
기타 함수 <프로세스 제어> void abort() void exit(status) void _exit(status) int status; /* 종료 코드 */ - abort()는 “abnormal process termination”이란 메시지를 srderr에 출력한다. - exit()과 _exit()은 이 프로세스를 생성한 parent process가 wait를 수행하면, 실제 status값이 전달된다. - status값은 정상 종료인 경우 0, 기타의 경우는 임의 값을 사용하는 것이 보통이다. - exit()은 모든 open된 file을 플러시(flush)하고 닫지만, _exit()는 닫지 않는다.

57 11.5 기타 함수 int system(command) char *command; /* 운영체제의 쉘 명령어 */
기타 함수 <프로세스 제어> int system(command) char *command; /* 운영체제의 쉘 명령어 */ (예 11.20) 함수 system()의 사용 - 임의의 쉘 명령어를 C 프로그램 내에서 동작시킬 수 있다. /* (1) UNIX 기계에서 사용시 2001년 달력을 표준출력(stdout)으로 출력 */ system(“cal 2001”); /* (2) MS-DOS 기계에서 abc.txt 파일을 표준출력으로 출력 출력 */ system(“type abc.txt”); /* (2’) UNIX 기계에서 abc.txt 파일을 표준출력으로 출력 출력 */ system(“cat abc.txt”); /* (3) MS-DOS 기계에서 abc.c 파일을 프린터로 출력 */ system(“copy abc.c > prn”); (예 11.20) 함수 system

58 11.7 예 제 (예제 11.1) 16진수 덤프 프로그램 예제 11.1 output $ cat simple.c
예 제 (예제 11.1) 16진수 덤프 프로그램 예제 output $ cat simple.c int main(void) { printf(“Hello, world!”); } $ cc –o dump ex11-1.c $ dump simple.c 0000: 69 6e d e int main 0008: f b (void) { 0010: 0a Prin 0018: c 6c tf(“Hell 0020: 6f 2c f 72 6c 64 o, world 0028: b 0a 7d 0a !”);.}.

59 (2) 명령어줄 인수수를 확인했으므로 파일을 읽을 수 있게 open한다.
(예제 11.1 계속) 16진수 덤프 프로그램 예제 11.1(계속) ex11-1.c [해 설] /* File : ex11-1.c 진수 덤프 프로그램 */ #include <stdio.h> #include <fcntl.h> #define SIZE 8 int main(int argc, char *argv[]) { int fd, i, n, adr = 0; unsigned char buf[SIZE]; /* (1) */ if (argc != 2) { printf(“Usage: %s infile\n”, argv[0]); exit(1);} if ((fd = open(argv[1], O_RDONLY)) == -1) { /* (2) */ printf(“cannot open %s\n”, argv[1]); exit(1); } (1) 버퍼 선언 (2) 명령어줄 인수수를 확인했으므로 파일을 읽을 수 있게 open한다.

60 (3) fd번 파일로부터 buf에 8바이트를 읽어옴
(예제 11.1 계속) 16진수 덤프 프로그램 while ((n = read(fd, buf, SIZE)) != 0) { /* (3) */ printf(“%04x: ”, SIZE*adr++); /* (4) 시작주소의 위치 */ for (i = 0; i < SIZE; i++) /* (5) 16진 덤프 */ if (i < n) printf(“%02x ”, buf[i]); else printf(“ ”); for (i = 0; i < n; i++) { /* (6) ASCII 표시 */ if (buf[i] >= ‘ ’ &&buf[i] <= ‘~’) putchar(buf[i]); else putchar(‘.’); } putchar(‘\n’); } close(fd); 30 } 예제 11.1(계속) ex11-1.c [해 설] (3) fd번 파일로부터 buf에 8바이트를 읽어옴 (4) adr는 8바이트 마다 증가하는 변수이다. 즉 시작주소는 8*adr이 된다. %04x는 4자리잡고 16진법으로 좌측 공백은 0으로 채우라는 뜻 (5)의 for문(줄16-20): 16진수 폭 2자리로 출력 명령어줄 인수수를 확인했으므로 파일을 읽을 수 있게 open한다. (6)의 for문(줄21-26): 각 줄 우측에 입력 file을 줄 당 8자씩 출력

61 줄 12,14: 입력 file을 열고, 출력 file을 생성
(예제 11.2) 비버퍼형 I/O이용 file 복사 /* File : ex11-2.c 명령어 줄에서 입, 출력 file명을 받고, 비버퍼형 I/O를 이용한 file 복사 */ #include <stdio.h> #define SIZE 256 #define PERMS /* owner는 일고 쓸수있고, 기타는 읽을 수 있게 */ int main(int argc, char *argv[]) { int fd1, fd2, n; char buf[SIZE]; void error(); if (argc != 3) error(“Usage: %s fromfile tofile”, argv[0]); if ((fd1 = open(argv[1], 0)) == -1) { /* 입력용 file을 개방 */ error(“cannot open %s”, argv[1]); if ((fd1 = creat(argv[2], PERMS)) == -1) { /* 새 file을 생성 */ error(“cannot open %s”, argv[2]); 16 예제 11.2 ex11-2.c [해 설] 줄 10-11: (쉘) 명령어 줄 인수수 확인 줄 12,14: 입력 file을 열고, 출력 file을 생성

62 예제 11.2(계속) ex11-2.c [해 설] output
(예제 11.2 계속) 비버퍼형 I/O이용 file 복사 while ((n = read(fd1, buf, SIZE)) > 0) if (write(fd2, buf, n) != n) error(“write error”, (char *) 0); 20 } 21 22 void error(char *s1, char *s2) 23 { fprintf(stderr, s1, s2); fprintf(stderr, “\n”); exit(1); 27 } 예제 11.2(계속) ex11-2.c [해 설] output 줄 17-19: 256자씩 fd1번 file에서 읽어서 fd2번 file로 출력함 줄 18의 write의 반환값이 n이 아닌 경우는 가령 디스크가 찼다거나 등의 심각한 에러의 경우임. 함수 error는 stderr(표준에러)로 에러 메시지를 출력하고 종료한다. $ ex11-2 simple.c tmp.c $ cat tmp.c int main(void) { printf(“Hello, world!”); }

63 fd 번으로 개방된 file에서 pos 번째 바이트 부터 n개의 문자를 buf가 가리키는 버퍼로 읽어들이는 함수
(예제 11.3) 함수 lseek를 이용하여 fd번으로 개방된 file의 특정 위치부터 원하는 수의 바이트를 읽어들이는 함수를 작성하라. int rand_get(int fd, long pos, char buf[], int n) { if (lseek(fd, pos, 0) == -1) return -1; return read(fd, buf, n); } 예제 [해 설] fd 번으로 개방된 file에서 pos 번째 바이트 부터 n개의 문자를 buf가 가리키는 버퍼로 읽어들이는 함수 lseek로 pos번째 위치로 이동한 다음 read로 n 개의 바이트를 읽으면 된다.

64 (예제 11.4) strcmp이용 이름의 배열을 알파벳 순으로 정렬
/* File : ex11-4.c 이름의 배열을 알파벳 순으로 정렬 */ #include <stdio.h> #define N 8 int main(void) /* 이름의 정렬 */ { static char *nam[] = { “pak, seri”, “park, chanho”, “sun, dongyul”, “cha, bumgun”, “shin, pearl”, “lee, jongbum”, “lee, samson”, “suh, jungwon” }; /* (1) */ char *dummy, *min; int j, k, ind; 예제 11.4 ex11-4.c [해 설] (1) 즉 줄 8-13: 이름들의 배열을 선언

65 (예제 11.4 계속) strcmp이용 이름의 배열을 정렬
for (k = 0; k < N - 1; k++) { /* (2) */ min = nam[k]; ind = k; for (j = k + 1; j < N; j++) if (strcmp(nam[j], min) < 0) { /* (3) */ min = nam[j]; ind = j; } dummy = nam[k]; nam[k] = nam[ind]; nam[ind] = dummy; } for (k = 0; k < N; k++) printf(“%s\n”, nam[k]); 28 } 예제 11.4(계속) ex11-4.c [해 설] (2): k번째부터 N-1번째의 이름 들 중 최소의 이름에 대한 포인터를 min에 저장하려 한다. 그 때의 배열 인덱스를 ind에 저장한다. 이름자체의 교환이 아닌 포인터의 교환을 실행하고 있다. (3): name[j]의 이름이 현재 최소 이름 min보다 작은지를 평가한다. 줄 24: name[k]와 name[ind]가 가진 포인터를 교환한다.

66 (예제 11.4 계속) strcmp이용 이름의 배열을 정렬
예제 11.4(계속) output cha, bumgun lee, jongbum lee, samson pak, seri park, chanho shin, pearl suh, jungwon sun, dongyul

67 예제 11.5 1 /* File : ex11-5.c 2 sin 곡선과 cos 곡선을 합성시켜 출력하시오 */
#include <stdio.h> #include <math.h> #define deg2rad / 180 int main(void) /* 삼각함수 곡선 */ { char p[30]; int ts, tc, n; printf(“%10s%s%9s%10s\n”, “”, “-1”, “0”, “+1”); printf(“%10s%s\n”, “”, “ ”); for (n = 0; n <= 360; n = n + 15) { strcpy(p, “ | ”); /* (1) */ ts = (int) ( * sin(n * deg2rad)); /* (2) */ tc = (int) ( * cos(n * deg2rad)); /* (2) */ if (ts == tc) /* (3) */ p[ts] = ‘+’; else { p[ts] = ‘*’; p[tc] = ‘0’; } printf(“%5d %s\n”, n, p); } 22 } 예제 11.5

68 줄 5: 각도를 라디안으로 바꾸기 위해 곱하는 수 줄 9-10: 타이틀 출력 줄 11-20: 15도 마다 출력. 줄 12: 문자 배열 p를 초기화 한다. p는 한 줄을 출력하기 위해 사용 줄 13,14: sin 값/cos값 위치를 (-1~1을 0~20으로 변환 후) 알아냄. 줄 16, 18: 배열 p의 원소 중 sin, cos위치에 표시 링크 시 수학 라이브러리(lm)를 연결해주어야 함 예제 11.5(계속) [해 설]

69 (예제 11.5 계속) sin과 cos 곡선을 함께 출력
* | * | * 0 | | * | * | * | * | * | * | * | * *| * | * | | * | * | * * | 0 * | 0 * | * | * | * 예제 11.5(계속) output

70 예제 11.6 1 /* File : ex11-6.c 2 다음 프로그램을 설명하라. */
다음 프로그램을 설명하라. */ #include <stdio.h> #define SIZE 80 int main(int argc, char *argv[]) { char buf[SIZE]; char *firstname, *surname, *malloc(); printf(“Enter your first name : ”); gets(buf); /* 문자열 종료 표시하는 ‘\0’ 표시 위해 1 바이트 더 필요 */ firstname = malloc(strlen(buf) + 1); strcpy(firstname, buf); printf(“Enter your surname : ”); gets(buf); surname = malloc(strlen(buf) + 1); strcpy(surname, buf); printf(“Hello, %s %s!\n”, firstname, surname); 19 } 예제 11.6 Enter your first name : Eugene Enter your surname : Park Hello, Eugene Park!

71 /* File : ex11-7.c 표준 입력에서, 대문자, 소문자, 숫자(0에서 9), 공백, 제어 문자, 구둣점 및 아스키 이외의 문자들의 각각의 수를 출력하는 프로그램 */ #include <stdio.h> #include <ctype.h> int main(void) { unsigned long upc = 0L; /* 대문자 계산 */ unsigned long lwc = 0L; /* 소문자 계산 */ unsigned long dgc = 0L; /* 숫자 계산 */ unsigned long wsc = 0L; /* 공백 계산 */ unsigned long cnc = 0L; /* 제어 문자 계산 */ unsigned long pnc = 0L; /* 구두점 계산 */ unsigned long nac = 0L; /* 비 ASCII 계산 */ int c; while ((c = getchar()) != EOF) { if (!isascii(c)) nac++; else if (islower(c)) lwc++; else if (isspace(c)) wsc++; else if (isupper(c)) upc++; else if (isdigit(c)) dgc++; else if (ispunct(c)) pnc++; else if (iscntrl(c)) cnc++; } 예제 11.7

72 예제 11.7(계속) output 25 printf(“non-ascii count = %ld\n”, nac);
printf(“lowercase count = %ld\n”, lwc); printf(“uppercase count = %ld\n”, upc); printf(“whitespace count = %ld\n”, wsc); printf(“digit count = %ld\n”, dgc); printf(“punctuation count = %ld\n”, pnc); printf(“control character count = %ld\n”, cnc); 32 } 예제 11.7(계속) output $ ex11-7 < ex11-7.c non-ascii count = 162 lowercase count = 467 uppercase count = 16 whitespace count = 238 digit count = 12 punctuation count = 195 control character count = 0


Download ppt "Chapter 11– 표준 함수(2) Outline 11.1 저수준 파일 입출력 함수 11.2 문자열과 자료 변환 함수"

Similar presentations


Ads by Google