chapter 10 문자열

80
Chapter 10 문문문

Upload: lexiss

Post on 15-Jan-2016

48 views

Category:

Documents


1 download

DESCRIPTION

Chapter 10 문자열. 문자열. 문자열이란 ? 널문자 (\0) 로 끝나는 char 타입 배열 문자열 정의 방식 문자열 상수 char 배열 char 포인터 문자열의 배열 문자열 상수 큰 따옴표로 둘러싸인 모든 문자들 큰 따옴표로 둘려싸인 문자들 끝에 컴파일러에 의해 자동으로 ‘ \0 ’ 문자가 더해져서 메모리에 문자열로 저장 #define 을 이용하여 정의되기도 함 메모리 공간 내에서 static storage class 에 위치함. 문자열 배열. 문자열 배열 - PowerPoint PPT Presentation

TRANSCRIPT

Chapter 10문자열

비트교육센터[2]

비트교육센터

문자열

문자열이란 ?– 널문자 (\0) 로 끝나는 char 타입 배열

문자열 정의 방식– 문자열 상수– char 배열– char 포인터– 문자열의 배열

문자열 상수– 큰 따옴표로 둘러싸인 모든 문자들– 큰 따옴표로 둘려싸인 문자들 끝에 컴파일러에 의해 자동으로 ‘ \0’ 문자가 더해져서

메모리에 문자열로 저장– #define 을 이용하여 정의되기도 함– 메모리 공간 내에서 static storage class 에 위치함

비트교육센터[3]

비트교육센터

문자열 배열

문자열 배열– char 타입의 문자들을 하나의 이름아래 배열로 묶어 놓은 것– 문자열 배열 정의 시에 컴파일러에게 필요한 공간의 크기를 알려주어야 한다 .– 배열 크기는 반드시 배열 요소의 개수보다 적어도 1 큰수를 지정하여 널문자를

위한 공간을 마련한다 .

문자열 배열의 초기화– 다른 타입의 초기화 방법과 비슷하게 이루어짐– 배열 크기를 직접 줄 수도 있고 초기화를 겸할 경우 생략할 수도 있다 .– 배열 크기가 초기화 문자열의 크기보다 큰 경우 사용되지 않는 배열 요소는

널문자로 자동 초기화된다 .

#define MAXLEN 81 // 최대 문자열 길이 + 1

char name[MAXLEN]; // 최대 80 개의 문자를 입력할 수 있는 배열

const char msg1[ ] = “Hello”; // 배열 크기를 주기 않고 컴파일러에게 맡김

const char msg2[ ] = {‘H’,’e’,’l’,’l’,’o’,’\0’};

비트교육센터[4]

비트교육센터

문자열 배열과 문자열포인터

문자열 배열 (msgarr[])– 저장공간 크기 : 17– msgarr 이라는 이름은 주소를 나타내긴 하지만 주소가 바뀔 수 없는 상수– msgarr+1, msgarr+10 과 같은 연산 가능– msgarr++, msgarr– 과 같은 연산 불가능

문자열 포인터 (msgptr)– 저장공간 크기 : 17– 포인터 이므로 주소가 바뀔 수 있다 .– msgptr+1, msgptr+10 과 같은 연산 가능– msgptr++, msgptr— 과 같은 연산 불가능

char msgarr[] = “Nice to meet you”; // 문자열 배열

char * msgptr = “Nice to meet you”; // 문자열 포인터

비트교육센터[5]

비트교육센터

문자열들의 배열

문자열배열의 배열 (whatday1)– 크기가 10 인 문자열 배열을 7 개 가진다 .

문자열 포인터들의 배열 (whatday2)– 크기가 일정하지 않은 문자열을 가리키는 포인터 7 개를 가진다 .

char whatday1[7][10] = { “Sunday”, ”Monday”, “Tuesday”, ”Wednesday”, “Thursday”, ”Friday”, ”Saturday” };char *whatday2[7] = { “Sunday”, ”Monday”,

“Tuesday”, ”Wednesday”, “Thursday”, ”Friday”, ”Saturday” };

비트교육센터[6]

비트교육센터

문자열 함수 – string.h(I)

- src 가 가리키는 문자열 ( 널문자 포함 ) 을 dest 가 가리키는 위치에 복사한다 .- 반환값 : dest

- src 가 가리키는 문자열을 dest 가 가리키는 위치에 num 개의 문자만 복사한다 .- 널문자 이후의 문자는 복사되지 않는다 .- 소스 문자열이 num 보다 짧을 경우 dest 에는 널문자가 나머지 부분을 채운다 .- 반환값 : dest

char *strcpy (char *dest, const char *src );

char *strncpy (char *dest, const char *src, size_t num );

비트교육센터[7]

비트교육센터

문자열 함수 – string.h(II)

- dest 가 가리키는 문자열의 끝에 src 가 기리키는 문자열을 복사한다 .- src 문자열의 첫번째 문자는 dest 문자열의 널문자를 덮어쓴다 .- 반환값 : dest

- src 문자열의 처음 num 개의 문자만 dest 가 가리키는 문자열의 끝에 복사된다 .- 반환값 : dest

char * strcat (char * dest, const char * src);

char * strncat(char * dest, const char * src, size_t num);

비트교육센터[8]

비트교육센터

문자열 함수 – string.h(III)

- string1 과 string2 를 비교한다 .- string1 < string2 인 경우의 반환값 : < 0 (0 보다 작은 수 )- string1 > string2 인 경우의 반환값 : > 0 (0 보다 큰 수 )- string1 = string2 인 경우의 반환값 : 0

- string1 의 num 개의 문자와 string2 의 num 개의 문자를 비교한다 .- 반환값 : 위의 strcmp 의 경우와 같다 .

int strcmp (const char * string1, const char * string2);

int strncmp (char * string1, const char * string2, size_t num);

비트교육센터[9]

비트교육센터

문자열 함수 – string.h(IV)

- string 에서 c 문자를 찾는다 .- 반환값 : c 문자가 발견되면 처음으로 c 문자가 나타나는 위치를 반환하고 , 발견하지

못하면 NULL 이 반환된다 .

- string 에서 c 문자를 찾는다 .- 반환값 : c 문자가 발견되면 마지막으로 c 문자가 나타나는 위치를 반환하고 ,

발견하지 못하면 NULL 이 반환된다 .

char * strchr (const char * string, int c );

char * strrchr (const char * string, int c );

비트교육센터[10]

비트교육센터

문자열 함수 – string.h(V)

- 두개 문자열의 문자들을 하나씩을 비교해가면서 string2 문자열에 있지 않은 문자가 string1 에서 처음 나타났을 때 , 그 문자 바로 전까지의 길이를 반환한다 .

size_t strspn (const char * string1, const char * string2 );

size_t strcspn (const char * string, int c );

- 두개 문자열의 문자들을 하나씩을 비교해가면서 string2 의 문자열에 포함되어 있는 문자가 string1 에 존재할 때 , 처음으로 나타난 문자의 위치를 반환한다 .

비트교육센터[11]

비트교육센터

문자열 함수 – string.h(VI)

- string 의 길이를 반환한다 .

size_t strlen (const char * string );

char * strpbrk (const char * string1., const char * string2 );

- string1 에서 string2 의 문자들 중 같은 문자를 발견하면 처음 문자를 반환한다 .

비트교육센터[12]

비트교육센터

문자열 함수 – string.h(VII)

- string1 에서 string2 가 처음으로 나타나는 위치를 찾아서 그 위치를 가리키는 포인터를 반환한다 .

char * strstr ( const char * string1, const char * string2 );

char * strtok (const char * string., const char * delimiters );

- string 을 delimiters 들 중 하나로 분리한다 .

비트교육센터[13]

비트교육센터

명령행 인수

main()– 정해진 매개변수 ( 인수 ) 를 가질 수 있다 .

– argc : argument count ( 명령행 문자열의 개수 )– argv : argument value ( 명령행 문자열 포인터의 배열 )

프로그램의 실행– 유닉스와 DOS Command Line 에서 프로그램의 이름으로 실행시 필요한 인수를

함께 전달한다 .

int main ( int argc, char * argv[] ) 또는 int main ( int argc, char * * argv )

C:\Example> Cexample 10 20 Hello// Cexample : 프로그램 이름 //10, 20, Hello : 세개의 문자열이 프로그램 수행에 필요한 인수

비트교육센터[14]

비트교육센터

연습문제1. strlen() 을 사용하지 않고 문자열의 길이를 구하는 함수를 구현하시오 .

2. strcpy() 를 사용하지 않고 문자열을 복사하는 함수를 구현하시오 .

3. strcmp() 를 사용하지 않고 문자열을 비교하는 함수를 구현하시오 .

4. strstr() 을 사용하지 않고 두개의 문자열을 받아서 첫번째 문자열에서 두번째 문자열의 위치를 찾아서 반환하는 함수를 구현하시오 .

5. atoi() 를 사용하지 않고 문자열을 int 형으로 변환하는 함수를 구현하시오 .

6. 대문자는 소문자로 소문자는 대문자로 바꾸어 출력하는 함수를 구현하시오 .

7. 사용자의 입력 문자열로부터 공백 또는 개행문자가 들어가지 않은 첫번째 단어만을 찾아서 출력하는 푸로그램을 구현하시오 .

8. “ 오늘은 2005 년 1월 1 일 입니다”와 같은 형식으로 현재의 날짜를 출력하는 함수를 구현하시오 .

9. 문자열 포인터의 배열을 알파벳 순서에 맞게 정렬하여 대문자 출력하는 함수를 구현하시오 . 이때 정렬하는 것은 실제 문자열들의 위치를 바꾸는 것은 아니고 포인터를 정렬하도록 한다 .

Chapter 11구조체와 사용자정의

비트교육센터[16]

비트교육센터

구조체란 ?

구조체란 ?– 하나 이상의 변수를 멤버로 갖는 새로운 자료형– 모든 변수의 데이터 타입이 달라도 가능– 포인터 변수나 배열도 멤버로 가능

구조체 정의– 구조체의 구조를 알려주는 작업– 컴퓨터로 하여금 데이터를 위한 공간이 할당되지 않는다 .

struct phone { //phone 이라는 이름 (태그 ) 의 구조체 선언char name[20]; // 첫번째 구조체 멤버char phoneno[20]; // 두번째 구조체 멤버

}

비트교육센터[17]

비트교육센터

구조체 변수

구조체 변수의 선언– C언어의 기본 자료형 처럼 미리 선언된 구조체의 이름으로 변수를 생성하는 것– 데이터를 위한 공간이 할당된다 .

구조체 변수의 초기화– 배열을 초기화하는 방법과 유사한 구문을 사용하여 구조체 변수도 선언 시에

초기화할 수 있다 .

struct phone myphone; //앞에서 정의한 phone 형식의 구조체 변수를 선언함// 따라서 myphone 은 두개의 멤버 name 과 phoneno 를 갖게 되며//myphone 이 할당받는 데이터 공간은 총 40 바이트가 될 것

struct phone myphone = { “Hong, Gil-Dong”, “02-111-1234” };//myphone 의 name멤버는 “ Hong, Gil-Dong” 으로 ,//phoneno 의 멤버는 “ 02-111-1234” 로 초기화되었다 .

비트교육센터[18]

비트교육센터

구조체 멤버로의 접근

멤버 연산자 (.)– 구조체의 각 멤버에 접근하기 위해서는 멤버 연산자 (.) 을 이용한다 .

struct phone { char name[20];char phoneno[20];

} myphone;puts(myphone.name);puts(myphone.phoneno);

비트교육센터[19]

비트교육센터

구조체의 배열

구조체의 배열– 다른 기본 자료형의 배열의 선언과 같은 방법으로 구조체의 배열이 선언된다 .

구조체 배열의 멤버 접근– 구조체 배열의 멤버도 구조체의 멤버에 접근 하던 것과 같은 방식으로 접근한다 .

struct phone { char name[20];char phoneno[20];

};struct phone phonelist[10];//name 과 phoneno 를 멤버로 하는 phone 형식의 구조체를 10 개 가지는 배열

struct phone phonelist[10];puts(phonelist[0].name);puts(phonelist[0].phoneno);//phonelist[0] 이 phone 형태이므로 위와 같은 접근이 당연하다 .

비트교육센터[20]

비트교육센터

구조체 포인터

구조체의 포인터– 구조체를 가리키는 포인터– 구조체를 가리키는 포인터를 함수로 넘김으로써 효과적으로 사용할 수 있다 .– 배열의 이름은 배열의 주소를 가리키는 포인터이지만 구조체의 이름은 포인터가 아니다 .

구조체 멤버의 접근– 화살표연산자 (->) 를 사용한다 .

struct phone { char name[20];char phoneno[20];

};struct phone myphone = { "Hong, Gil-Dong", "02-111-1234" };

struct phone *ptr = &myphone;// 구조체 phone 을 가리키는 포인터 ptr 을 선언하고 , //ptr 이 구조체 변수 myphone 의 주소를 갖도록 하였다 .

비트교육센터[21]

비트교육센터

구조체 문자열 멤버 (I)

문자의 배열로 선언– 문자열이 구조체 안에 저장된다 .

문자열을 가리키는 포인터로 선언– 문자열은 따로 저장되고 구조체 안에는 포인터만 저장된다 .– 포인터만 저장되므로 실제 문자열이 저장될 공간에 대해 명시적인 메모리 할당 및 해제가

반드시 요구된다 .

struct phone { char name[20];char phoneno[20]; };

struct phone myphone = { "Hong, Gil-Dong", "02-111-1234" };

// 이 경우 myphone 은 총 40 바이트의 공간 할당을 받는다 .

struct phone { char * name;char * phoneno; };

struct phone myphone = { "Hong, Gil-Dong", "02-111-1234" };

// 이 경우 myphone 은 총 8 바이트의 공간 할당을 받는다 .

비트교육센터[22]

비트교육센터

구조체 문자열 멤버 (II)

문자열을 가리키는 포인터로 선언 (cont’d)– 문자열을 위한 공간 할당 및 해제는 다음의 함수 호출로 이루어진다 .

• malloc() : 주어진 크기만큼 동적으로 메모리를 할당하는 함수• free() : 동적으로 할당된 메모리를 해제하는 함수• malloc() 과 free() 두 함수는 언제나 짝을 이루어 호출되어야 하며 , free() 함수 호출이 제대로 이루어 지지 않으면 메모리의 낭비 및 부족 현상을 초래할 수 있다 .

#include <stdlib.h>void* malloc(size_t size);void free(void* ptr);

비트교육센터[23]

비트교육센터

구조체의 중첩

구조체의 중첩– 구조체를 포함하는구조체 – 한 구조체가 다른 구조체를 멤버로 하는 것

struct addr { char city[10];char gu[10];char dong[10];char bungi[10];

};struct phone { char name[20];

char phoneno[20]; struct addr address;

};

비트교육센터[24]

비트교육센터

함수의 매개변수로의 구조체 (I)

함수의 매개변수로 구조체 전달 방법– 구조체의 멤버 넘기기– 구조체 변수 넘기기– 구조체 포인터를 넘기기

구조체 멤버 넘기기 – 구조체의 멤버가 단일 값 ( 기본 자료형 ) 인 경우 그 데이터 타입을 인수로 하도록

함수를 선언한다 .

구조체 변수 넘기기– 함수 호출 시 함수 내부에 똑같이 생긴 구조체의 복사본이 생성되며 원본 구조체의 멤버들 값으로 복사본 멤버들이 초기화된다 .

– 원본 구조체에 직접 접근하는 것이 아니므로 데이터에 대한 안전이 보장된다 .– 원본 구조체가 바뀌길 바란다면 같은 타입의 구조체가 반환 될 수 있도록 함수를

구현하여야 한다 .

비트교육센터[25]

비트교육센터

함수의 매개변수로의 구조체 (II)

구조체 포인터 넘기기– 구조체의 포인터를 통해 원본 주소가 전달되며 , 함수 내부에서는 모두 원본 구조체를 직접

접근하여 사용한다 .– 원본 구조체에 대한 안전이 보장되지 못한다 .– 안전에 대한 보장이 필요한 경우 const 로 선언하는 것이 좋다 .

비트교육센터[26]

비트교육센터

구조체 비트 필드

비트 필드– signed int 혹은 unsigned int 안에 인접한 비트들로서 , 구조체 멤버를 비트 단위로

나눌 수 있다– 구조체 선언에서 각 비트 필드에 레이블을 붙이고 크기를 지정한다 .– 각 비트마다 가질 수 있는 값은 오직 0 과 1뿐이다 .– 이식성 부분에서 문제가 발생할 수 있어서 일반적으로는 특정 하드웨어 장치의

지정된 형식에 맞춰 데이터를 넣는 경우에 사용된다 .

struct { unsigned int bold : 1; // 1 비트 : 0 or 1 의 값만 갖는다 .unsigned int italic : 1; // 1 비트 : 0 or 1 의 값만 갖는다 .unsigned int size : 7; // 7 비트 : 0 ~ 127 사이의 값을 갖는다 .

};

비트교육센터[27]

비트교육센터

공용체

공용체 (union) 란 ?– 서로 다른 데이터 타입을 동일한 메모리 공간에 저장하는 데이터 타입– 규칙적이지 않고 미리 알려지지 않은 여러 타입들을 담는 것– 여러 타입들 중 어느 한 시점에 한 타입만 의미 있는 값을 갖는다 .– 공용체 내의 여러 타입 중 현재 의미 있는 값을 가진 데이터 타입에 대한 추적은

프로그래머의 책임이다 .– 멤버로의 접근 방법은 구조체와 똑같이 멤버연산자 (.) 를 사용한다 .

struct MyType {

int num1;

double num2;

char ch;

} mytype;

//mytype 변수는 메모리에서 4+8+1을 한 만큼의 공간 (13 바이트 ) 를 갖게 된다 .

union MyType {

int num1;

double num2;

char ch;

} mytype;

//mytype 변수는 메모리에서 위의 세개의 데이터 타입중에서 가장 큰 타입인 double 형의 공간만큼만 즉 ,8 바이트만을 갖게된다 .

비트교육센터[28]

비트교육센터

열거형

열거형이란 ?– 정수형 상수를 표현하는 기호 이름을 선언하는 것– 프로그램의 가독성을 향상시키기 위해 사용

열거형의 기본값– 상수들은 기본적으로 0 부터 시작하여 1 씩 증가하는 정수를 갖는다 .

값 대입하기– 열거 목록의 상수에 특정 정수 값을 선택하여 지정할 수 있다 .

enum colors {RED, YELLOW, BLUE, GREEN};//RED=0,YELLOW=1,BLUE=2,GREEN=3의 값을 갖는다 .

enum font {ARIAL, CENTURY=10, GOTHIC, TIMESROMAN=20};// ARIAL=0,CENTURY=10,GOTHIC =11,TIMESROMAN=20 의 값을 갖는다 .

비트교육센터[29]

비트교육센터

typedef

typedef 란 ?– 이미 존재하는 자료형에 의미 있는 다른 이름을 부여하는 방법– typedef 를 구조체에 사용했을 경우 구조체 정의에 구조체의 이름 (태그 ) 를 주지

않아도 된다 .– 프로그램의 가독성이 좋아진다 .

typedef 와 #define 의 차이– #define 는 전처리기에 의해서 해석되며 , typedef 는 컴파일러에 위해 수행된다 .– #define 은 타입과 값 모두에 대해 이름을 부여할 수 있지만 , typedef 는 타입에

대해서만 이름을 부여할 수 있다 .

typedef unsigned char BYTE;BYTE b, b[3], *pb; //b 는 unsigned char 형 변수//b[3] 는 unsigend char 의 배열//pb 는 unsigned char 를 가리키는 포인터

비트교육센터[30]

비트교육센터

연습문제1. 복소수를 표현할 수 있는 구조체를 선언하고 복소수 두 개의 덧셈을 처리하여 반환하는 함수와

하나의 구조체를 받아서 출력하는 함수를 구현하시오 .

2. 1 번에서 정의한 복소수 구조체를 사용하여 복소수의 배열을 매개변수로 받아서 전체 합을 반환하는 함수를 구현하시오 .

3. 학생의 이름 , 학년 (1-4), 국어점수 , 영어점수 , 수학점수 , 그리고 평균을 가질 수 있는 구조체를 선언하고 사용자로부터 이름과 학년 , 3 과목의 점수를 입력 받는 함수와 구조체를 매개변수로 받아서 평균을 계산하여 저장하는 함수를 구현하시오 . 이 때 , 학생의 이름은 문자 20 자리를 갖는 배열로 선언한다 .

4. 3 번에서 정의된 구조체를 사용하여 20 명의 학생정보를 저장할 수 있는 배열을 선언하고 사용자로부터 정보를 입력 받는 함수와 학생의 이름으로 검색하여 학년 , 3 과목의 점수 , 평균을 출력하여 주는 함수로 구성된 프로그램을 구현하시오 .

5. 4 번의 프로그램에서 구조체의 정의 중 학생이름을 문자열을 가리키는 포인터로 바꾸어서 재 작성하시오 .

Chapter 12파일 I/O

비트교육센터[32]

비트교육센터

파일이란 ?

파일이란 ?– 디스크와 같은 저장 공간에 이름이 붙은 일부 영역– 중간이 끊이지 않은 바이트의 연속물이며 , 각 바이트는 개개로 읽혀지는 것

파일의 종류 – 텍스트 파일– 2 진 (binary) 파일

표준 파일– C 프로그램에서 자동으로 열리며 각각의 파일 (FILE*) 포인터로 지정하여 사용한다 .

파일 종류 파일 포인터 상태

표준 입력 파일 stdin 키보드

표준 출력 파일 stdout 화면

표준 오류 파일 stderr 화면

비트교육센터[33]

비트교육센터

파일의 열기와 닫기 (I)

파일 열기– 파일와 데이터를 주고 받을 수 있는 스트림을 생성하는 것– fopen() 함수로 파일을 연다 .– fopen() 함수는 파일이 성공적으로 열리면 해당하는 파일의 파일 포인터가 반환하고

파일열기에 실패하면 널 포인터를 반환한다 .– 파일 열기 모드 : 파일을 열고 나서 하고자 하는 작업이 “읽기” 인지 , 혹은 “쓰기”

인지에 따라서 모드를 지정해주어야 한다 .

#include <stdio.h>FILE * fopen(const char* filename, const char* mode);//filename : 열고자 하는 파일이름//mode : 파일에 대한 작업 모드

비트교육센터[34]

비트교육센터

파일의 열기와 닫기 (II)

파일 닫기 – 열린 파일에 대한 작업이 모두 끝나게 되면 닫아주어야 한다 .– fclose() 함수로 파일을 닫는다 .– fclose() 함수는 파일이 성공적으로 해당 파일 포인터가 가리키는 파일을 닫고 ,

필요에 따라서 버퍼를 플러시 한다 .– fclose() 함수는 파일이 성공적으로 닫혀지면 0 을 반환하고 , 오류가 발생하면 EOF

를 반환한다 .

#include <stdio.h>int fclose(FILE *stream);//stream : 닫고자 하는 파일을 가리키는 파일 포인터

비트교육센터[35]

비트교육센터

표준 입출력 함수

표준 입출력 함수– 파일을 열어서 파일의 처음부터 끝까지 차례대로 접근하여 데이터를 읽거나 쓴다 .

파일의 끝 (EOF) – 파일의 읽기 작업은 파일의 끝에 도달했을 때 종료되어야 한다 .– getc() 의 파일의 끝 : EOF(-1) - fgets() 의 파일의 끝 : NULL 포인터 (0)– fscanf() 의 파일의 끝 : EOF(-1)

함수 기능 키보드 / 모니터용 파일 / 키보드 / 모니터용

단일 문자 입력 getchar() getc()

단일 문자 출력 putchar() putc()

문자열 입력 gets() fgets()

문자열 출력 puts() fputs()

서식 지정 입력 scanf() fscanf()

서식 지정 출력 printf() fprintf()

비트교육센터[36]

비트교육센터

비트교육센터[37]

비트교육센터

비트교육센터[38]

비트교육센터

비트교육센터[39]

비트교육센터

임의접근 (Random Access)

임의 접근을 위한 입출력 함수– 파일을 열고 난 후 처음부터 끝까지 차례대로 읽는 것이 아니라 파일 내의 특정

바이트에 직접 접근한다 .– 파일을 배열처럼 사용할 수 있다 .

fseek() – 파일의 특정 바이트에 접근하는 함수– 세번째 매개변수 : 시작점 ( 파일 탐색을 시작할 지점 )– 두번째 매개변수 : 시작점으로부터의 거리를 알려주는 값

ftell() – 현재의 파일 위치를 반환하는 함수

#include <stdio.h>

int fseek(FILE * stream, long offset, int startpos);long ftell(FILE * stream);

비트교육센터[40]

비트교육센터

비트교육센터[41]

비트교육센터

기타 파일 입출력 함수

int ungetc(int c, FILE * fp)– c 가 가리키는 문자를 입력 스트림으로 반납한다 .

int fflush(FILE *fp)– 버퍼 내부의 기록되지 않은 모든 데이터를 fp 가 가리키는 파일로 출력한다 .

int setvbuf(FILE *fp, char *buf, int mode, size_t size)– 표준 입출력 함수가 사용할 버퍼를 직접 설정한다 .

int feof(FILE *fp)– 파일의 마지막에 도달했는지를 반환한다 .– 파일의 끝인 경우에 0 이 아닌 값을 , 끝이 아닌 경우에는 0 을 반환한다 .

int ferror(FILE *fp)– 파일로부터의 읽기 혹은 쓰기 오류가 발생했을 경우에 0 이 아닌 값을 반환하고 ,

정상적인 진행이었을 경우에는 0 을 반환한다 .

비트교육센터[42]

비트교육센터

2 진 입출력 함수

2 진 입출력– 2 진 형식 : 데이터가 파일에 저장될 때 프로그램이 이용하는 표현 방식과 동일한

방식을 이용하는 경우 – 텍스트 형식 : 데이터의 전부가 문자형식으로 데이터를 해석하여 저장하는 경우

fread()– 파일로부터 2 진 형식으로 데이터를 읽어온다 .

fwrite()– 파일에 2 진 형식으로 데이터를 쓴다 .

#include <stdio.h>

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);

size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp);

비트교육센터[43]

비트교육센터

비트교육센터[44]

비트교육센터

연습문제1. 친구들의 이름과 전화번호 , 나이 정보를 갖는 구조체의 배열 (최대 크기 100) 을 선언하고 , 사용자에게 메뉴를 보여주고 선택한 메뉴에 따라서 용도에 맞는 함수를 구현하여 수행되도록 하시오 .

[ 메뉴 : 1.친구정보입력 2.친구이름으로검색 3. 파일로저장 ]

( 프로그램 시작 시 이미 파일에 입력되어있는 정보가 있다면 그 정보를 읽어서 배열로 만들고 , 친구 정보가 새롭게 입력되면 배열의 마지막 요소 뒤로 정보가 저장되도록 한다 . 그리고 파일로 저장메뉴가 선택되면 현재 배열의 모든 친구 정보를 기존 파일의 내용을 지운 후에 저장되도록 한다 .)

2. 텍스트 파일에 여러 문장이 저장되어 있다 . 이 파일을 읽어서 파일내에 있는 단어의 개수를 출력하는 프로그램을 구현하시오 .

3. 텍스트 파일에 영어로 된 문장들이 저장되어 있다 . 이 파일을 읽어서 각 알파벳이 몇번 등장하는지 개수를 출력하는 프로그램을 구현하시오 . ( 이때 , 알파벳 ( 단일문자 ) 과 개수 ( 정수형 ) 로 구성된 구조체를 52 개 갖는 배열을 선언하여 구현하시오 .)

4. 3번에서 사용한 파일을 열어서 대문자는 소문자로 , 소문자는 대문자로 바꾸어 새로운 파일에 저장하는 프로그램을 구현하시오 .

Chapter 13메모리 관리

비트교육센터[46]

비트교육센터

변수의 기억부류 (Storage Class)

유효범위 (Scope)– 어떤 변수에 접근할 수 있는 구역 혹은 프로그램의 구역– 블록 범위 : 서로 짝이 되는 { 와 } 사이의 영역 내에서 유효한 범위– 파일 범위 : 변수가 정의된 지점으로부터 그 파일의 끝까지 유효한 범위

연결성– 외부 연결성 : 여러 파일로 구성된 프로그램의 어디서든 사용할 수 있는 것– 내부 연결성 : 그 변수가 선언된 파일 안에서만 사용할 수 있는 것– 연결성 없음 : 자신이 정의된 블록 내에서만 사용할 수 있는 것

저장기간 – 정적 저장 기간 : 변수가 프로그램이 실행되는 기간 내내 존재하는 것– 자동 저장 기간 : 변수가 정의된 블록에 프로그램 제어권이 들어왔을 때부터 블록을 빠져나갈 때 까지 존재하는 것

비트교육센터[47]

비트교육센터

자동 변수

자동 변수– 선언위치 : 특정 블록 혹은 함수의 시작 부분에 선어한다 .– 키워드 : auto – 유효범위와 연결성 : 변수가 정의된 블록에서만 그 변수에 접근할 수 있다 .– 저장기간 : 자신이 선언된 블록이나 함수에 프로그램 제어권이 들어왔을 때

생성되고 , 그 블록이나 함수가 종료되면 변수도 소멸된다 .– 종류 : 블록이나 함수의 시작 위치에 선언된 모든 지역 변수 , 형식 매개변수

자동 변수의 초기화– 프로그래머가 명시적으로 초기화하지 않으면 자동으로 초기화되지 않는다 .– 상수와 표현식 ( 이미 알려진 변수들만 포함된 표현식 ) 으로 초기화 가능하다 .

비트교육센터[48]

비트교육센터

레지스터 변수

레지스터 변수– 경우에 따라 CPU 레지스터와 같은 빠른 메모리에 저장되는 변수– 선언위치 , 유효범위와 , 저장기간 , 연결성 등과 같은 성질은 자동 변수와 같다 .

– 키워드 : register

– 형식 매개 변수도 레지스터로 선언할 수 있다 .

– 레지스터 변수의 주소는 가져올 수 없다 .

비트교육센터[49]

비트교육센터

블록 범위 정적 변수

블럭 범위를 갖는 정적 변수– 선언위치 : 자동 변수와 똑같이 블록 혹은 함수 시작부분에 선언한다 .– 키워드 : static– 유효범위 : 자동 변수와 똑같이 변수가 선언된 블록 혹은 함수 내에서만 사용할 수

있다 .– 저장기간 : 자신이 선언된 블록이나 함수에 프로그램 제어권이 들어왔을 때

생성되고 , 그 블록이나 함수가 끝난 후에도 존재하게 되며 , 프로그램이 완전히 종료될 때 소멸된다 .

– 함수의 형식 매개변수에 사용할 수 없다 .

비트교육센터[50]

비트교육센터

외부 연결 정적 변수 ( 전역변수 )

외부 연결 범위 정적 변수 ( 전역 변수 )– 선언위치 : 모든 함수의 외부에 선언한다 .– 정의 선언 키워드 : 없다 .참조 선언 키워드 extern

– 유효범위 : 프로그램을 구성하는 모든 파일에서 사용한다 .– 저장기간 : 프로그램 시작 시에 생성되고 , 프로그램 종료 시에 소멸된다 .

전역변수의 초기화– 명시적인 초기화가 없으면 자동으로 0 으로 초기화한다 .– 변수 초기화 시에 상수만 사용할 수 있다 .

비트교육센터[51]

비트교육센터

내부 연결 정적 변수 ( 전역변수 )

내부 연결 범위 정적 변수 ( 전역 변수 )– 선언위치 : 함수의 외부에 선언한다 .

– 정의 선언 키워드 : static참조 선언 키워드 extern

– 유효범위 : 변수가 선언된 위치로부터 그 파일의 끝 사이에 존재하는 함수에서 사용한다 .

– 저장기간 : 프로그램 시작 시에 생성되고 , 프로그램 종료 시에 소멸된다 .

비트교육센터[52]

비트교육센터

함수의 기억부류

외부 함수 : 다른 파일에 있는 함수가 접근할 수 있는 함수정적 함수 : 자신이 정의된 파일 내에서만 접근할 수 있는 함수

double summary (double *); //외부함수

// 자신의 파일에 summary() 함수의 정의가 존재할 수도 있고

// 다른 파일에 정의된 함수를 참조한다는 선언이 될 수도 있다 .

static double plus (double, double); // 정적함수

// 자신의 파일에서만 사용할 수 있다 .

extern double minus (double, double); //외부함수

// extern 키워드는 다른 파일에 정의된 함수를 선언할 때 사용

비트교육센터[53]

비트교육센터

메모리 동적 할당 (I)

malloc() – 힙 영역에 동적으로 메모리를 할당하는 함수– 할당하고자 하는 메모리의 크기를 매개변수로 전달– 할당 성공 반환 값 : 할당된 메모리 영역의 첫 번째 바이트의 주소를 반환– 할당 실패 반환 값 : NULL– void* 형식으로 반환이 되므로 반환 값에 명시적인 형 변환을 수행

free()– 동적으로 할당된 힙 영역의 메모리를 해제하는 함수

#include <stdio.h>

void * malloc (size_t size);

void free(void * ptr);

비트교육센터[54]

비트교육센터

메모리 동적 할당 (II)

calloc() – malloc() 함수와 같은 기능 ( 메모리 할당 ) 및 같은 반환 값을 갖는 함수– 두 개의 매개변수 ( 메모리 셀의 크기와 각 셀의 바이트 크기 ) 로 메모리 크기를 결정– 할당된 메모리의 모든 비트를 0 으로 설정

realloc()– malloc(), calloc(), realloc() 을 통하여 이미 할당된 메모리의 크기를 조절하는 함수– 원래 객체에 대한 포인터와 새로운 객체의 크기를 매개변수로 받아서 공간 할당

#include <stdio.h>

void * calloc (size_t nmemb, size_t size);

void * realloc(void * ptr, size_t size);

//calloc() 과 realloc() 으로 할당된 공간도 반드시 free() 함수로 해제해야 한다 .

비트교육센터[55]

비트교육센터

기억부류와 메모리 구조 (I)

전역 데이터 영역(Global Data Area)

힙(Heap Area)

스택(Stack Area)

모든 종류의 정적 변수 (블록범위 정적변수 , 내부연결 정적변수 , 외부연결

정적변수 )

모든 종류의 자동 변수( 지역 변수 , 형식 매개변수 )

동적으로 메모리를 할당하는 영역(malloc, calloc, realloc 에 의해 할당되는 공간 )

코드 영역(Code Area)

모든 함수의 기계 코드

비트교육센터[56]

비트교육센터

기억부류와 메모리 구조 (II)

#include <stdio.h>#include <stdlib.h>

void function1(int);void function2(int);

int x=10;int y=20;

int main(void){

int z=3;

function1(z);function2(z);

return 0;}

void function1(int c1){

int num = 40;}

void function2(int c2){

int* arr;int i;

arr = (int *)malloc(sizeof(int) * c2);

for (i=0;i<c2;i++)arr[i] = i*10;

free(arr);

비트교육센터[57]

비트교육센터

기억부류와 메모리 구조 (II)

#include <stdio.h>#include <stdlib.h>

void function1(int);void function2(int);

int x=10;int y=20;

int main(void){

int z=5;

function1(z);function2(z);

return 0;}

void function1(int c1){

int num = 40;}

void function2(int c2){

int* arr;int i;

arr = (int *)malloc(sizeof(int) * c2);

for (i=0;i<c2;i++)arr[i] = i*10;

free(arr);

비트교육센터[58]

비트교육센터

기억부류와 메모리 구조 (II)

#include <stdio.h>#include <stdlib.h>

void function1(int);void function2(int);

int x=10;int y=20;

int main(void){

int z=5;

function1(z);function2(z);

return 0;}

void function1(int c1){

int num = 40;}

void function2(int c2){

int* arr;int i;

arr = (int *)malloc(sizeof(int) * c2);

for (i=0;i<c2;i++)arr[i] = i*10;

free(arr);

비트교육센터[59]

비트교육센터

연습문제1. 자신이 호출된 횟수를 출력해주는 함수를 구현하시오 .

- 전역변수 (외부 연결 정적 변수 ) 를 쓰는 함수로 구현 - 블록범위 정적 변수를 쓰는 함수로 구현

2. 사용자로부터 입력할 문자열의 개수를 입력 받고 , 그 개수만큼 문자열을 입력 받아서 입력의 역순으로 문자열들을 출력하는 프로그램을 구현하시오 . 이 때 메모리는 동적으로 할당하도록 구현하시오 .

3. 아래와 같은 구조체로 5명의 학생의 이름과 성적을 관리하고자 한다 . typedef struct { char* name; int lectureNum; int* lectureJumsu; } 학생이름과 시험 본 과목의 개수 (2~5과목 ) 를 입력 받아서 메모리를 동적으로 할당하고 , 각 과목의 점수를 입력 받아서 저장 후 다시 출력할 수 있는 프로그램을 구현하시오 .

4. 8 좌석 * 5줄 * 3구역 으로 되어있는 영화관 예약 프로그램을 구현하시오 .( 자세한 설명은 아래를 참조하시오 .)

Chapter 14매크로와 전처리기

비트교육센터[61]

비트교육센터

전처리기

소스 코드 작성

컴파일

링크

실행파일 생성

0. 전처리 준비단계

1. 전처리 (Preprocess)

2. 컴파일 (Compile)

비트교육센터[62]

비트교육센터

#define 지시자 (I)

#define 지시자 – 매크로 상수

– 전처리기 지시자• 행의 제일 앞에 # 기호로 시작한다 .• 소스 파일 어느 곳에나 위치하며 , 위치한 곳으로부터 파일 끝까지 적용된다 .

– 매크로 (객체형 매크로 ) : 일반 상수 값을 나타내는 매크로

– 몸체 ( 교체목록 ) : 매크로 대신 교체될 문자열

– 매크로 확장 (macro expansion) : 매크로를 찾아서 몸체로 바꾸는 과정

– #undef 지시자로 #define 의 정의를 무효로 만들 수 있다 .

#define PI 3.14

전처리기 지시자 매크로 몸체 ( 교체목록 )

비트교육센터[63]

비트교육센터

#define 지시자 (II)

#define 지시자의 인수 사용 – 매크로 함수

– MULTIPLY : 매크로 ( 매크로 식별자 )

– MULTIPLY의 X,Y : 매크로 인수

– X * Y : 몸체 ( 교체목록 )

– 매크로 확장 : MULTIPLY(X,Y) 형태의 텍스트를 만나면 X * Y로 바뀌어 두수의 곱을 반환하는 함수의 기능을 하는 것과 비슷하게 된다 .

#define MULTIPLY(X,Y) X * Y

전처리기 지시자두개의 인수를 갖는 매크로

몸체 ( 교체목록 )

비트교육센터[64]

비트교육센터

#define 지시자 (III)

#define 지시자의 인수 사용 – 매크로 함수 (cont’d)

– 매크로 함수의 특징

• 자료형에 독립적이다 .

• 함수의 크기가 작아야 한다 .

• 실행 속도가 향상된다 .

비트교육센터[65]

비트교육센터

#define 지시자 (IV)

# 를 이용한 매크로 인수의 문자열화

#define MULTI_PR(X,Y) printf(“X * Y = %d\n”, (X) *( Y));

MULTI_PR(10, 20);

출력 결과 : X * Y = 200 // 흠 , 마음에 들지 않는다 . 10 * 20 = 200 이 좋겠다 .

#define MULTI_PR(X,Y) printf( #X " * " #Y " = %d\n", (X) *(Y));

문자열 안에 매크로 인수를 넣는 대신

# 과 함께 문자열 밖으로 빼어내면

매크로 인수의 실제 값으로 출력할 수 있다 .

비트교육센터[66]

비트교육센터

#define 지시자 (V)

## 를 이용한 문자열 결합

– 매크로 상수 , 매크로 함수의 몸체 부분에서 사용된다

– 두개의 토큰 ( 매크로에서의 단어 단위의 개념 ) 을 하나의 토큰으로 결합한다 .

#define VAR(X,Y) XY

int VAR(X,1) = 10;

VAR(X,1) 은 X1 이라는 변수로 사용될 듯 하다 .

X1 = 20;

그러나 사용자가 X1 변수를 사용하면 오류가 발생된다 .

#define VAR(X,Y) X##Y

## 을 이용하면 두개의 토큰을

하나의 토큰으로 결합하여 사용할 수 있다 .

비트교육센터[67]

비트교육센터

미리 정의된 매크로

매크로 의미

__DATE__ 전처리가 수행된 날짜를 “Mmm dd yyyy” 형태로 나타낸다 .

__FILE__ 현재 소스 코드 파일의 이름을 나타낸다 .

__LINE__ 현재 소스 코드 파일에 있는 행의 개수를 나타내는 정수형 상수

__TIME__ 컴파일 시각을 “ hh:mm:ss” 형태로 나타낸다 .

비트교육센터[68]

비트교육센터

#include 지시자 (I)

#include 지시자– 소스 코드 파일에 있는 #include 지시자가 발견되면 포함된 파일의 텍스트로 교체되어 그

위치에 파일의 전체 내용을 타이핑한 효과가 나타난다 .

– 주로 헤더 파일 (*.h 파일 ) 을 포함하기 위하여 사용된다 .

#include <stdio.h>

파일포함 지시자 포함될 파일 이름

#include <stdio.h> 시스템 디렉터리에서 파일을 찾는다 .

#include “myio.h” 현재 작업 디렉터리에서 파일을 찾는다 .

비트교육센터[69]

비트교육센터

#include 지시자 (II)

표준 헤더 파일 (*.h) 의 내용

– 목록 상수 (manifest constant)

– 매크로 함수 ( macro function)

– 함수 선언 (function declaration)

– 구조체 템플릿 정의 (structure template definition)

– 타입 정의 (type definition)

– 외부 연결 정적 변수 ( 여러 파일 공유 전역변수 )

– 내부 연결 정적 변수 이면서 const 로 한정된 변수 혹은 배열

그 이외의 실행코드는 소스 파일 (*.c 파일 ) 에 들어가야한다 .

비트교육센터[70]

비트교육센터

조건부 컴파일

#ifdef, #ifndef, #elif, #else, #endif 지시자

– 이들 지시자를 사용하면 조건에 맞춰 컴파일을 할 수 있다 .

– 조건에 맞추어 특정 정보 또는 코드 블록을 수행하거나 무시할 것을 컴파일러에게 지시한다 .

– 여러 헤더 파일에 대한 중복 정의를 막는다거나 프로그램 디버깅 등의 작업 시에 효과적으로 사용할 수 있다 .

Chapter 15C 라이브러리

비트교육센터[72]

비트교육센터

stdlib.h – conversion(I)

double atof ( const char * string);

string -> double 로 형변환

int atoi ( const char * string);

string -> integer 로 형변환

long atol ( const char * string);

string -> long 로 형변환

char* itoa ( int value, char * buffer, int radix);

integer -> string 로 형변환

char* ltoa ( long value, char * buffer, int radix);

long integer -> string 로 형변환

double strtod ( const char * string, char** endptr);

string -> double-precision floating point value 로 형변환

비트교육센터[73]

비트교육센터

stdlib.h – conversion(II) & 난수

long strtol ( const char * string, char** endptr, int radix);

string -> long integer 로 형변환

unsigned long strtoul ( const char * string, char** endptr, int radix);

string -> unsigned long integer 로 형변환

char * ultoa ( unsigned long value, char * buffer, int radix);

unsigned long integer -> string 로 형변환

int rand ( void )

범위가 0 부터 RAND_MAX 까지인 의사 난수 (정수 ) 값을 반환한다 .

void srand ( unsigned int seed );

난수 발생기의 초기값을 seed 로 설정한다 . srand() 보다 rand() 가 먼저 호출되면 이때는 초기값이 1이 된다 .

비트교육센터[74]

비트교육센터

stdlib.h – process control

void abort ( void );

프로그램을 비정상적으로 종료하고 오류코드를 반환한다 .

int atexit ( void (* function) (void) );

exit() 가 호출될 때 실행할 함수를 등록한다 .

void exit ( int status );

프로그램을 종료한다 .모든 스트림을 플러시하고 , 제어권을 운영체제에 돌려주고 , 종료 상태에 대해 호스트 환경에 보고한다 .

char * getenv ( const char * varname );

환경변수를 가져온다 .

int putenv ( const char * envvar );

환경변수를 설정한다 .

int system ( const char * command );

운영체제 내의 명령 혹은 프로그램을 실행한다 .

비트교육센터[75]

비트교육센터

stdlib.h – sort & search

void* lfind ( const void* key, const void* base, size_t num, size_t width, int (*fncomparison) (const void*, const void*) );

Linear Search

viud* lsearch ( const void* key, void* base, size_t num, size_t width, int (*fncomparison) (const void*, const void*) );

Linear Search

void qsort ( void* base, size_t num, size_t width, int (*fncompare) (const void*,

const void*) )

quick sort

void swab (char* src, char * dest, int num);

swab bytes

비트교육센터[76]

비트교육센터

비트교육센터[77]

비트교육센터

ctype.hint isalnum (int c); 알파벳이나 숫자일 경우에 참을 반환한다 .

int isalpha (int c); 알파벳일 경우에 참을 반환한다 .

int isblank (int c); 빈칸이거나 수평 탭일 경우에 참을 반환한다 .

int iscntrl (int c); ctrl+b 같은 제어문자일 경우에 참을 반환한다 .

int isdigit (int c); 숫자일 경우에 참을 반환한다 .

int isgraph (int c); 빈칸이 아닌 출력할 수 있는 문자일 경우에 참을 반환한다 .

int islower (int c); 소문자일 경우에 참을 반환한다 .

int isprint (int c); 출력 가능한 문자일 경우에 참을 반환한다 .

int ispunct (int c); 구두점 문자 (빈칸 , 알파벳 , 숫자를 제외한 문자 )일 경우에 참을 반환한다 .

int isspace (int c); 공백 문자일 경우에 참을 반환한다 .

int isupper (int c); 대문자일 경우에 참을 반환한다 .

int tolower (int c); 대문자일 경우에는 소문자를 , 그 외에는 그대로 반환한다 .

int toupper (int c); 소문자일 경우에는 대문자를 , 그 외에는 그대로 반환한다 .

비트교육센터[78]

비트교육센터

time.h(I)

clock_t clock (void);

프로그램이 실행된 이후부터 경과된 시간에 대해 최대 근사치를 반환한다 .

double difftime ( time_t t1, time_t t2 );

두 개의 시간 사이의 차이 (즉 , t1 – t2의 값 )을 초단위로 반환한다 .

time_t mktime ( struct tm * tmptr);

tmptr 이 가리키는 tm 타입의 구조체의 시간을 달력 시간으로 변환한다 .

time_t time ( time_t *ptr);

달력 시간을 반환하고 , ptr 이 NULL 이 아닐 경우에는 ptr 이 가리키는 위치에도 달력 시간을 대입한다 .

char * asctime ( const struct tm *tmptr );

tmptr 이 가리키는 구조체의 시간을 “ Thu Feb 25 10:00:00 2005\n\0” 형태의 문자열로 변환하고 그걸 가리키는 포인터를 반환한다 .

char * ctime ( const time_t * ptr);

ptr 이 가리키는 달력시간을 현지 시간 (local time) 으로 변환하고 그 결과를 다시 asctime() 의 결과와 같은 문자열 표기법으로 변환하여 가리킨다 .

비트교육센터[79]

비트교육센터

time.h(II)

struct tm * gmtime ( const time_t *ptr);

ptr 이 가리키는 달력 시간을 tm 구조체의 분리된 시간으로 변환하는데 , 세계 협정시로 표현하고 , 그 구조체를 가리키는 포인터를 반환한다 .

struct tm *localtime ( const time_t *ptr);

ptr 이 가리키는 달력 시간을 지역 시간의 tm 구조체로 변환하고 그 구조체를 가리키는 포인터를 반환한다 .

size_t strftime ( char *restrict s, size_t max, const char *restrict fmt, const struct tm * restrict tptr );

문자열 fmt 를 문자열 s 로 복사하는데 , fmt 안에 있는 서식 지정자를 fmt 가 가리키는 분리된 시간 구조체로 교체한다 . 최대 max 개의 문자가 s 로 복사되며 , 널문자를 제외한 복사된 문자의 개수를 반환한다 .

비트교육센터[80]

비트교육센터

math.h

double cos ( double x ); x의 코사인 값을 반환한다 .(x는 라디안 값 )

double sin ( double x );

x의 사인 값을 반환한다 . (x는 라디안 값 )

double tan ( double x );

x의 탄젠트 값을 반환한다 . (x는 라디안 값 )

double exp ( double x );

x의 지수 함수 값을 반환한다 . ( ex )

double log ( double x );

x의 자연 로그 값을 반환한다 .

double log10 ( double x );

밑수가 10 인 x 의 로그 값을 반환한다 .

double log2 ( double x );

밑수가 2인 x 의 로그 값을 반환한다 .

double pow (double x, double y)

x의 y승을 반환한다 .

double sqrt ( double x ); x의 제곱근 값을 반환한다 .

double ceil ( double x );

x보다 작지 않은 가장 작은 정수 값을 반환한다 .

double fabs ( double x ); x의 절대값을 반환한다 .

double floor ( double x );

x보다 크기 않은 가장 큰 정수 값을 반환한다 .