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