230 likes | 501 Views
2007 1 학기. 15 문자열. 문자의 집합체. 문자열의 정의 일련의 문자 C 언어에서 문자열 앞 뒤에 인용부호 “”를 이용 문자와 문자열과의 차이 문자열의 저장 배열을 이용하여 문자열을 저장 문자열 상수 “ C language” 를 저장하는 문자열 배열 항상 문자열 마지막에는 NULL 문자를 넣어야 함 예제 15-1. 문자 포인터 배열의 이용. 처리하려는 문자열의 수 만큼의 문자 포인터 이용 래기드 (ragged) 배열 각 문자열의 출력 : pary[i] , *(pary +i).
E N D
2007 1학기 15 문자열
문자의 집합체 • 문자열의 정의 • 일련의 문자 • C 언어에서 문자열 앞 뒤에 인용부호 “”를 이용 • 문자와 문자열과의 차이 • 문자열의 저장 • 배열을 이용하여 문자열을 저장 • 문자열 상수 “C language”를 저장하는 문자열 배열 • 항상 문자열 마지막에는 NULL문자를 넣어야 함 • 예제 15-1 Perfect C
문자 포인터 배열의 이용 • 처리하려는 문자열의 수 만큼의 문자 포인터 이용 • 래기드(ragged) 배열 • 각 문자열의 출력 : pary[i] , *(pary +i) char *pary[ ] = {"AT&t", "AT&t", "Sun", "MS"}; for (i = 0; i < 4; ) printf("%-8s", pary[i++]); //printf("%-8s", *(pary + i++)); printf("\n"); Perfect C
문자 2차원 배열을 이용 • 문자 2차원 배열 • 2차원 배열의 열의 크기는 문자열 중에서 가장 긴 문자열의 길이보다 1 크게 지정하고, 2차원 배열의 행의 크기는 문자열의 개수로 지정 • 문자 이차원 배열 strary를 이용하여 각 문자열을 출력하려면 strary[i]로 변환 명세 %s를 이용 char strary[][5] = {"c", "c++", "java", "c#"}; for (i = 0; i < 4; ) printf("%-8s", strary[i++]); //printf("%-8s", *(strary + i++)); printf("\n"); Perfect C
예제 소스 • strarray.c • 문자열 배열을 문자 포인터 배열과 문자 2차원 배열로 저장하고, 필요한 문자열과 문자를 참조하는 프로그램 Perfect C
gets puts 함수 • 함수 gets()를 이용한 문자열 입력 • 문자열을 입력 받을 적절한 문자 배열 이용 • 반환 주소 값을 이용하면 문자별로 참조가 가능 • 함수 puts()를 이용한 문자열 출력 • 출력할 문자열의 첫 주소 값을 인자로 출력 • 여러 줄의 입력 후 출력 char line[81]; char *ptr; ptr = gets(line); while (*ptr) putchar(* ptr++); char *str = "객체지향 언어를 하나 써 보세요?"; puts(str); while ( gets(line) ) puts(line); Perfect C
파일 입출력 함수의 이용 • 함수 fgets() • 두 번째 인자는 입력할 문자의 수이고, 세 번째 인자는 입력될 문자열의 파일 • 문자열을 개행문자까지 읽어 개행문자도 함께 입력 문자열에 저장 • 함수 fputs() • 문자열을 그대로 출력 • 표준 입출력 상수 • stdin, stdout • 여러 줄의 입력 후 출력 char * fgets(char *, int, FILE *); int fputs(const char *, FILE *); while (fgets(line, LINENUM, stdin)) { fputs(line, stdout); } Perfect C
버퍼링에 의한 문자 입출력 • 함수 getchar(), putchar() • 라인 버퍼링(line buffering) • 입력된 자료가 버퍼에 저장되고 Enter 키를 만나야 getchar() 함수가 작동 char ch; printf("문자를 계속 입력하고 Enter를 누르면 >>\n"); while ((ch=getchar()) != 'q') putchar(ch); Perfect C
버퍼링을 사용하지 않는 문자 입력 • 함수 getche() • 버퍼를 이용하지 않고 문자 하나 하나를 바로 처리하는 함수 • 헤더파일 conio.h 파일을 첨가 • 버퍼를 사용하지 않으므로 문자 하나를 입력하면 바로 함수 getche()를 실행하고 입력 문자가 ‘q’가 아니면 함수 putchar()에 의하여 문자가 바로 출력 char ch; printf("\n문자를 누를 때마다 두 번 출력 >>\n"); while ((ch=getche()) != 'q') putchar(ch); Perfect C
버퍼링과 에코가 없는 문자 입력 • 함수 getch() • 함수 getche()와 마찬가지로 버퍼를 사용하지 않는 입력함수 • 헤더파일 conio.h 파일을 첨가 • 입력한 문자를 화면에 보이지 않는 특성, 입력한 문자를 출력함수로 출력하지 않으면 그 문자가 화면에 나타나질 않음 char ch; printf("\n문자를 누를 때마다 한 번 출력 >>\n"); while ((ch=getch()) != 'q') putchar(ch); Perfect C
문자처리 함수 • 관련 함수 • 문자처리 함수는 헤더파일 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' ) Perfect C
문자열 함수 • 문자열 관련 함수 • 문자열 처리 라이브러리 함수는 헤더파일 string.h에 함수 원형이 정의 • 문자열 처리 라이브러리 함수는 대부분 이름 str----()로 명명 • 함수 strcmp() • 두 문자열을 비교하는 함수 • 함수 strlen() • 문자열에서 처음의 NULL 문자를 제외한 문자열의 길이를 반환 • 함수 strcpy() • 앞 문자열에 처음에 뒤 문자열을 복사하여 그 복사된 문자열을 반환 • 함수 strcat() • 앞 문자열에 뒤 문자열을 연결(concatenate) 저장하여, 이 연결된 문자열을 반환 • 함수 strtok() • 앞 문자열에서 뒤 문자열에 포함되어 있는 구분자를 기준으로 토큰을 추출 Perfect C
함수 strcmp() • 함수원형 • 두 문자열을 비교하는 함수 • 비교방법 • 전달인자인 두 문자열을 사전(lexicographically) 상의 순서로 비교 • 앞과 뒤의 문자열을 사전 순서로 비교하여 앞 문자열이 먼저 나오면 음수, 뒤 문자열이 먼저 나오면 양수, 같으면 0을 반환 • 비교 기준은 아스키 코드 값 • 두 문자가 같다면 계속 다음 문자를 비교하여, 다른 문자에서 앞 문자가 작으면 음수, 뒤 문자가 작으면 양수, 같으면 0을 반환 • strcmp(“java”, “javA”)는 양수를 반환 • 대문자가 소문자보다 아스키 코드 값이 작으므로 int strcmp(const char *, const char *); printf(“%d”, strcmp(“a”, “ab”)); //음수 출력 printf(“%d”, strcmp(“ab”, “a”)); //양수 출력 printf(“%d”, strcmp(“ab”, “ab”)); //0 출력 Perfect C
함수 strcat() • 함수 원형 • 앞 문자열의 마지막 NULL 문자에서부터 뒤 문자열의 NULL 문자까지 연결하여, 앞의 문자열 주소를 반환 char * strcat(char *, const char *); char stmt[25] = "Java is o-o "; char lang[] = "language."; printf("%s\n", strcat(stmt, lang)); Perfect C
함수 strcpy() • 함수원형 • 앞 문자열에 처음에 뒤 문자열을 복사하여 그 복사된 문자열을 반환 • 앞 문자열에 처음에 뒤 문자열을 NULL 문자까지, 최대 n개를 복사하여 그 복사된 문자열을 반환 : 예제 15-8 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”)); Perfect C
함수 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); } Perfect C
도스 프롬프트에서 실행 명령어 줄 Perfect C
Command line argument • 명령어 줄 전달인자 • 명령어 라인에서 입력하는 문자열을 프로그램으로 전달하는 방법이 명령어 줄 전달인자 • 명령어 줄 전달인자를 이용하지 않는다면 메인의 인자를 void로 기술 • 메인 함수의 전달 인자 argc는 명령어 줄에서 입력한 문자열의 수 • 메인 함수의 전달 인자 argv[]는 명령어 줄에서 입력한 문자열을 전달 받는 문자 포인터 배열 int main(int argc, char *argv[]) { … } Perfect C
Visual C++에서 명령어 인자 • 명령어 인자를 설정 • 메뉴 Project의 하부 메뉴 Settings…를 눌러 다음 대화상자에서 설정 • 단축 키 Alt+F7을 이용 • 대화상자 Project Settings에서 탭 Debug를 누르고 중간의 Program arguments: • 하단의 입력 상자에 인자를 기술 • 이 입력 상자에는 실행파일 이름 뒤의 옵션만을 기술 Perfect C
프로그래밍 실습 • 프로그램 목적 • 10줄 이내에 걸쳐 문장을 입력 받아 행마다 입력된 문자열에서 모든 단어를 추출해 내는 프로그램 • 이용함수 • 줄을 입력 받기 위하여 함수 gets()를 이용하고, • 토큰을 나누기 위해서 함수 strtok()를 이용하며, • 각각의 토큰 길이를 알기 위하여 strlen()을 이용 • 다음 조건을 만족 • 10줄 이하의 여러 줄에 원하는 문장을 입력하고, • 입력이 다 되었으면 새로운 줄 처음에 키 ctrl+Z, • 그리고 Enter 키를 입력하면 결과가 출력 • 토큰은 빈칸, 쉼표(,), 마침표(.), 느낌표(!) 그리고 탭(\t)으로 구분되는 단어로 길이와 토큰 문자열을 출력 Perfect C
소스와 결과 Perfect C
프로그래밍 과제 • 실습 : 문자처리 실습 15-6, 15-7, 노트 17쪽-21쪽 • 과제 6월 11일(월)까지 프로그래밍하여 제출할 것 • 15장 552쪽 3, 554쪽 3, 4, 8 Perfect C