500 likes | 741 Views
제 10 장 문자 입출력 함수. 목 차. 문자 입출력 함수 개요 단일 문자 입출력 함수 문자열 입출력 함수 연습문제. 문자 입출력 함수. 처음에는 함수의 부재로 고생하게 되지만 나중에는 그 함수들을 만들게 됨 문자 입출력 함수는 크게 단일문자 입출력함수와 문자열 입출력함수로 나뉨. 문자 입출력 함수의 종류. 문자 입출력 함수의 종류. 출력한다 . put, print 라는 단어가 들어감 예 ) print f(), put s(), put c(), f print f() 입력한다 .
E N D
목 차 • 문자 입출력 함수 개요 • 단일 문자 입출력 함수 • 문자열 입출력 함수 • 연습문제
문자 입출력 함수 • 처음에는 함수의 부재로 고생하게 되지만 나중에는 그 함수들을 만들게 됨 • 문자 입출력 함수는 크게 단일문자 입출력함수와 문자열 입출력함수로 나뉨
문자 입출력 함수의 종류 • 출력한다. • put, print라는 단어가 들어감 • 예) printf(), puts(), putc(), fprintf() • 입력한다. • get, scan이라는 단어가 들어감 • 예) getc(), getchar(), scanf(), fscanf() • 파일에서 입출력을 처리한다. • 가장 앞 머리에 ‘f’가 들어감 • 여기서의 파일이란 개념은 우리가 일반적으로 알고 있는 파일이 아닌 유닉스의 파일 개념을 따름 • 일반적인 의미에서의 파일이란 하드 디스크에 저장되어 있는 파일을 뜻하지만 유닉스에서의 파일이란 플로피 디스크나 마그네틱 디스크, CD ROM등이 모두 될 수 있음 • 결국 파일에 무언가 쓴다는 것은 하드 디스크 뿐만 아니라 CD ROM에 기록하는 것도 포함됨 • C가 유닉스라는 운영체제를 만들기 위해서 탄생한 만큼 꼭 알아두어야 하는 개념임 • 예) fputc(), fputs(), fgets(), fprintf(), fscanf()
문자 입출력 함수의 종류 • 하나의 문자를 입출력 • 가장 끝머리에 c나 char이 들어감 • 예) getc(), getchar(), putc(), putchar() • 문자열을 처리 • 가장 끝머리에 s가 들어감 • 예) gets(), puts()
문자 입출력 함수의 종류 • 사용자로부터 이름을 입력 받고 싶다. • fgets()를 사용 • gets()나 scanf()를 사용할 수도 있지만 fgets()를 사용하는 것이 좋음 • gets()는 문자열을 다룰 때 절대 사용하지 말아야 할 함수이며 scanf()는 공백이 포함된 문자열을 다룰 때 문제가 발생함 • 사용자로부터 하나의 문자를 입력 받고 싶다. • (사용자에게 어떤 문제를 제시하고 ‘y’나 ‘n’과 같은 간단한 문자를 입력 받아 처리하고 싶을 때가 이에 해당) • getchar()을 사용 • getc()나 fgetc()는 일단 파일에서 입력 받는다고 생각하고 제외 (STDIO를 사용하면 사용자로부터 받을 수 있음) • scanf()는 너무 무거운 함수이기 때문에 사용을 자제해야 함
문자 입출력 함수의 종류 • 파일에서 문자열을 입력 받는다. • 파일에서 문자열을 입력 받을 때는 두 부류로 나눌 수 있는데 파일의 내용이 어떤 규칙성을 가지며 행 단위로 배열되어 있다면 fscanf()를 사용하는 것이 편리하고 특별한 규칙성이 없이 읽어 들이는 것에만 초점이 맞추어져 있다면 fgets()를 사용하는 것이 편리 • 일반적으로는 파일에서 읽어 들일 때에는 fscanf()나 fgets()보다는 fgetc()나 getc()를 많이 사용 • 왜냐하면 파일을 C로 처리할 때는 비트나 바이트 단위로 처리할 때가 많으며 문자열 단위로 읽어 들이는 경우가 많지 않기 때문임 • 화면에 하나의 문자를 출력하고 싶다. • printf()나 putchar()를 사용 • 일반적으로 하나의 문자라도 printf()를 사용하는 경우가 많은데 하나의 문자를 출력할 때는 꼭 putchar()를 사용하는 것이 좋음. (putchar()이 printf()보다 훨씬 가벼운 함수이며 빠르기 때문)
문자 입출력 함수의 종류 • 화면에 문자열을 출력하고 싶다. • 이때는 두 가지로 분류해 볼 수 있다. 화면에 단순히 출력하는 경우와 특정한 형식에 맞추어서 출력하는 경우이다. 단순히 문자열만 출력하려면 puts()를 사용하는 것이 좋은데 특히 puts()는 자동 개행문자를 포함하기 때문에 좀더 심플하게 출력이 가능함 • 하지만 특정한 형식에 맞추어서 문자열을 출력하려면 puts()는 그 기능을 하지 못하므로 printf()를 사용 (간단한 문자열은 puts()를 사용하는 것이 좋음. printf()보다 훨씬 가벼움) • 파일에 문자열을 출력하고 싶다. (저장하고 싶다.) • 파일에 출력하고 싶은 내용이 특정한 형식을 취하고 있는지 아닌지에 따라서 다른 함수가 사용되는데 특정한 형식을 취해야 한다면 fprintf()가 적당하며 단순히 문자열을 파일에 기록하는 것이라면 fputc()나 putc()를 사용
버퍼의 개념 • 예제 (버퍼로 인한 문제점)
버퍼의 개념 • 버퍼란? • 버퍼(buffer)는 ‘완충 물, 쿠션’이라는 개념을 가지고 있음 • 완충이라는 것은 부족한 것에 대한 보완, 보충의 의미가 있는데 컴퓨터에서는 이 완충이 바로 메모리와 하드 디스크 간의 속도 차를 완화해 주고 있음 • 컴퓨터에서의 버퍼는 임시 저장 장소를 뜻함 • 임시 저장 장소에 저장되는 내용은 문자나 문자열, 숫자 등 어느 것이나 올 수 있는데 입출력의 효율을 위해서 사용함
putchar() • 예제 (단일 문자 출력)
getchar() • 예제 (단일 문자 입력: 다음의 프로그램에서 문제점은?)
getchar() • getchar()의 입력형태
getchar() • 버퍼 경유 입출력 함수 특성처리
puts() • int puts(const char *s); • 인자 : 문자열 포인터 • 리턴값 : 출력되는 문자의 길이 (일반적으로 무시) • 간이 예제 • puts(“jung jae une”); • char *imsi = “archie”; • puts(imsi); • puts(“line one”); • puts(“line two”);
puts() • 포인터와 문자열
gets(), fgets() • char *fgets(char *s, int size, FILE *stream); • stream으로부터 size 크기만큼 얻어 s에 저장 char *imsip; imsip = (char *)malloc(20); • 다음처럼 포인터를 사용할 수 도 있음
목 차 • 문자열 함수 • 문자열 복사함수 • 문자열 연결함수 • 문자열 비교함수 • 문자열 탐색함수 • 문자열 변경함수 • 문자 검사함수 • 연습문제
문자열 함수 개론 • C의 문자열 함수는 다른 언어에 비해 부족함 • 함수의 이름이 함축적 임 • 사용법이 간단함
문자열 함수 종류 • strcasecmp, strncasecmp, strcat, strncat, strlcat, strchr, strrchr, strcmp, strncmp, strcpy, strncpy, strlcpy, strcspn, strspn, strdup, strlen, strpbrk, strstr, strtok, strtok_r
문자열 함수 분류 • str : string 문자열 함수를 총칭 • r : scan reversely 역순 • n : number of character 문자의 개수를 참조 • case : case insensitivity 대소문자를 구별하지 않음
문자열 복사함수 • char *strcpy(char *s1, const char *s2) • s2를 s1에 복사 • s2가 가리키는 문자열을 s1이 가리키는 영역에 복사 • char *strncpy(char *s1, const char *s2, size_t n) • s2를 s1에 n 문자길이만큼 복사 • s2가 가리키는 문자열을 s1이 가리키는 영역에 n 글자만큼 복사
문자열 복사함수 • 예제 (strcpy())
strncpy() • 예제(strncpy())
strcat() • char *strcat(char *s1, const char *s2) • s1의 끝에 s2의 문자열을 추가 • s1이 가리키는 문자열의 끝에 널 문자를 제거하고 s1이 가리키는 문자열을 추가
strncat() • char *strncat(char *s1, const char *s2, size_t n) • s1에 s2의 n 길이만큼 추가 • s2가 가리키는 주소 값부터 n 길이만큼의 문자를 s1이 가리키는 문자열의 끝에 추가
sprintf() • int sprintf(char *str, const char *format, ...);
문자열 비교함수 • int strcasecmp(const char *s1, const char *s2) • s1과 s2의 문자열을 비교하여 일치하면 0을 리턴 • s1이 가리키는 문자열과 s2가 가리키는 문자열을 비교하고 일치하면 0을 리턴 하고 아니면 양수나 음수를 리턴 • 리턴 값이 0이면 두 문자열은 일치 • 대소문자는 구별하지 않음 • int strncasecmp(const char *s1, const char *s2, size_t n) • s1과 s2의 문자열을 n 길이만큼만 비교하여 일치하면 0을 리턴 • s1이 가리키는 문자열과 s2가 가리키는 문자열을 n 길이만큼만 비교하고 일치하면 0을 리턴 하고 아니면 양수나 음수를 리턴 • 0이면 두 문자열은 일치 • 대소문자는 구별하지 않는다.
문자열 비교 함수 • int strcmp(const char *s1, const char *s2) • s1과 s2를 비교하여 일치하면 0을 리턴 • s1이 가리키는 문자열과 s2가 가리키는 문자열을 비교하고 일치하면 0을 리턴 하고 아니면 양수나 음수를 리턴 • 대소문자를 구별함
문자열 비교함수 • int strncmp(const char *s1, const char *s2, size_t n) • s2의 문자 중에서 n 길이만큼 s1과 비교하여 같으면 0을 리턴 • s2가 가리키는 문자열 중에서 n 길이만큼 s1이 가리키는 문자열과 비교하고 같으면 0을 리턴 • 대소문자를 구별함
문자열 비교함수 • int strncmp(const char *s1, const char *s2, size_t n) • s2의 문자 중에서 n 길이만큼 s1과 비교하여 같으면 0을 리턴 • s2가 가리키는 문자열 중에서 n 길이만큼 s1이 가리키는 문자열과 비교하고 같으면 0을 리턴 • 대소문자를 구별함
문자열 탐색함수 • char *strchr(const char *s, int c) • 문자열 s에서 문자 c가 발견되면 발견된 위치를 리턴 • s가 가리키는 문자열에서 문자 c가 발견되면 발견된 위치를 주소 값으로 리턴 • 만약 발견되지 않으면 널 포인터가 리턴 됨
문자열 탐색함수 • char *strrchr(const char *s, int c) • 문자열 s에서 문자 c가 발견된 위치를 리턴(단, 탐색은 앞이 아닌 뒤에서 함) • s가 가리키는 문자열에서 뒤쪽부터 c 문자를 탐색 (만약 발견하지 못하면 널 포인터가 리턴 됨)
문자열 탐색함수 • char *strstr(const char *s1, const char *s2) • 문자열 s1에서 문자열 s2를 찾아 일치하면 위치를 리턴 • s1이 가리키는 문자열에서 s2가 가리키는 문자열을 탐색하고 일치하는 위치의 주소 값을 리턴(만약 일치하는 문자열이 발견되지 않으면 널 포인터를 리턴함)
문자열 탐색함수 • char *strpbrk(const char *s1, const char *s2) • 문자열 s1 중에서 문자열 s2에 속해있는 어떠한 문자라도 발견되면 발견된 위치를 리턴 • s1이 가리키는 문자열 중에서 s2가 가리키는 문자열에 속해있는 어떠한 문자라도 발견되면 그 위치의 주소 값을 리턴
atoi() • 예제 (atoi())
sprintf() • 예제 (sprintf())
문자 검사함수 • 예제 (소문자를 대문자로 출력)
두 문자열을 비교하고 그 결과를 숫자가 아닌 다음과 같은 문자열로 출력하시오. • 일치할 때 : 두 문자열은 같습니다. • 일치하지 않을 때 : 두 문자열은 일치하지 않습니다. • 사용자로부터 두 개의 문자열을 입력 받고 두 문자열의 순서를 바꾸어서 다른 배열에 저장한 후 저장된 배열을 출력하시오. • 입력 : archie jung • 출력 : jung archie
사용자로부터 문자열을 입력 받고 그 중에서 숫자가 아닌 것만 출력하시오. • 사용자로부터 3 라인을 입력 받고 문자열의 길이와 라인 수, 공백 수를 출력하시오. (단, isspace() 함수를 사용한다.)
사용자로부터 소수점이 있는 숫자를 입력 받고 다음과 같이 출력하도록 프로그램 하시오. (단, sprintf() 함수를 사용하시오.) 입력 : 34.25 출력 : 34.25 (소수점 이하 2 자리) 입력 : 17.9478 출력 : 17.9478 (소수점 이하 4자리)
사칙 연산을 하는 프로그램을 작성하시오. (단, 우선순위는 없으며 앞에서부터 처리) 입력 : 5 + 3 * 7 출력 : 56 // 만약 우선순위를 처리한다면 105가 출력된다. // 할 수 있다면 우선순위의 개념을 넣어보자. // 이때는 스택의 개념이 필요하다. • 10개의 정수 값을 받아 들이고 이중에서 가장 큰 수와 가장 작은 수를 출력하시오.