chapter 15 문자열

41
Chapter 15 문문문

Upload: brian

Post on 13-Jan-2016

51 views

Category:

Documents


0 download

DESCRIPTION

Chapter 15 문자열. 문자의 집합체. 문자열의 정의 일련의 문자 표기 방법 문자열 앞 뒤에 인용부호 “”를 이용 문자열 상수 문자와 문자열과의 차이. 문자열의 저장. 문자 배열의 이용 문자열 상수 “ c language ” 를 저장하는 문자열 배열 c2[] 를 선언하는 문장 정확한 배열의 크기는 문자열의 길이보다 1 이 크기 때문에 배열의 크기를 기술하지 않는 방법 문자열의 마지막 NULL 문자를 포함한 정확히 크기를 기술. char c2[] = "C language";. - PowerPoint PPT Presentation

TRANSCRIPT

Chapter 15 문자열

2

문자의 집합체 문자열의 정의

일련의 문자 표기 방법

문자열 앞 뒤에 인용부호 “”를 이용 문자열 상수

문자와 문자열과의 차이

3

문자열의 저장 문자 배열의 이용

문자열 상수 “ c language” 를 저장하는 문자열 배열 c2[] 를 선언하는 문장

정확한 배열의 크기는 문자열의 길이보다 1 이 크기 때문에 배열의 크기를 기술하지 않는 방법

문자열의 마지막 NULL 문자를 포함한 정확히 크기를 기술

char c2[] = "C language";

char c2[11] = "C language";

4

문자열의 저장 문자 배열의 이용

문자의 배열 초기 값 표현으로 대입 방법 주의할 사항은 문자 배열 마지막에 반드시 직접 NULL 문자를 넣어야 함

문자 포인터의 이용 문자열의 마지막 NULL 문자를 포함한 정확히 크기를 기술 력

char c1[] = {'C', ' ', 'l', 'a', 'n', 'g', 'u', 'a', 'g', 'e', '\0'};

char *c4 = "C language";

5

문자열 출력 문자 배열에서 각 문자를 출력

문자 포인터의 주소 값을 변경하면서 각 문자를 출력

i = 0;while(c2[i] != '\0')

printf("%c", c2[i++]);printf("\n");

i = 0;while(*(c4 + i) != '\0')

printf("%c", *(c4 + i++));printf("\n");

6

예제 소스 String.c

문자 배열 이름인 c1, cerr, c2, c3 와 문자 포인터 변수 이름인 c4 를 이용하여 문자열을 출력

7

8

문자 포인터 배열을 이용한 여러 문자열

처리하려는 문자열의 수 만큼의 문자 포인터 이용

래기드 (ragged) 배열 각 문자열의 출력

char *pary[ ] = {"AT&t", "AT&t", "Sun", "MS"};

for (i = 0; i < 4; )printf("%-8s", pary[i++]);//printf("%-8s", *(pary + i++));

printf("\n");

9

문자 포인터 배열 각 문자의 주소 값

문자열을 구성하는 각각의 문자를 출력하려면 *(*(pary + i) + j) 을 변환명세 %c 로 출력

여기서 i 는 문자열 첨자 순번이고 , j 는 i 에 해당하는 문자열의 문자 첨자 순번

printf("Sun 의 u 출력 *(*(pary + 2) + 1) = %c\n", *(*(pary + 2) + 1));

10

문자 2 차원 배열을 이용한 여러 문자열

문자 2 차원 배열 2 차원 배열의 열의 크기는 문자열 중에서 가장 긴 문자열의 길이보다 1

크게 지정 2 차원 배열의 행의 크기는 문자열의 개수로 지정

char strary[][5] = {"c", "c++", "java", "c#"};

11

문자 2 차원 배열

문자 이차원 배열 strary 를 이용하여 각 문자열을 출력하려면 strary[i]로 변환명세 %s 를 이용

문자를 출력하려면 strary[i][j] 을 변환명세 %c 로 출력

문자 2 차원 배열에서 출력

char strary[][5] = {"c", "c++", "java", "c#"};

for (i = 0; i < 4; )printf("%-8s", strary[i++]);//printf("%-8s", *(strary + i++));

printf("\n");

printf("C++ 의 앞 + 출력 strary[1][1] = %c\n", strary[1][1]);

12

예제 소스 strarray.c

문자열 배열을 문자 포인터 배열과 문자 2 차원 배열로 저장하고 , 필요한 문자열과 문자를 참조하는 프로그램

13

문자열 입출력 함수 함수 gets()

문자열을 입력하고 , 입력 받은 첫 문자의 주소 값을 반환 이 함수는 표준입력으로 enter 키를 누를 때까지 공백을 포함한 모든

문자열을 입력 입력된 문자열에는 enter 키는 넣지 않고 , 마지막에 문자열을

의미하는 NULL 문자인 \0 을 추가 함수 puts()

문자열을 출력하고 마지막 newline 을 출력하여 한 줄에 문자열을 출력

일반적으로 0 인 정수를 반환하며 , 오류가 발생하면 EOF 를 반환 기호 상수 EOF 는 헤더파일 stdio.h 파일에 정수 -1 로 정의되어

있으며 , 파일의 끝 (End Of File) 이라는 의미

char * gets(char *);int puts(char *);

14

문자열 입출력 함수 함수 gets() 를 이용한 문자열 입력

문자열을 입력 받을 적절한 문자 배열 이용 반환 주소 값을 이용하면 문자별로 참조가 가능

함수 puts() 를 이용한 문자열 출력 출력할 문자열의 첫 주소 값을 인자로 출력

char line[81];char *ptr;//gets(line);ptr = gets(line);

while (*ptr) putchar(* ptr++);

printf("\n");

char *str = " 객체지향 언어를 하나 써 보세요 ?";puts(str);

15

예제 소스 gets.c

문자열 입출력 함수 gets() 와 puts() 를 이용하여 원하는 문자열의 입출력을 확인

함수 gets() 로 받은 문자열을 함수 reverse()의 인자로 호출하여 입력 받은 문자열을 역순으로 출력

16

예제 소스 gets.c

17

파일 입출력 함수의 이용 함수 fgets()

두 번째 인자는 입력할 문자의 수이고 , 세 번째 인자는 입력될 문자열의 파일

문자열을 개행문자까지 읽어 개행문자도 함께 입력 문자열에 저장 함수 fputs()

문자열을 그대로 출력

표준 입출력 상수 stdin, stdout

여러 줄의 입력 후 출력

char * fgets(char *, int, FILE *);int fputs(const char *, FILE *);

while (fgets(line, LINENUM, stdin)) {fputs(line, stdout);

}

18

예제 소스 fgets.c

함수 fgets() 와 fputs() 를 이용하여 계속적으로 행을 입력하여 출력

같은 방식으로 함수 gets() 와 puts() 이용

19

버퍼링에 의한 문자 입출력

함수 getchar(), putchar() 라인 버퍼링 (line buffering)

입력된 자료가 버퍼에 저장되고 Enter 키를 만나야 getchar() 함수가 작동

char ch; printf(" 문자를 계속 입력하고 Enter 를 누르면 >>\n"); while ((ch=getchar()) != 'q')

putchar(ch);

20

버퍼링을 사용하지 않는 문자 입력

함수 getche() 버퍼를 이용하지 않고 문자 하나 하나를 바로 처리하는 함수 헤더파일 conio.h 파일을 첨가 버퍼를 사용하지 않으므로 문자 하나를 입력하면 바로 함수 getche() 를

실행하고 입력 문자가 ‘ q’ 가 아니면 함수 putchar() 에 의하여 문자가 바로 출력

char ch; printf("\n 문자를 누를 때마다 두 번 출력 >>\n"); while ((ch=getche()) != 'q')

putchar(ch);

21

버퍼링을 사용하지 않는 문자 입력

함수 getch() 함수 getche() 와 마찬가지로 버퍼를 사용하지 않는 입력함수 헤더파일 conio.h 파일을 첨가 입력한 문자를 화면에 보이지 않는 특성 , 입력한 문자를 출력함수로

출력하지 않으면 그 문자가 화면에 나타나질 않음

char ch; printf("\n 문자를 누를 때마다 한 번 출력 >>\n"); while ((ch=getch()) != 'q')

putchar(ch);

22

예제 소스 파일 getch.c

문자 입력함수 getchar(), getche(), getch() 의 차이를 다음 프로그램을 작성하여 이해

위 프로그램에서 세 개의 while 문의 입력으로 각각 “ getchar()q”, “getche()q”, “getch()q” 를 입력하면 무엇이 출력될 지 예상

23

문자처리 함수 관련 함수

문자처리 함수는 헤더파일 ctype.h 를 포함시켜 사용 검사 함수는 isxxx(char) 로 , 변환 함수는 toxxx(char) 로 명명 검사 함수는 0(false) 과 0 이 아닌 정수 값 (true) 을 반환하며 , 변환 함수는

변환된 문자를 반환 함수 toxxx()

함수 toupper(c) 는 c 가 영문 소문자일 때 영문 대문자로 변환하고 , c 가 소문자가 아니라면 원래 c 가 반환

마찬가지로 tolower(c) 는 각각 c 가 영문 대문자일 때 영문 소문자로 변환하고 , c 가 대문자가 아니라면 원래 c 가 반환

함수 _toxxx() 함수 _tolower(c) 와 _toupper(c) 는 c 값에 관계없이 소문자와 대문자로

변환 다음과 같이 매크로로 정의되어 있으므로 영문자가 아닌 문자를 적용하면

원하지 않는 결과가 나오므로 주의 #define _tolower(_c) ( (_c)-'A'+'a' )#define _toupper(_c) ( (_c)-'a'+'A' )

24

문자처리 함수 관련 함수

25

예제 소스 파일 ctype.c

헤더파일 ctype.h 에 있는 문자 매크로 함수 중에서 isalnum(), ispunct(), isxdigit() 를 이용하는 프로그램

다양한 문자의 한 줄을 표준입력으로 받아 모든 문자에 대하여 위 세 개의 함수를 적용하여 true, false로 출력

함수 isalnum() 을 조건 삼항자를 이용하여 출력할 문자열인 “ true”, “fasle” 가 저장된 첨자를 선택

함수 isalnum() 의 반환 값이 0 이면 “ fasle” 가 출력되고 반환 값이 0 이 아니면 “ true” 가 출력

26

문자열 함수 문자열 관련 함수

문자열 처리 라이브러리 함수는 헤더파일 string.h 에 함수 원형이 정의

문자열 처리 라이브러리 함수는 대부분 이름 str----() 로 명명 함수 strcmp()

두 문자열을 비교하는 함수 함수 strlen()

문자열에서 처음의 NULL 문자를 제외한 문자열의 길이를 반환 함수 strcpy()

앞 문자열에 처음에 뒤 문자열을 복사하여 그 복사된 문자열을 반환 함수 strcat()

앞 문자열에 뒤 문자열을 연결 (concatenate) 저장하여 , 이 연결된 문자열을 반환

함수 strtok() 앞 문자열에서 뒤 문자열에 포함되어 있는 구분자를 기준으로 토큰을

추출

27

함수 strcmp()

함수원형 두 문자열을 비교하는 함수

비교방법 전달인자인 두 문자열을 사전 (lexicographically) 상의 순서로 비교 앞과 뒤의 문자열을 사전 순서로 비교하여 앞 문자열이 먼저 나오면

음수 , 뒤 문자열이 먼저 나오면 양수 , 같으면 0 을 반환

비교 기준은 아스키 코드 값이다 . 두 문자가 같다면 계속 다음 문자를 비교하여 , 다른 문자에서 앞

문자가 작으면 음수 , 뒤 문자가 작으면 양수 , 같으면 0 을 반환 대문자가 소문자보다 아스키 코드 값이 작으므로 strcmp(“java”, “jav

A”) 는 양수를 반환

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

printf(“%d”, strcmp(“a”, “ab”)); // 음수 출력printf(“%d”, strcmp(“ab”, “a”)); // 양수 출력printf(“%d”, strcmp(“ab”, “ab”)); //0 출력

28

예제 소스 파일 strcomp.c

문자열 비교 함수 strcmp() 를 이용하여 입력된 두 행의 문자열을 비교하는 프로그램

두 문자열에서 함수 strcmp() 를 적용한 비교 결과를 출력

두 문자열을 구성하는 각 문자의 아스키 코드 값을 출력

각 문자 별로 크고 작음을 구분하여 각각 ‘ <’, ‘>’, ‘=’ 문자를 적절히 출력

29

함수 strcat()

함수 원형

앞 문자열의 마지막 NULL 문자에서부터 뒤 문자열의 NULL 문자까지 연결하여 , 앞의 문자열 주소를 반환

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

char stmt[25] = "Java is o-o ";char lang[] = "language.";printf("%s\n", strcat(stmt, lang));

30

함수 strcpy()

함수원형

앞 문자열에 처음에 뒤 문자열을 복사하여 그 복사된 문자열을 반환 앞 문자열에 처음에 뒤 문자열을 NULL 문자까지 , 최대 n 개를 복사하여 그 복사된

문자열을 반환한다 . 스

char * strcpy(char *, const char *);char * strncpy(char *, const char *, size_t n);

char stmt[30] = "Java is object oriented ";printf("%s\n", strcpy(stmt, “C”));

31

예제 소스 파일 stringfunc.c

연결 함수 strcat(), strncat() 과 복사 함수 strcpy(), strncpy()를 이용하여 함수의 기능을 살펴보는 프로그램

32

함수 strtok()

함수원형

앞 문자열에서 뒤 문자열에 포함되어 있는 구분자를 기준으로 토큰을 추출 사용방법

다음 문자열에서 구분자를 공백 문자 , 쉼표 (,) 로 토큰을 분리 "C, C++ language are best!"

분리되는 토큰 단어는 “ C”, “C++”, “language”, “are”, “best!” 5 개

char * strtok(char *, const char *);

char *delimiter = " ,";char str1[] = "C, C++ language are best!";ptoken = strtok(str1, delimiter);while ( ptoken != NULL ) {

printf("%s\n", ptoken);ptoken = strtok(NULL, delimiter);

}

33

예제 소스 파일 strtok.c

문자열 추출 함수 strtok() 의 기능을 살펴보는 프로그램

34

예제 소스 파일 strtok.c

문자열 추출 함수 strtok() 의 기능을 살펴보는 프로그램

35

명령어 줄

36

Command line argument

명령어 줄 전달인자 명령어 라인에서 입력하는 문자열을 프로그램으로 전달하는 방법이

명령어 줄 전달인자 프로그램에서 명령어 줄 전달인자는 메인함수의 인자로 기술 지금까지는 명령어 줄 전달인자를 이용하지 않았으므로 메인의

인자를 void 로 기술 프로그램에서 명령어 줄 전달인자를 받으려면 다음과 같이 메인

함수에서 두 개의 인자를 기술

메인 함수의 전달 인자 argc 는 명령어 줄에서 입력한 문자열의 수 메인 함수의 전달 인자 argv[] 는 명령어 줄에서 입력한 문자열을 전달

받는 문자 포인터 배열 여기서 주의할 점은 실행 프로그램 이름도 하나의 명령어 줄 인자에

포함된다는 사실

int main(int argc, char *argv[]){

…}

37

실행 파일 commandline

실행 파일 이름이 commandline 이고 옵션으로 red blue green 으로 , 프로그램을 실행하고 있는 명령어 줄

다음과 같은 구조로 문자열을 전달

38

예제 소스 파일 command

line.c 명령어 줄

전달인자를 이용한 프로그램

39

Visual C++ 에서 명령어 인자

명령어 인자를 설정 메뉴 Project 의 하부

메뉴 Settings… 를 눌러 다음 대화상자에서 설정

단축 키 Alt+F7 을 이용

대화상자 Project Settings 에서 탭 Debug 를 누르고 중간의 Program arguments:

하단의 입력 상자에 인자를 기술

이 입력 상자에는 실행파일 이름 뒤의 옵션만을 기술

40

프로그램 연습 프로그램 목적

10 줄 이내에 걸쳐 문장을 입력 받아 행마다 입력된 문자열에서 모든 단어를 추출해 내는 프로그램

이용함수 줄을 입력 받기 위하여 함수 gets() 를 이용하고 , 토큰을 나누기 위해서 함수 strtok() 를 이용하며 , 각각의 토큰 길이를 알기 위하여 strlen() 을 이용

다음 조건을 만족 10 줄 이하의 여러 줄에 원하는 문장을 입력하고 , 입력이 다

되었으면 새로운 줄 처음에 키 ctrl+Z, 그리고 Enter 키를 입력하면 결과가 출력 되도록 하자

토큰은 빈칸 , 쉼표 (,), 마침표 (.), 느낌표 (!) 그리고 탭 (\t) 으로 구분되는 단어로 길이와 토큰 문자열을 출력한다 .

41